From: Anas Nashif Date: Mon, 5 Nov 2012 19:16:30 +0000 (-0800) Subject: Imported Upstream version 3.82 X-Git-Tag: upstream/3.82^0 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Fmake.git;a=commitdiff_plain;h=9789b4dba120180760ec948089fc98ebab6eb28b Imported Upstream version 3.82 --- 9789b4dba120180760ec948089fc98ebab6eb28b diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 0000000..2f50c66 --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,768 @@ +Notes on the Free Translation Project +************************************* + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +Quick configuration advice +========================== + +If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is _not_ required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will respectively bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, +and `CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your country by running the command +`locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +Translating Teams +================= + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" +area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of January +2004. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es + +----------------------------------------------------+ + a2ps | [] [] [] [] | + aegis | () | + ant-phone | () | + anubis | | + ap-utils | | + aspell | [] | + bash | [] [] [] [] | + batchelor | | + bfd | [] [] | + binutils | [] [] | + bison | [] [] [] | + bluez-pin | [] [] [] | + clisp | | + clisp | [] [] [] | + console-tools | [] [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + darkstat | [] () [] | + diffutils | [] [] [] [] [] [] [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] [] | + error | [] [] [] [] [] | + fetchmail | [] () [] [] [] [] | + fileutils | [] [] [] | + findutils | [] [] [] [] [] [] [] | + flex | [] [] [] [] | + fslint | | + gas | [] | + gawk | [] [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] [] | + gettext | [] [] [] [] [] | + gettext-examples | [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] [] | + gimp-print | [] [] [] [] [] | + gliv | | + glunarclock | [] [] | + gnubiff | [] | + gnucash | [] () [] [] | + gnucash-glossary | [] () [] | + gnupg | [] () [] [] [] [] | + gpe-aerial | [] | + gpe-beam | [] [] | + gpe-calendar | [] [] | + gpe-clock | [] [] | + gpe-conf | [] [] | + gpe-contacts | [] [] | + gpe-edit | [] | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] | + gpe-taskmanager | [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | [] [] | + gphoto2 | [] [] [] [] | + gprof | [] [] [] | + gpsdrive | () () () | + gramadoir | [] | + grep | [] [] [] [] [] [] | + gretl | [] | + gtick | [] () | + hello | [] [] [] [] [] [] | + id-utils | [] [] | + indent | [] [] [] [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] | + iso_3166_1 | [] [] [] [] [] [] | + iso_3166_2 | | + iso_3166_3 | [] | + iso_4217 | [] [] [] [] | + iso_639 | | + jpilot | [] [] [] | + jtag | | + jwhois | [] | + kbd | [] [] [] [] [] | + latrine | () | + ld | [] [] | + libc | [] [] [] [] [] [] | + libgpewidget | [] [] | + libiconv | [] [] [] [] [] | + lifelines | [] () | + lilypond | [] | + lingoteach | | + lingoteach_lessons | () () | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailutils | [] [] | + make | [] [] [] | + man-db | [] () [] [] () | + minicom | [] [] [] | + mysecretdiary | [] [] [] | + nano | [] () [] [] [] | + nano_1_0 | [] () [] [] [] | + opcodes | [] | + parted | [] [] [] [] [] | + ptx | [] [] [] [] [] | + python | | + radius | [] | + recode | [] [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] | + sed | [] [] [] [] [] [] | + sh-utils | [] [] [] | + shared-mime-info | | + sharutils | [] [] [] [] [] [] | + silky | () | + skencil | [] () [] | + sketch | [] () [] | + soundtracker | [] [] [] | + sp | [] | + tar | [] [] [] [] | + texinfo | [] [] [] | + textutils | [] [] [] [] | + tin | () () | + tp-robot | | + tuxpaint | [] [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] [] | + vorbis-tools | [] [] [] [] | + wastesedge | () | + wdiff | [] [] [] [] | + wget | [] [] [] [] [] [] | + xchat | [] [] [] [] | + xfree86_xkb_xml | [] [] | + xpad | [] | + +----------------------------------------------------+ + af am ar az be bg bs ca cs da de el en en_GB eo es + 4 0 0 1 9 4 1 40 41 60 78 17 1 5 13 68 + + et eu fa fi fr ga gl he hr hu id is it ja ko lg + +-------------------------------------------------+ + a2ps | [] [] [] () () | + aegis | | + ant-phone | [] | + anubis | [] | + ap-utils | [] | + aspell | [] [] | + bash | [] [] | + batchelor | [] [] | + bfd | [] | + binutils | [] [] | + bison | [] [] [] [] | + bluez-pin | [] [] [] [] [] | + clisp | | + clisp | [] | + console-tools | | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] [] | + darkstat | () [] [] [] | + diffutils | [] [] [] [] [] [] [] | + e2fsprogs | | + enscript | [] [] | + error | [] [] [] [] | + fetchmail | [] | + fileutils | [] [] [] [] [] [] | + findutils | [] [] [] [] [] [] [] [] [] [] [] | + flex | [] [] [] | + fslint | [] | + gas | [] | + gawk | [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] | + gettext | [] [] [] | + gettext-examples | [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] [] | + gimp-print | [] [] | + gliv | () | + glunarclock | [] [] [] [] | + gnubiff | [] | + gnucash | () [] | + gnucash-glossary | [] | + gnupg | [] [] [] [] [] [] [] | + gpe-aerial | [] | + gpe-beam | [] | + gpe-calendar | [] [] [] | + gpe-clock | [] | + gpe-conf | [] | + gpe-contacts | [] [] | + gpe-edit | [] [] | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] [] | + gpe-sketchbook | [] | + gpe-su | [] | + gpe-taskmanager | [] | + gpe-timesheet | [] [] [] | + gpe-today | [] [] | + gpe-todo | [] [] | + gphoto2 | [] [] [] | + gprof | [] [] | + gpsdrive | () () () | + gramadoir | [] [] | + grep | [] [] [] [] [] [] [] [] [] [] [] | + gretl | [] [] | + gtick | [] [] [] | + hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] | + indent | [] [] [] [] [] [] [] [] [] | + iso_3166 | [] [] [] [] [] [] [] | + iso_3166_1 | [] [] [] [] [] | + iso_3166_2 | | + iso_3166_3 | | + iso_4217 | [] [] [] [] [] [] | + iso_639 | | + jpilot | [] () | + jtag | [] | + jwhois | [] [] [] [] | + kbd | [] | + latrine | [] | + ld | [] | + libc | [] [] [] [] [] [] | + libgpewidget | [] [] [] [] | + libiconv | [] [] [] [] [] [] [] [] [] | + lifelines | () | + lilypond | [] | + lingoteach | [] [] | + lingoteach_lessons | | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailutils | | + make | [] [] [] [] [] [] | + man-db | () () | + minicom | [] [] [] [] | + mysecretdiary | [] [] | + nano | [] [] [] [] | + nano_1_0 | [] [] [] [] | + opcodes | [] | + parted | [] [] [] | + ptx | [] [] [] [] [] [] [] | + python | | + radius | [] | + recode | [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] | + sed | [] [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] [] [] [] [] | + shared-mime-info | [] [] [] | + sharutils | [] [] [] [] [] | + silky | () [] () () | + skencil | [] | + sketch | [] | + soundtracker | [] [] | + sp | [] () | + tar | [] [] [] [] [] [] [] [] [] | + texinfo | [] [] [] [] | + textutils | [] [] [] [] [] [] | + tin | [] () | + tp-robot | [] | + tuxpaint | [] [] [] [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux | [] [] [] [] () [] | + vorbis-tools | [] | + wastesedge | () | + wdiff | [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] | + xchat | [] [] [] | + xfree86_xkb_xml | [] [] | + xpad | [] [] | + +-------------------------------------------------+ + et eu fa fi fr ga gl he hr hu id is it ja ko lg + 22 2 1 26 106 28 24 8 10 41 33 1 26 33 12 0 + + lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru + +-----------------------------------------------------+ + a2ps | [] [] () () [] [] [] | + aegis | () () () | + ant-phone | [] [] | + anubis | [] [] [] [] [] [] | + ap-utils | [] () [] | + aspell | [] | + bash | [] [] [] | + batchelor | [] | + bfd | [] | + binutils | [] | + bison | [] [] [] [] [] | + bluez-pin | [] [] [] | + clisp | | + clisp | [] | + console-tools | [] | + coreutils | [] [] | + cpio | [] [] [] [] [] | + darkstat | [] [] [] [] | + diffutils | [] [] [] [] [] [] | + e2fsprogs | [] | + enscript | [] [] [] [] | + error | [] [] [] | + fetchmail | [] [] () [] | + fileutils | [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] [] [] | + fslint | [] [] | + gas | | + gawk | [] [] [] | + gbiff | [] [] | + gcal | | + gcc | | + gettext | [] [] [] | + gettext-examples | [] [] [] | + gettext-runtime | [] [] [] [] | + gettext-tools | [] [] | + gimp-print | [] | + gliv | [] [] [] | + glunarclock | [] [] [] [] | + gnubiff | [] | + gnucash | [] [] () [] | + gnucash-glossary | [] [] | + gnupg | [] | + gpe-aerial | [] [] [] [] | + gpe-beam | [] [] [] [] | + gpe-calendar | [] [] [] [] | + gpe-clock | [] [] [] [] | + gpe-conf | [] [] [] [] | + gpe-contacts | [] [] [] [] | + gpe-edit | [] [] [] [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] [] | + gpe-ownerinfo | [] [] [] [] | + gpe-sketchbook | [] [] [] [] | + gpe-su | [] [] [] [] | + gpe-taskmanager | [] [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] [] [] [] | + gphoto2 | [] | + gprof | [] [] | + gpsdrive | () () [] | + gramadoir | () [] | + grep | [] [] [] [] [] | + gretl | | + gtick | [] [] [] | + hello | [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] | + indent | [] [] [] [] | + iso_3166 | [] [] [] | + iso_3166_1 | [] [] | + iso_3166_2 | | + iso_3166_3 | [] | + iso_4217 | [] [] [] [] [] [] [] [] | + iso_639 | [] | + jpilot | () () | + jtag | | + jwhois | [] [] [] [] () | + kbd | [] [] [] | + latrine | [] | + ld | | + libc | [] [] [] [] | + libgpewidget | [] [] [] | + libiconv | [] [] [] [] [] | + lifelines | | + lilypond | | + lingoteach | | + lingoteach_lessons | | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailutils | [] [] [] | + make | [] [] [] [] | + man-db | [] | + minicom | [] [] [] [] | + mysecretdiary | [] [] [] | + nano | [] [] [] [] [] | + nano_1_0 | [] [] [] [] [] [] | + opcodes | [] [] | + parted | [] [] [] [] | + ptx | [] [] [] [] [] [] [] [] | + python | | + radius | [] [] | + recode | [] [] [] [] | + rpm | [] [] [] | + screem | | + scrollkeeper | [] [] [] [] [] | + sed | [] [] [] | + sh-utils | [] [] | + shared-mime-info | [] [] | + sharutils | [] [] | + silky | () | + skencil | [] [] | + sketch | [] [] | + soundtracker | | + sp | | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] [] | + textutils | [] [] | + tin | | + tp-robot | [] | + tuxpaint | [] [] [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] | + vorbis-tools | [] [] [] | + wastesedge | | + wdiff | [] [] [] [] [] | + wget | [] [] [] | + xchat | [] [] [] | + xfree86_xkb_xml | [] [] | + xpad | [] [] | + +-----------------------------------------------------+ + lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru + 1 2 0 3 12 0 10 69 6 7 1 40 26 36 76 63 + + sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu + +-----------------------------------------------------+ + a2ps | [] [] [] [] | 16 + aegis | | 0 + ant-phone | | 3 + anubis | [] [] | 9 + ap-utils | () | 3 + aspell | | 4 + bash | | 9 + batchelor | | 3 + bfd | [] [] | 6 + binutils | [] [] [] | 8 + bison | [] [] | 14 + bluez-pin | [] [] [] | 14 + clisp | | 0 + clisp | | 5 + console-tools | | 3 + coreutils | [] [] [] [] | 16 + cpio | [] [] | 14 + darkstat | [] [] [] () () | 12 + diffutils | [] [] [] | 23 + e2fsprogs | [] [] | 6 + enscript | [] [] | 12 + error | [] [] [] | 15 + fetchmail | [] [] | 11 + fileutils | [] [] [] [] [] | 17 + findutils | [] [] [] [] [] [] | 29 + flex | [] [] | 13 + fslint | | 3 + gas | [] | 3 + gawk | [] [] | 12 + gbiff | | 4 + gcal | [] [] | 4 + gcc | [] | 4 + gettext | [] [] [] [] [] | 16 + gettext-examples | [] [] [] [] [] | 14 + gettext-runtime | [] [] [] [] [] [] [] [] | 22 + gettext-tools | [] [] [] [] [] [] | 14 + gimp-print | [] [] | 10 + gliv | | 3 + glunarclock | [] [] [] | 13 + gnubiff | | 3 + gnucash | [] [] | 9 + gnucash-glossary | [] [] [] | 8 + gnupg | [] [] [] [] | 17 + gpe-aerial | [] | 7 + gpe-beam | [] | 8 + gpe-calendar | [] [] [] [] | 13 + gpe-clock | [] [] [] | 10 + gpe-conf | [] [] | 9 + gpe-contacts | [] [] [] | 11 + gpe-edit | [] [] [] [] [] | 12 + gpe-go | | 5 + gpe-login | [] [] [] [] [] | 13 + gpe-ownerinfo | [] [] [] [] | 13 + gpe-sketchbook | [] [] | 9 + gpe-su | [] [] [] | 10 + gpe-taskmanager | [] [] [] | 10 + gpe-timesheet | [] [] [] [] | 12 + gpe-today | [] [] [] [] [] | 13 + gpe-todo | [] [] [] [] | 12 + gphoto2 | [] [] [] | 11 + gprof | [] [] | 9 + gpsdrive | [] [] | 3 + gramadoir | [] | 5 + grep | [] [] [] [] | 26 + gretl | | 3 + gtick | | 7 + hello | [] [] [] [] [] | 34 + id-utils | [] [] | 12 + indent | [] [] [] [] | 21 + iso_3166 | [] [] [] [] [] [] [] | 27 + iso_3166_1 | [] [] [] | 16 + iso_3166_2 | | 0 + iso_3166_3 | | 2 + iso_4217 | [] [] [] [] [] [] | 24 + iso_639 | | 1 + jpilot | [] [] [] [] [] | 9 + jtag | [] | 2 + jwhois | () [] [] | 11 + kbd | [] [] | 11 + latrine | | 2 + ld | [] [] | 5 + libc | [] [] [] [] | 20 + libgpewidget | [] [] [] [] | 13 + libiconv | [] [] [] [] [] [] [] [] | 27 + lifelines | [] | 2 + lilypond | [] | 3 + lingoteach | | 2 + lingoteach_lessons | () | 0 + lynx | [] [] [] | 14 + m4 | [] [] | 15 + mailutils | | 5 + make | [] [] [] | 16 + man-db | [] | 5 + minicom | | 11 + mysecretdiary | [] [] | 10 + nano | [] [] [] [] | 17 + nano_1_0 | [] [] [] | 17 + opcodes | [] [] | 6 + parted | [] [] [] | 15 + ptx | [] [] | 22 + python | | 0 + radius | | 4 + recode | [] [] [] | 20 + rpm | [] [] | 9 + screem | [] [] | 2 + scrollkeeper | [] [] [] | 15 + sed | [] [] [] [] [] [] | 24 + sh-utils | [] [] | 14 + shared-mime-info | [] [] | 7 + sharutils | [] [] [] [] | 17 + silky | () | 3 + skencil | [] | 6 + sketch | [] | 6 + soundtracker | [] [] | 7 + sp | [] | 3 + tar | [] [] [] [] [] | 24 + texinfo | [] [] [] | 14 + textutils | [] [] [] [] | 16 + tin | | 1 + tp-robot | | 2 + tuxpaint | [] [] [] [] [] | 29 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux | [] [] | 15 + vorbis-tools | | 8 + wastesedge | | 0 + wdiff | [] [] [] | 18 + wget | [] [] [] [] [] [] [] [] | 24 + xchat | [] [] [] [] [] | 15 + xfree86_xkb_xml | [] [] [] [] [] | 11 + xpad | | 5 + +-----------------------------------------------------+ + 63 teams sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu + 131 domains 47 19 28 83 0 0 59 13 1 1 11 0 22 22 0 1373 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If January 2004 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. + +Using `gettext' in new packages +=============================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`translation@iro.umontreal.ca' to make the `.pot' files available to +the translation teams. + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..8de80e6 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,83 @@ +----------------------------------- + +GNU make development up to version 3.75 by: + Roland McGrath + + +Development starting with GNU make 3.76 by: + Paul D. Smith + + Additional development starting with GNU make 3.81 by: + Boris Kolpackov + + +GNU Make User's Manual + Written by: + Richard M. Stallman + + Edited by: + Roland McGrath + Bob Chassell + Melissa Weisshaus + Paul D. Smith + +----------------------------------- +GNU make porting efforts: + + Port to VMS by: + Klaus Kaempf + Hartmut Becker + Archive support/Bug fixes by: + John W. Eaton + Martin Zinser + + Port to Amiga by: + Aaron Digulla + + Port to MS-DOS (DJGPP), OS/2, and MS-Windows (native/MinGW) by: + DJ Delorie + Rob Tulloh + Eli Zaretskii + Jonathan Grant + Andreas Beuning + Earnie Boyd + +----------------------------------- +Other contributors: + + Janet Carson + Howard Chu + Paul Eggert + Klaus Heinz + Michael Joosten + Jim Kelton + David Lubbren + Tim Magill + Markus Mauhart + Greg McGary + Thomas Riedl + Han-Wen Nienhuys + Andreas Schwab + Carl Staelin (Princeton University) + Ian Stewartson (Data Logic Limited) + Ramon Garcia Fernandez + +With suggestions/comments/bug reports from a cast of ... well ... +hundreds, anyway :) + +------------------------------------------------------------------------------- +Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, +2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..d135d1c --- /dev/null +++ b/ChangeLog @@ -0,0 +1,4018 @@ +2010-07-28 Paul Smith + + Version 3.82 released. + + * configure.in: Change release version. + * NEWS: Change the date. + + * read.c (parse_file_seq): Remove GLOB_NOSORT for + backward-compatibility. We'll add it back in next release. + * NEWS: Note it. + +2010-07-24 Eli Zaretskii + + * job.c (pid2str) [WINDOWS32]: Fix CPP conditionals for using %Id + format. + +2010-07-18 Paul Smith + + * configure.in: Switch bsd_signal to AC_CHECK_DECLS() to make sure + we have a declaration. Fixes Savannah bug #25713 (maybe?) + * doc/make.texi (Complex Makefile): Cleanup variable assignments. + (One Shell): New subsection for the .ONESHELL special target. + + Patches by Ozkan Sezer : + + * misc.c (strncasecmp): Local implementation for systems without. + * config.h.W32.template (HAVE_STRNICMP): Define on Windows. + * configure.in: Check for strncasecmp/strncmpi/strnicmp. + * job.c [WINDOWS32]: Don't define dup2 on Windows. + (pid2str): Use "%Id" even with MSVC + (exec_command): Cast to pid_t when calling pid2str(). + * w32/subproc/sub_proc.c [WINDOWS32]: Include config.h first. + Use stddef.h on MSVC to get intptr_t. + * w32/subproc/misc.c [WINDOWS32]: Include config.h first. + * w32/compat/dirent.c [WINDOWS32]: Include config.h first. + (readdir): Cast -1 to correct type for d_ino. + * w32/pathstuff.c [WINDOWS32]: Ensure make.h is included first. + * make.h [WINDOWS32]: Don't prototype alloca() on Windows. + Add configuration for strncasecmp(). + * main.c (ADD_SIG) [WINDOWS32]: Avoid warnings in MSVC. + * config.h.W32.template [WINDOWS32]: Don't warn on unsafe + functions or variables. + * NMakefile.template [WINDOWS32]: Remove /MACHINE:I386. + * main.c (clean_jobserver): Cast due to MSVC brokenness. + (decode_switches): Ditto. + * vpath.c (construct_vpath_list): Ditto. + * rule.c (freerule): Ditto. + * ar.c (ar_glob): Ditto. + +2010-07-16 Boris Kolpackov + + * misc.c (concat): Fix buffer overrun. + +2010-07-12 Paul Smith + + Update copyrights to add 2010. + + * build_w32.bat: Support for MSVC Windows x86_64 builds. + * job.c: Don't define execve() on MSVC/64bit. + Patch by Viktor Szakats. Fixes Savannah bug #27590. + +2010-07-12 Eli Zaretskii + + * make.h (alloca) [!__GNUC__]: Don't define prototype. + (int w32_kill): Use pid_t for process ID argument. + Fixes Savannah bug #27809. + +2010-07-12 Paul Smith + + Integrated new .ONESHELL feature. + Patch by David Boyce . Modified by me. + + * NEWS: Add a note about the new feature. + * job.c (is_bourne_compatible_shell): Determine whether we're + using a standard POSIX shell or not. + (start_job_command): Accept '-ec' as POSIX shell flags. + (construct_command_argv_internal): If one_shell is set and we are + using a POSIX shell, remove "interior" prefix characters such as + "@", "+", "-". Also treat "\n" as a special character when + choosing the slow path, if ONESHELL is set. + * job.h (is_bourne_compatible_argv): Define the new function. + + * make.h (one_shell): New global variable to remember setting. + * main.c: Declare it. + * read.c (record_files): Set it. + * commands.c (chop_commands): If one_shell is set, don't chop + commands into multiple lines; just keep one line. + +2010-07-09 Eli Zaretskii + + * w32/subproc/sub_proc.c: Include stdint.h. + (sub_process_t): Use intptr_t for file handles and pid_t for + process ID. + (process_pipes, process_init_fd, process_begin): Use intptr_t for + file handles and pid_t for process ID. Fixes Savannah bug #27809. + Patch by Ozkan Sezer + + * function.c (abspath): Support absolute file names in UNC format. + Fixes Savannah bug #30312. + + * job.c (pid2str) [WINDOWS32]: Don't use %Id with GCC < 4.x. + (exec_command) [WINDOWS32]: Use pid2str instead of non-portable + %Id. + + * main.c (handle_runtime_exceptions): Use %p to print addresses, + to DTRT on both 32-bit and 64-bit hosts. Savannah bug #27809. + + * job.c (w32_kill, start_job_command, create_batch_file): Use + pid_t for process IDs and intptr_t for the 1st arg of + _open_osfhandle. + * function.c (windows32_openpipe): Use pid_t for process IDs and + intptr_t for the 1st arg of _open_osfhandle. + (func_shell): Use pid_t for process IDs. + * main.c (main) [WINDOWS32]: Pacify the compiler. + * config.h.W32.template (pid_t): Add a definition for 64-bit + Windows builds that don't use GCC. Fixes Savannah bug #27809. + Patch by Ozkan Sezer + +2010-07-07 Paul Smith + + * configure.in: Bump to a new prerelease version 3.81.91. + +2010-07-06 Paul Smith + + * main.c (main): Set a default value of "-c" for .SHELLFLAGS. + * NEWS: Mention the new behavior of .POSIX and the new .SHELLFLAGS + variable. + * job.c (construct_command_argv): Retrieve the .SHELLFLAGS value + and pass it to construct_command_argv_internal(). + (construct_command_argv_internal): If .SHELLFLAGS is non-standard + use the slow path. Use that value instead of hard-coded "-c". + +2010-07-05 Paul Smith + + * implicit.c (pattern_search): lastslash can be const. + * dir.c (downcase): Remove unused variable. + * hash.c (hash_init): Cast sizeof for error message. + * arscan.c (ar_scan): Cast to char* for WINDOWS32. + (ar_member_touch): Ditto. + * ar.c (glob_pattern_p): Avoid symbol collision: open -> opened + * signame.c (strsignal): Ditto: signal -> sig + * job.c (create_batch_file): Ditto: error -> error_string + (pid2str): Portably convert a pid_t into a string + (reap_children): Use it. + (start_waiting_job): Use it. + Savannah bug #27809. Patch by Ozkan Sezer + +2010-07-03 Paul Smith + + * read.c (parse_file_seq): All archive groups must end with ')' as + the LAST character in a word. If there is no word ending in ')' + then it's not an archive group. Fixes Savannah bug #28525. + +2010-07-01 Paul Smith + + * main.c (main): Append optional features using separate calls. + Not as efficient but not all compilers allow conditionals inside + macro calls. Fixes Savannah bug #29244. + +2010-01-10 Paul Smith + + * make.h (patheq): Rename strieq() to patheq() for clarity. + * dir.c (dir_contents_file_exists_p): Use it. + + * dir.c (file_impossible): Convert xmalloc/memset to xcalloc. + * file.c (enter_file): Ditto. + * job.c (new_job): Ditto. + +2009-12-11 Eli Zaretskii + + * job.c (construct_command_argv_internal) + [WINDOWS32]: Add "echo." and a few more commands that are built + into cmd.exe. Fixes Savannah bug #28126. + + * file.c (lookup_file) [HAVE_DOS_PATHS]: Treat '\\' like we do + with '/'. + +2009-11-15 Paul Smith + + Patches for VMS provided by Hartmut Becker + + * vmsjobs.c (ctrlYPressed) [VMS]: Deal with CTRL-Y. + (vmsHandleChildTerm) [VMS]: Ditto. + (astYHandler) [VMS]: Ditto. + (tryToSetupYAst) [VMS]: Ditto. + (child_execute_job) [VMS]: Ditto. + + * vmsify.c (trnlog) [VMS]: Fix const errors. + (vmsify) [VMS]: Ditto. + + * readme.vms [VMS]: Update with notes for 3.82. + + * job.h (comname) [VMS]: Remember the temporary command filename + + * dir.c (vmsify) [VMS]: Fix const errors. + (vms_hash) [VMS]: Ditto. + (vmsstat_dir) [VMS]: Ditto. + (find_directory) [VMS]: Fix case-insensitive option for VMS + (dir_contents_file_exists_p) [VMS]: Ditto. + (file_impossible) [VMS]: Ditto. + + * config.h-vms.template (HAVE_FDOPEN) [VMS]: Have it. + (HAVE_STRCASECMP) [VMS]: Ditto. + + * arscan.c (VMS_get_member_info) [VMS]: Fix timezone computation. + (ar_scan) [VMS]: Fix const error. + +2009-11-12 Boris Kolpackov + + * vpath.c (vpath_search, selective_vpath_search): Add index arguments + which allows the caller to get the index of the matching directory. + + * make.h (vpath_search): Update prototype. + + * remake.c (library_search): Implement linker-compatible library + search. Use the new VPATH_SEARCH index functionality to keep track + of the directory index for each match. Select the match with the + lowest directory index. + + * implicit.c (pattern_search): Pass NULL for the index arguments in + the VPATH_SEARCH call. + + * doc/make.texi (Directory Search for Link Libraries): Describe the + new search behavior. + + * NEWS: Add a note about the new behavior. + +2009-10-25 Paul Smith + + * AUTHORS, et.al.: Update copyright years. + + * implicit.c (stemlen_compare): Fix qsort() compare bug that + caused implicit rules with equal stem lengths to be sorted + indeterminately. + +2009-10-24 Paul Smith + + * main.c (usage): Add --eval to the usage string. + (switches): Add the --eval switch. + (main): If --eval is given, add them to the simply-expanded variable + -*-eval-flags-*- (necessary to allow recursion to work properly). + (define_makeflags): Add -*-eval-flags-*- to MAKEFLAGS. + + * NEWS: Describe the new --eval command line argument. + * doc/make.texi (Options Summary): Document --eval. + + * dep.h: eval_buffer() returns void. + * read.c (eval_buffer): Ditto. + (eval): Ditto. + + * variable.h (define_variable_cname): New macro for constant + variable names. + * default.c (set_default_suffixes): Use it. + * main.c (main): Ditto. + (handle_non_switch_argument): Ditto. + (define_makeflags): Ditto. + * read.c (read_all_makefiles): Ditto. + * variable.c (define_automatic_variables): Ditto. + + * commands.c (dep_hash_cmp): Avoid casts. + (dep_hash_1): Ditto. + (dep_hash_2): Ditto. + +2009-10-22 Boris Kolpackov + + * read.c (read_all_makefiles): Mark the default makefile dependency + dontcare. + +2009-10-07 Boris Kolpackov + + * read.c (do_undefine): Free the expanded variable name. + + * commands.c (dep_hash_cmp, set_file_variables): Move the order-only + to normal upgrade logic from dep_hash_cmp to set_file_variables. + +2009-10-06 Boris Kolpackov + + * dep.h (uniquize_deps): Remove. + + * read.c (uniquize_deps): Merge into set_file_variables in + commands.c. + (dep_hash_1, dep_hash_2, dep_hash_cmp): Move to commands.c. + + * commands.c (set_file_variables): Avoid modifying the dep + chain to achieve uniqueness. Fixes savannah bug 25780. + + * implicit.c (pattern_search): Instead of re-setting all automatic + variables for each rule we try, just update $*. + +2009-10-06 Boris Kolpackov + + * variable.h (undefine_variable_in_set): New function declaration. + (undefine_variable_global): New macro. + + * variable.c (undefine_variable_in_set): New function implementation. + + * read.c (vmodifiers): Add undefine_v modifier. + (parse_var_assignment): Parse undefine. + (do_undefine): Handle the undefine directive. + (eval): Call do_undefine if undefine_v is set. + + * main.c (.FEATURES): Add a keyword to indicate the new feature. + + * doc/make.texi (Undefine Directive): Describe the new directive. + + * NEWS: Add a note about the new directive. + +2009-10-05 Boris Kolpackov + + * implicit.c (pattern_search): Initialize file variables only + if we need to parse a rule that requires the second expansion. + +2009-10-03 Paul Smith + + * make.h: Include even on systems where __GNUC__ is + defined. Not sure why it was done the other way. + Requested by David Boyce . + +2009-09-30 Boris Kolpackov + + * dep.h (dep): Add the DONTCARE bitfield. + + * filedef.h (file):Add the NO_DIAG bitfield. + + * read.c (eval_makefile): Set the DONTCARE flag in struct dep, + not struct file (a file can be a dependency of many targets, + some don't care, some do). + + * remake.c (update_goal_chain): Propagate DONTCARE from struct + dep to struct file before updating the goal and restore it + afterwards. + (update_file): Don't prune the dependency graph if this target + has failed but the diagnostics hasn't been issued. + (complain): Scan the file's dependency graph to find the file + that caused the failure. + (update_file_1): Use NO_DIAG instead of DONTCARE to decide + whether to print diagnostics. + + Fixes Savannah bugs #15110, #25493, #12686, and #17740. + +2009-09-28 Paul Smith + + * doc/make.texi (Pattern Intro): Move the match algorithm + discussion into the "Pattern Match" node. + (Pattern Match): Expand on the pattern rule matching algorithm. + +2009-09-28 Andreas Buening + + * job.c (construct_command_argv_internal) [OS2]: Don't eat too + much of the command line on a single pass. + +2009-09-28 Boris Kolpackov + + * varible.c (create_pattern_var): Insert variables into the + PATTERN_VARS list in the shortest patterns first order. + + * implicit.c (tryrule): Add STEMLEN and ORDER members. These are + used to sort the rules. + (stemlen_compare): Compare two tryrule elements. + (pattern_search): Sort the rules so that they are in the shortest + stem first order. + + * main.c (.FEATURES): Add a keyword to indicate the new behavior. + + * doc/make.texi (Pattern-specific Variable Values): Describe the + new pattern-specific variables application order. + (Introduction to Pattern Rules): Describe the new pattern rules + search order. + + * NEWS: Add a note about the new behavior. + +2009-09-27 Paul Smith + + * doc/make.texi (Double-Colon): Mention that pattern rules with + double-colons have a different meaning. Savannah bug #27497. + +2009-09-27 Juan Manuel Guerrero + + * configh.dos.template: Remove unconditional definition of + SYS_SIGLIST_DECLARED. + Include because ports of GCC 4.3.0 and later no + longer include it, so macros like __DJGPP_MINOR__ are no longer + defined automatically. + + * Makefile.DOS.template (INCLUDES): Use $(prefix) and the + corresponding variables to define LIBDIR, INCLUDEDIR and LOCALEDIR + instead of using the hardcoded ones. + (SUBDIRS): doc subdir added. + (INFO_DEPS, DVIS): Values changed to 'make.info' and 'make.dvi'. + (TEXI2HTML, TEXI2HTML_FLAGS): Removed. Use makeinfo --html to + create html formated docs. texi2html may not be ported to DOS. + (make.info, make.dvi, make.ps, make.html): Make targets depend on + 'make.texi'. + (.texi.info, .texi, .texi.dvi): Now invoked recursively. Change + -I switch to look in ./ instead of ./doc. + (html): Target depend on html-recursive instead of make_1.html. + (make_1.html): Removed. + (mostlyclean-aminfo): Use $(srcdir)/doc instead of ./ as prefix. + (all-recursive): Allow for more than one subdir in the build + process. + (mostlyclean-recursive, clean-recursive, distclean-recursive) + (maintainer-clean-recursive, check-recursive): Enter in doc/ too. + (tags-recursive): Allow for more than one subdir in the build + process. + (info-recursive, dvi-recursive, ps-recursive, html-recursive): New + targets. Enter into doc/ to produce the targets. + (all-am): $(INFO_DEPS) replaced by info. + +2009-09-26 Paul Smith + + * read.c (record_files): Use free_ns() to free struct nameseq. + (eval): Ditto. + + * rule.c (freerule): Use free_dep_chain(). + + * read.c (record_files): Free FILENAMES chain for implicit rules. + (eval): Static pattern targets go into the string cache. + + * function.c (string_glob): Free NAME in the nameseq chain. + +2009-09-25 Boris Kolpackov + + * implicit.c (pattern_search): Terminate early if we haven't + found any rules to try (performance improvement). + +2009-09-25 Boris Kolpackov + + * implicit.c (pattern_search): Merge three parallel arrays, + TRYRULES, MATCHES, and CHECKED_LASTSLASH, into one array + of struct TRYRULE. In the old version the latter two arrays + had insufficient length. + +2009-09-24 Paul Smith + + * implicit.c (pattern_search): Add back support for order-only + prerequisites for secondary expansion implicit rules, that were + accidentally dropped. If we find a "|", enable order-only mode + and set IGNORE_MTIME on all deps that are seen afterward. + (pattern_search): Fix memory leaks: for intermediate files where + we've already set the file variable and pattern variable sets, be + sure to either save or free them as appropriate. + +2009-09-23 Paul Smith + + Rework the way secondary expansion is stored, for efficiency. + This changes secondary expansion so that ONLY WHEN we know we have + a possibility of needing secondary expansion, do we defer the + secondary expansion. This means more parsing the deps but we use + a lot less memory (due to the strcache). Also, this fixes + Savannah bug #18622. + + * read.c (eval): Don't parse the dep string here anymore. + (record_files): Take the dep argument as an unparsed string. If + secondary expansion is enabled AND the prereq string has a '$' in + it, then set NEED_2ND_EXPANSION and keep the entire string. + Otherwise, parse the dep string here to construct the dep list + with the names in the strcache. + + * misc.c (copy_dep_chain): For NEED_2ND_EXPANSION, we need to + duplicate the name string (others are in the strcache). + + * implicit.c: Remove struct idep and free_idep_chain(): unused. + (struct patdeps): New structure to store prereq information. + (pattern_search): Use the NEED_2ND_EXPANSION flag to determine + which prerequisites need expansion, and expand only those. + + * file.c (split_prereqs): Break parse_prereqs() into two parts: this + and enter_prereqs(). split_prereqs() takes a fully-expanded string + and splits it into a DEP list, handling order-only prereqs. + (enter_prereqs): This function enters a list of DEPs into the file + database. If there's a stem defined, expand any pattern chars. + (expand_deps): Only try to expand DEPs which have NEED_2ND_EXPANSION + set. Use the above functions. + (snap_deps): Only perform second expansion on prereqs that need it, + as defined by the NEED_2ND_EXPANSION flag. + (print_prereqs): New function to print the prereqs + (print_file): Call print_prereqs() rather than print inline. + + * hash.h (STRING_COMPARE): Take advantage of strcache() by + comparing pointers. + (STRING_N_COMPARE): Ditto. + (ISTRING_COMPARE): Ditto. + + * dep.h (PARSE_FILE_SEQ): New macro to reduce casts. + (parse_file_seq): Return void* + * read.c (parse_file_seq): Return void*. + (eval): Invoke macroized version of parse_file_seq() + * default.c (set_default_suffixes): Ditto. + * file.c (split_prereqs): Ditto. + * function.c (string_glob): Ditto. + * main.c (main): Ditto. + * rule.c (install_pattern_rule): Ditto. + + * filedef.h: Add split_prereqs(), enter_prereqs(), etc. + +2009-09-16 Paul Smith + + * misc.c (alloc_dep, free_dep): Now that we have xcalloc(), + convert to macros. + * dep.h: Create alloc_dep() / free_dep() macros. + + * implicit.c (pattern_search): Take advantage of the new + parse_file_seq() to add the directory prefix to each prereq. + + * dep.h: Remove multi_glob() and enhance parse_file_seq() to do it + all. Avoid reversing chains. Support adding prefixes. + * read.c (parse_file_seq): Rewrite to support globbing. Allow for + cached/non-cached results. + (eval): Remove multi_glob() & invoke new parse_file_seq(). + * rule.c (install_pattern_rule): Ditto. + * main.c (main): Ditto. + * implicit.c (pattern_search): Ditto. + * function.c (string_glob): Ditto. + * file.c (parse_prereqs): Ditto. + * default.c (set_default_suffixes): Ditto. + + * variable.c (parse_variable_definition): Don't run off the end of + the string if it ends in whitespace (found with valgrind). + + * commands.c (set_file_variables): Keep space for all targets in + $? if -B is given (found with valgrind). + +2009-09-15 Paul Smith + + * misc.c (concat): Make concat() variadic so it takes >3 arguments. + (xcalloc): Add new function. + * make.h: New declarations. + + * ar.c (ar_glob_match): New calling method for concat(). + * main.c (main): Ditto. + (decode_env_switches): Ditto. + * read.c (eval_makefile): Ditto. + (tilde_expand): Ditto. + (parse_file_seq): Ditto. + * variable.c (target_environment): Ditto. + (sync_Path_environment): Ditto. + + * ar.c (ar_glob_match): Use xcalloc(). + * dir.c (file_impossible): Ditto. + * file.c (enter_file): Ditto. + * job.c (new_job): Ditto. + * read.c (parse_file_seq): Ditto. + * vmsfunctions.c (opendir): Ditto. + +2009-09-14 Rafi Einstein (tiny patch) + + * w32/subproc/sub_proc.c (process_begin): Check *ep non-NULL + inside the loop that looks up environment for PATH. + +2009-08-31 Eli Zaretskii + + * function.c (windows32_openpipe): Update envp after calling + sync_Path_environment. + +2009-08-02 Paul Smith + + * remake.c (notice_finished_file): Ensure file->cmds is not null + before looping through them. Fixes Savannah bug #21824. + + * doc/make.texi (Wildcard Examples): Clarify when objects is + wildcard-expanded. Fixes Savannah bug #24509. Patch by Martin Dorey. + (Include): Clarify the behavior of -include. + Fixes Savannah bug #18963. + +2009-08-01 Paul Smith + + * doc/make.texi (Catalogue of Rules): Clarify where -c, -F, + etc. come on the command line. Fixes Savannah bug #27093. + + * expand.c (expand_argument): If the argument is large enough use + xmalloc() instead of alloca(). Fixes Savannah bug #27143. + + * variable.c (do_variable_definition): Avoid using alloca() to + hold values, which can be large. Fixes Savannah bug #23960. + + * job.c (new_job): Use memmove() instead of strcpy() since both + pointers are in the same memory block. Fixes Savannah bug #27148. + Patch by Petr Machata. + +2009-07-29 Ralf Wildenhues + + * job.c (construct_command_argv_internal): Add "ulimit" and + "unset" to the sh_cmds for Unixy shells. + +2009-07-29 Ralf Wildenhues + + * configure.in: Move side-effects outside AC_CACHE_VAL arguments + that set make_cv_sys_gnu_glob, so they are also correctly set + when the cache has been populated before. + +2009-07-04 Eli Zaretskii + + * function.c (func_realpath) [!HAVE_REALPATH]: Require the file to + exist, as realpath(3) does where it's supported. + +2006-07-04 Eli Zaretskii + + * function.c (IS_ABSOLUTE, ROOT_LEN): New macros. + (abspath): Support systems that define HAVE_DOS_PATHS (have + drive letters in their file names). Use IS_PATHSEP instead of a + literal '/' comparison. Fixes Savannah bug #26886. + +2009-06-14 Paul Smith + + * remake.c (update_file_1): Remember the original file we marked + as updating, so we can clear that flag again. If we find a target + via vpath, FILE might change. + (check_dep): Ditto. Fixes Savannah bug #13529. + Patch by Reid Madsen . + +2009-06-13 Paul Smith + + * doc/make.texi (MAKEFILES Variable): Be explicit that files + included by MAKEFILES cannot give default goals. + * read.c (eval): If set_default is not set, pass the no-default-goal + value when we read included makefiles. Fixes Savannah bug #13401. + + * ar.c (ar_name): Ensure that targets with empty parens aren't + considered archive member references: archive members must have a + non-empty "member" string. Fixes Savannah bug #18435. + + * function.c (string_glob): Rely on multi_glob() to determine + whether files exist or not. Remove call to file_exists_p() which + is not always correct. Fixes Savannah bug #21231. + * read.c (multi_glob): Add a new argument EXISTS_ONLY; if true + then only files that really exist will be returned. + * dep.h: Add new argument to multi_glob(). + * rule.c (install_pattern_rule): Ditto. + * read.c (eval): Ditto. + * main.c (main): Ditto. + * implicit.c (pattern_search): Ditto. + * file.c (parse_prereqs): Ditto. + * default.c (set_default_suffixes): Ditto. + +2009-06-09 Paul Smith + + * commands.c (set_file_variables): If always_make_flag is set, + always add the prereq to $?. Fixes Savannah bug #17825. + + * remake.c (update_file_1): When rebuilding deps of FILE, also try + to rebuild the deps of all the also_make targets for that file. + Fixes Savannah bug #19108. + + * implicit.c (pattern_search): Undo test for is_target, added by + BorisK on 21 Sep 2004. This goes against step 5c in the "Implicit + Rule Search Algorithm". Fixes Savannah bug #17752. + + * main.c (clean_jobserver): Clear the jobserver_fds options and + set job_slots to the default when we clean up. + (define_makeflags): Return the new MAKEFLAGS value. + (main): Reset MAKEFLAGS in the environment when we re-exec. + Fixes Savannah bug #18124. + +2009-06-08 Paul Smith + + * read.c (eval): Collapse continuations post-semicolon on target- + specific variables. Fixes Savannah bug #17521. + +2009-06-07 Paul Smith + + * job.c (reap_children): For older systems without waitpid() (are + there any of these left?) run wait(2) inside EINTRLOOP to handle + EINTR errors. Fixes Savannah bug #16401. + + * (various): Debug message cleanup. Fixes Savannah bug #16469. + + * main.c: Fix bsd_signal() typedef. Fixes Savannah bug #16473. + + * file.c (snap_deps): Set SNAPPED_DEPS at the start of snapping, + not the end, to catch second expansion $(eval ...) defining new + target/prereq relationships during snap_deps. + Fixes Savannah bug #24622. + + * read.c (record_files): The second-expansion "f->updating" hack + was not completely correct: if assumed that the target with + commands always had prerequisites; if one didn't then the ordering + was messed up. Fixed for now to use f->updating to decide whether + to preserve the last element in the deps list... but this whole + area of constructing and reversing the deps list is too confusing + and needs to be reworked. Fixes Savannah bug #21198. + +2009-06-06 Paul Smith + + * hash.c (hash_insert): Remove useless test for NULL. + Fixes Savannah bug #21823. + + * make.h: Move SET_STACK_SIZE determination to make.h. + * main.c (main): New global variable, STACK_LIMIT, holds the + original stack limit when make was started. + * job.c (start_job_command): Reset the stack limit, if we changed it. + Fixes Savannah bug #22010. + + * remake.c (check_dep): Only set the target's state to not-started + if it's not already running. Found this while testing -j10 builds + of glibc: various targets were being rebuilt multiple times. + Fix from Knut St. Osmundsen; fixes a problem reported in Savannah + bug #15919. + + * read.c (multi_glob): Don't pass GLOB_NOCHECK to glob(3); instead + handle the GLOB_NOMATCH error. This is to work around Sourceware.org + Bugzilla bug 10246. + +2009-06-04 Paul Smith + + * read.c (eval): Skip initial whitespace (ffeed, vtab, etc.) + + * maintMakefile: Modify access of config and gnulib Savannah + modules to use GIT instead of CVS. + + * main.c (main): Initialize the LENGTH field in SHELL_VAR. + Fixes Savannah bug #24655. + + * read.c (eval_buffer): Don't dereference reading_file if it's NULL; + this can happen during some invocations of $(eval ...) for example. + Fixes Savannah bug #24588. Patch by Lars Jessen + +2009-06-02 Paul Smith + + * configure.in: Check for fileno() + * read.c (eval_makefile): If fileno() is available, set CLOSE_ON_EXEC + for the makefile file so invocations of $(shell ...) don't inherit it. + Fixes Savannah bug #24277. + +2009-06-01 Paul Smith + + * main.c (main): The previous fix for .DEFAULT_GOAL had issues; + expansion was handled incorrectly. Rework the default goal + handling to save the variable only. Remove default_goal_file and + default_goal_name. + * read.c (eval): Check default_goal_var, not default_goal_name. + * read.c (record_target_var): Don't check default_goal_file here. + +2009-05-31 Paul Smith + + * main.c (main): Expand the .DEFAULT_GOAL variable before using + it, and if the multi_glob() returns nothing (say it expanded to + nothing but spaces) then don't crash. Fixes Savannah bug #25697. + + * doc/make.texi (Quick Reference): Add $(if ..), $(or ..), and + $(and ..) to the reference. Fixes Savannah bug #25694. + + * make.1: Be clear that some recipes will be executed even with -n. + * doc/make.texi: Ditto. Fixes Savannah bug #25460. + + * doc/make.texi (Override Directive): Make more clear how + overrides and appends interact. + Elucidates part of Savannah bug #26207. + + * read.c (record_target_var): Don't reset the origin on + target-specific variables; try_variable_definition() will handle + this correctly. Fixes Savannah bug #26207. + + * maintMakefile (do-po-update): Copy PO files into $(top_srcdir). + Fixes Savannah bug #25712. + + * implicit.c (pattern_search): Keep a pointer to the beginning of + the filename and save that instead of the constructed pointer. + Fixes Savannah bug #26593. + Patch by Mark Seaborn + +2009-05-30 Paul Smith + + * doc/make.texi (Multi-Line): Add a description of the new abilities + of define/endef. Rename "Sequences" to "Multi-Line" and fix some + "command sequence" vs. "recipe" syntax. + * read.c (do_define): Modify to allow assignment tokens (=, :=, etc.) + after a define, to create variables with those flavors. + +2009-05-25 Paul Smith + + Reworked the parser for variable assignments to allow multiple + modifiers, and in any order. Also allows variable and + prerequisites to be modifier names ('export', 'private', etc.) + + * NEWS: Add notes about user-visible changes. + + * read.c (struct vmodifiers): Remember what modifiers were seen. + (parse_var_assignment): New function to parse variable assignments. + (eval): Call the new function. Handle variable assignments earlier. + + * variable.c (parse_variable_definition): Only parse; don't create var. + (assign_variable_definition): Call parse, then create the var. + +2009-05-24 Paul Smith + + * doc/make.texi: Fix the ISBN for the GNU make manual. Incorrect + value noticed by Hans Stol . + +2009-03-14 Eli Zaretskii + + * w32/pathstuff.c (convert_Path_to_windows32): Fix last change. + Fixes Savannah bug #25412. + + * w32/subproc/sub_proc.c : Update Copyright years. Add + prototype for xmalloc. + (find_file): Accept 3 arguments PATH_VAR, FULL_FNAME, and FULL_LEN + instead of an LPOFSTRUCT pointer. Use xmalloc instead of malloc. + Loop over an array of extensions, instead of duplicating the same + code inline. Use SearchPath followed by CreateFile, instead of + the obsolete OpenFile. Fixes Savannah bug #17277. + (process_begin): Find $(PATH) in `envp', and pass a pointer to it + to `find_file'. Fixes Savannah bug #25662. + +2009-03-07 Eli Zaretskii + + * function.c (func_shell): Don't close pipedes[1] if it is -1. + Fixes Savannah bug #20495. + +2009-02-28 Ralf Wildenhues + + * doc/make.texi (Instead of Execution): Document interaction of + -t with phony targets. + +2009-02-23 Ramon Garcia + + Introduce a new keyword "private" which applies to target-specific + variables and prevents their values from being inherited. + + * variable.h (struct variable): Add private_var flag to each variable. + Add a flag to specify which list entry switches to the parent target. + * variable.c (define_variable_in_set): Initialize private_var flag. + (lookup_variable): Skip private variables in parent contexts. + (initialize_file_variables): Set next_is_parent appropriately. + (print_variable): Show the private_var flag. + * read.c (eval): Recognize the private keyword. + (record_target_var): Set private_var. + * doc/make.texi (Suppressing Inheritance): Add documentation. + +2008-10-26 Paul Smith + + * configure.in: Check for strndup(). + * misc.c (xstrndup): Rename savestring to xstrndup. Use strndup + if it's available. + * make.h: Rename savestring to xstrndup. + * commands.c (chop_commands): Ditto. + * function.c (func_foreach): Ditto. + * read.c (eval, record_files): Ditto. + * variable.c (define_variable_in_set): Ditto. + +2008-09-30 Eli Zaretskii + + * build_w32.bat (GCCBuild): Use "-gdwarf-2 -g3" instead of + "-gstabs+ -ggdb3". + + * w32/subproc/build.bat (GCCBuild): Likewise. + +2008-09-30 David Russo (tiny change) + + * job.c (construct_command_argv_internal): Avoid extra backslash + in batch-mode Unixy shells. Under DB_JOBS, display the contents + of the batch file. + +2008-05-31 Eli Zaretskii + + * README.W32.template: Remove obsolete text about non-support for + -jN without Unixy shell. Remove obsolete text about not supplying + Visual Studio project files (we do supply them). Modify text to + prefer GCC builds to MSC builds. + +2008-04-02 Ralf Wildenhues + + * doc/make.texi (Empty Targets): Fix typo. + +2008-03-27 Paul Smith + + Fix Savannah bug #22379: + * ar.c (ar_glob_match): Zero the allocated structure. + * read.c (parse_file_seq): Ditto. + +2008-03-08 Brian Dessent + + * maintMakefile: Update Translation Project location. + +2008-01-26 Eli Zaretskii + + * variable.c (target_environment): Don't use shell_var if its + `value' field is NULL. + +2007-12-22 Eli Zaretskii + + Suggested by Juan Manuel Guerrero : + + * Makefile.DOS.template (info_TEXINFOS): Remove unused variable. + (TEXINFOS): Value changed to `doc/make.texi'. + (.SUFFIXES): Use .texi instead of .texinfo. + (make.info, make.dvi): Depend on doc/make.texi. + (.texi.info): New target, instead of ".texinfo.info". Change -I + switch to $(MAKEINFO) to look in doc/. Use --no-split. + (.texi): New target, instead of ".texinfo". Change -I switch to + $(MAKEINFO) to look in doc/. Use --no-split. + (.texi.dvi): New target, instead of ".texinfo.dvi". Change -I + switch to $(MAKEINFO) to look in doc/. + (install-info-am, uninstall-info): Don't look for "*.i[0-9]" and + "*.i[0-9][0-9]" (due to --no-split above). + (noinst_TEXINFOS, TEXI2HTML, TEXI2HTML_FLAGS): New variables. + (html, make_1.html): New targets. + (.PHONY): Add "html". + (.SUFFIXES): Add .html. + +2007-12-22 Juan Manuel Guerrero (tiny change) + + * configh.dos.template [__DJGPP__]: Replace HAVE_SYS_SIGLIST with + HAVE_DECL_SYS_SIGLIST. + + * job.c (child_execute_job): Remove __MSDOS__ because MSDOS/DJGPP + build does not use child_execute_job. + + * variable.c (define_automatic_variables) [__MSDOS__]: Always + export the SHELL environment variable to the child. + +2007-12-22 Eli Zaretskii + + * config.h.W32: Include sys/types.h. + [!_PID_T_] (pid_t): Define only if not already defined by sys/types.h. + + * vpath.c (construct_vpath_list) [HAVE_DOS_PATHS]: Support VPATH + values that use `:' in drive letters, when PATH_SEPARATOR_CHAR is + also `:'. + +2007-11-04 Paul Smith + + * doc/make.texi: Convert references to "commands", "command + lines", and "command script" to "recipe". + * NEWS: Ditto. + * commands.c, file.c, job.c, remake.c, read.c, variable.c, main.c: + Ditto. + +2007-10-27 Bruno Haible + + * remake.c (f_mtime): Print time difference values between 100 and + ULONG_MAX in fixed-point notation rather than in exponention notation. + +2007-10-12 Eli Zaretskii + + * variable.c (do_variable_definition): Allow $(SHELL) to expand to + a more complex value than a simple shell: if it's not a default + shell now then expand it and see if is a default shell then. + +2007-10-10 Eli Zaretskii + + * dir.c (find_directory) [WINDOWS32]: Remove trailing slashes from + pathnames, with const strings. + * build_w32.bat [WINDOWS32]: If no config.h.W32 exists, create one + from the template (used for building from CVS, not a dist). + +2007-10-10 Paul Smith + + * make.h: Add a prototype for w32_kill() (change suggested by + Yongwei Wu ). + +2007-09-21 Eli Zaretskii + + * w32/pathstuff.c (convert_Path_to_windows32): Handle quoted + directories in Path. + +2007-09-12 Paul Smith + + * doc/make.texi: Applied wording cleanups from Savannah patch #6195. + Provided by Diego Biurrun + (Complex Makefile): Remove .PHONY setting for tar: patch #6196. + Provided by Diego Biurrun + +2007-09-11 Paul Smith + + * doc/make.texi (Special Variables): Moved this into the "How to + Use Variables" chapter. Added a table entry for .RECIPEPREFIX. + (MAKEFILE_LIST) No longer a section; this was added into the + "Special Variables" section. + (Rule Introduction): Reference .RECIPEPREFIX. + (Simple Makefile): Ditto. + (Rule Syntax): Ditto. + (Command Syntax): Ditto. + (Error Messages): Ditto. + +2007-09-10 Paul Smith + + * commands.c (print_commands): Don't print an extra line in the + command scripts. Prefix the command scripts with cmd_prefix, not \t. + + * read.c (construct_include_path): Add the full string to the cache; we + were chopping the last char. + + * NEWS: Announce the .RECIPEPREFIX special variable. + * variable.c (lookup_special_var): Rename from handle_special_var(). + (lookup_variable): Call the new name. + (set_special_var): New function: handle setting of special variables. + When setting .RECIPEPREFIX, reset the cmd_prefix global variable. + (do_variable_definition): Call it. + * make.h (RECIPEPREFIX_DEFAULT): Define the default command prefix char. + (RECIPEPREFIX_NAME): Define the command prefix special variable name. + * main.c (main): Create the .RECIPEPREFIX special variable. + * read.c (eval): Remove the cmd_prefix characters from the command + scripts here, so they're not stored in the commands array at all, + rather than waiting and stripping them out during command construction. + * job.c (construct_command_argv_internal): Don't skip cmd_prefix here. + +2007-08-15 Paul Smith + + * doc/make.texi (GNU Free Documentation License): The fdl.texi + file has had the section info removed, so add some to make.texi + before we include it. + +2007-08-15 Icarus Sparry + + * remake.c (check_dep): Reset the target state for intermediate + files. They might have been considered before but not updated + then (order-only for example) but they will be this time. + Fixes Savannah bug #'s 3330 and 15919. + +2007-07-21 Eli Zaretskii + + Fix Savannah bug #20549: + * function.c (func_shell): Call construct_command_argv with zero + value of FLAGS. + * job.c (construct_command_argv_internal): New argument FLAGS; all + callers changed. + [WINDOWS32]: If FLAGS has the COMMANDS_RECURSE bit set, ignore + just_print_flag. + * job.h (construct_command_argv_internal): Update prototype. + +2007-07-13 Paul Smith + + * file.c (expand_deps): Use variable_buffer as the start of the + buffer, not the original pointer (in case it was reallocated). + Fix suggested by Rafi Einstein . + Fixes Savannah bug #20452. + +2007-07-04 Paul Smith + + * (ALL FILES): Update to GPLv3. + * (ALL FILES): Update copyright for 2007. + + * main.c (print_version): Move the host type info to the second line. + +2007-06-29 Thiemo Seufer + + * maintMakefile: Update Translation Project location. + +2007-06-13 Paul Smith + + * doc/make.texi (Reading Makefiles): "Expansion of deferred" -> + "Expansion of a deferred" + Fixes Savannah bug #20018. + + * expand.c (variable_expand_for_file): Preserve the value of + reading_file rather than setting it to 0 at the end. + Fixes Savannah bug #20033. + +2007-05-11 Paul Smith + + * job.c (new_job): Add debug info to specify where make found the + command script it is running to build a target. + Fixes Savannah bug #18617. + + * default.c (default_suffixes,default_suffix_rules,default_variables): + Add support for Objective C. Fixes Savannah bug #16389. + Based on a patch provided by Peter O'Gorman . + + * function.c (func_lastword): Initialize p. + + * doc/make.texi (Eval Function, Implicit Variables, Special Targets): + Doc fixes noticed by Bob . Patch from + Dave Korn + +2007-05-08 Paul Smith + + Fix Savannah bug #19656: + + * configure.in: Check for strcasecmp(), strcmpi(), and stricmp(). + + * make.h: Change all case-insensitive string compares to use + strcasecmp() (from POSIX). If we don't have that but do have one + of the others, define strcasecmp to be one of those instead. If + we don't have any, declare a prototype for our own version. + + * misc.c (strcasecmp): Use this if we can't find any native + case-insensitive string comparison function. + * vmsfunctions.c: Remove strcmpi(); we'll use misc.c:strcasecmp(). + * main.c (find_and_set_default_shell): Use strcasecmp() instead of + strcmpi(). + * job.c (_is_unixy_shell, construct_command_argv_internal): Use + strcasecmp() instead of stricmp(). + * hash.h (ISTRING_COMPARE, return_ISTRING_COMPARE): Use strcasecmp() + instead of strcmpi(). + * acinclude.m4: Remove the strcasecmp() check from here. + +2007-03-21 Paul Smith + + * configure.in: Don't turn on case-insensitive file system support + if --disable-... is given. Fixes Savannah bug #19348. + +2007-03-19 Paul Smith + + * ALL: Use the strcache for all file name strings, or other + strings which we will never free. The goal is to save memory by + avoiding duplicate copies of strings. However, at the moment this + doesn't save much memory in most situations: due to secondary + expansion we actually save prerequisite lists twice (once before + the secondary expansion, and then again after it's been parsed + into individual file names in the dep list). We will resolve this + in a future change, by doing the parsing up-front for targets + where secondary expansion is not set. + + Moving things into the strcache also allows us to use const + pointers in many more places. + +2007-01-03 Paul Smith + + * make.h (ENULLLOOP): Reset errno after each failed invocation of + the function, not just the first. Fixes Savannah bug #18680. + +2006-11-18 Paul Smith + + * strcache.c (strcache_add_len): Don't allocate a new buffer + unless the string is not already nil-terminated. Technically this + is a violation of the standard, since we may be passed an array + that is not long enough to test one past. However, in make this + is never true since we only use nil-terminated strings or + sub-strings thereof. + + * read.c (eval, do_define): Use cmd_prefix instead of '\t'. + + * main.c: New global cmd_prefix, defaults to '\t'. + * job.c (construct_command_argv_internal): Use cmd_prefix instead + of '\t'. + + * dir.c: Constified. + (dir_contents_file_exists_p): Check for an error return from + readdir(), just in case. + + * commands.c: Constified. + * default.c: Constified. + * expand.c: Constified. + * function.c: Partial constification. + * variable.c: Partial constification. + * vmsify.c: Constification. Hard to test this but I hope I didn't + screw it up! + * vpath.c: Partial constification. + * w32/pathstuff.c: Partial constification. + +2006-11-16 Eli Zaretskii + + * main.c (main) [HAVE_DOS_PATHS]: Treat DOS style argv[0] with + backslashes and drive letters as absolute. + +2006-10-22 Paul Smith + + * main.c (struct command_switch): Use const and void*. + +2006-10-21 Paul Smith + + * ar.c: Constified. + * arscan.c: Constified. + +2006-09-30 Paul Smith + + * doc/make.texi (MAKEFILE_LIST Variable): Modify reference to + point to lastword since the example was updated. + Fixes Savannah bug #16304. + (Secondary Expansion): Correct example description. + Fixes Savannah bug #16468. + (Makefile Contents): Clarify that comments cannot appear within + variable references or function calls. + Fixes Savannah bug #16577. + (Special Targets): Clarify how .NOTPARALLEL works in recursion. + Fixes Savannah bug #17701. + Reported by Ralf Wildenhues : + (Prerequisite Types): Added an example of using order-only + prerequisites. Fixes Savannah bug #17880. + (Rule Syntax): "lise" -> "list" + (Multiple Rules): ... -> @dots{} + (Splitting Lines): ditto. + + * remake.c (update_file_1): Prereqs that don't exist should be + considered changed, for the purposes of $?. + Fixes Savannah bug #16051. + + * make.1: Remove extraneous "+". + Fixes Savannah bug #16652. + +2006-09-06 Paul D. Smith + + * configure.in: Include sys/types.h when checking for sys/wait.h. + +2006-08-18 Eli Zaretskii + + * configure.in (PATH_SEPARATOR_CHAR): Define to the value of + $PATH_SEPARATOR. + + * make.h (PATH_SEPARATOR_CHAR): Define only if still undefined. + Normally, it is defined in config.h. + + * config/dospaths.m4 : Define to yes on Cygwin as + well. + + * job.c (construct_command_argv_internal) [HAVE_DOS_PATHS]: Define + sh_chars_sh for Windows platforms that emulate Unix. + +2006-05-07 Paul D. Smith + + * README.OS2.template: Updates provided by Andreas Buening + . + +2006-04-30 Paul D. Smith + + * make.h: Include if HAVE_DIRECT_H. + * config.h.W32.template (HAVE_DIRECT_H): Set it if it's available. + +2006-04-26 Paul D. Smith + + * README.cvs: Add a reminder to notify the GNU translation robot. + + * doc/make.texi: Change @direcategory (requested by Karl Berry). + +2006-04-20 Paul D. Smith + + * maintMakefile (po-check): Use Perl instead of grep -E, for systems + that don't have extended grep. + (cvsclean): Use $(PERL) instead of perl. + +2006-04-09 Paul D. Smith + + * maintMakefile: Add some extra warning options (GCC 4.1 only?) + + * expand.c, implicit.c, main.c, read.c: Rename variables so that + inner-scope variables don't mask outer-scope variables. + + * ar.c, arscan.c, commands.c, default.c, dir.c, expand.c, file.c: + * function.c, getloadavg.c, implicit.c, job.c, main.c, misc.c, read.c: + * remake.c, remote-cstms.c, rule.c, strcache.c, variable.c: + * vmsfunctions.c, vmsify.c, vpath.c: Remove all casts of returned + values from memory allocation functions: they return void* and so + don't need to be cast. Also remove (char *) casts of arguments to + xrealloc(). + + * configure.in: Remove checks for memcpy/memmove/strchr. + + * make.h: Remove bcmp/bcopy/bzero/strchr/strrchr macros. + + * ar.c, arscan.c, commands.c, dir.c: Convert all bzero/bcopy/bcmp + calls to memset/memcpy/memmove/memcmp calls. + * expand.c, file.c, function.c, getloadavg.c, implicit.c: Ditto. + * job.c, main.c, misc.c, read.c, remake.c, rule.c: Ditto. + * variable.c, vpath.c: Ditto. + + * make.h (EXIT_FAILURE): Should be 1, not 0. + +2006-04-06 Paul D. Smith + + * configure.in: Removed AM_C_PROTOTYPES. Starting now on we + require an ISO C 1989 standard compiler and runtime library. + + * Makefile.am: Remove the ansi2knr feature. + + * make.h: Remove the PARAMS() macro definition and all uses of it. + + * amiga.h, ar.c, arscan.c: Remove all uses of the PARAMS() macro. + * commands.c, commands.h, config.h-vms.template: Ditto. + * dep.h, dir.c, expand.c, filedef.h, function.c: Ditto. + * implicit.c, job.c, job.h, main.c, read.c, remake.c: Ditto. + * rule.c, rule.h, variable.h, vmsdir.h, vmsjobs.c, vpath.c: Ditto. + + * NEWS: Update. + +2006-04-01 Paul D. Smith + + Version 3.81 released. + + * NEWS: Updated for 3.81. + + * README.cvs: Mention that vpath builds are not supported out of + CVS. Fixes Savannah bug #16236. + Remove update of make.texi from the list of things to do; we use + version.texi now. + +2006-03-26 Paul D. Smith + + * doc/make.texi: Clean up licensing. Use @copying and version.texi + support from automake, as described in the Texinfo manual. + +2006-03-25 Eli Zaretskii + + * implicit.c (pattern_search) [HAVE_DOS_PATHS]: Don't compare b + with lastslash, since the latter points to filename, not to + target. + * job.c (construct_command_argv_internal) [HAVE_DOS_PATHS]: + Declare and define sh_chars_sh[]. + +2006-03-23 Paul D. Smith + + * configure.in: Look for build.sh.in in $srcdir so it will be + built for remote configurations as well. + + * Makefile.am: Make sure to clean up build.sh during distclean. + Fixes Savannah bug #16166. + + * misc.c (log_access): Takes a const char *. + * function.c (fold_newlines): Takes an unsigned int *. + Both fixes for Savannah bug #16170. + +2006-03-22 Boris Kolpackov + + * implicit.c (pattern_search): Call set_file_variables only + if we have prerequisites that need second expansion. Fixes + Savannah bug #16140. + +2006-03-19 Paul D. Smith + + * remake.c (update_file): Add alloca(0) to clean up alloca'd + memory on hosts that don't support it directly. + + * README.cvs: Add information on steps for making a release (to + make sure I don't forget any). + + * main.c (clean_jobserver): Move jobserver cleanup code into a new + function. + (die): Cleanup code was removed from here; call the new function. + (main): If we are re-execing, clean up the jobserver first so we + don't leak file descriptors. + Reported by Craig Fithian + +2006-03-17 Paul D. Smith + + * maintMakefile (do-po-update): Rewrite this rule to clean up and + allow multiple concurrent runs. + Patch from Joseph Myers + +2006-03-17 Boris Kolpackov + + * dep.h (struct dep): Add the stem field. + * misc.c (alloc_dep, free_dep): New functions. + (copy_dep_chain): Copy stem. + (free_dep_chain): Use free_dep. + * read.c (record_files): Store stem in the dependency line. + * file.c (expand_deps): Use stem stored in the dependency line. Use + free_dep_chain instead of free_ns_chain. + * implicit.c (pattern_search): Use alloc_dep and free_dep. + * read.c (read_all_makefiles, eval_makefile, eval): Ditto. + * main.c (main, handle_non_switch_argument): Ditto. + * remake.c (check_dep): Ditto. + * rule.c (convert_suffix_rule, freerule): Ditto. + +2006-03-14 Paul D. Smith + + * expand.c (variable_append): Instead of appending everything then + expanding the result, we expand (or not, if it's simple) each part + as we add it. + (allocated_variable_append): Don't expand the final result. + Fixes Savannah bug #15913. + +2006-03-09 Paul Smith + + * remake.c (update_file_1): Revert the change of 3 Jan 2006 which + listed non-existent files as changed. Turns out there's a bug in + the Linux kernel builds which means that this change causes + everything to rebuild every time. We will re-introduce this fix + in the next release, to give them time to fix their build system. + Fixes Savannah bug #16002. + Introduces Savannah bug #16051. + + * implicit.c (pattern_search) [DOS_PATHS]: Look for DOS paths if + we *don't* find UNIX "/". + Reported by David Ergo + +2006-03-04 Eli Zaretskii + + * variable.c (do_variable_definition) [WINDOWS32]: Call the shell + locator function find_and_set_default_shell if SHELL came from the + command line. + +2006-02-20 Paul D. Smith + + * variable.c (merge_variable_set_lists): It's legal for *setlist0 + to be null; don't core in that case. + +2006-02-19 Paul D. Smith + + * commands.c (set_file_variables): Realloc, not malloc, the static + string values to avoid memory leaks. + + * expand.c (recursively_expand_for_file): Only set reading_file to + an initialized value. + + * implicit.c (pattern_search): We need to make a copy of the stem + if we get it from an intermediate dep, since those get freed. + + * file.c (lookup_file) [VMS]: Don't lowercase special targets that + begin with ".". + (enter_file) [VMS]: Ditto. + Patch provided by Hartmut Becker . + +2006-02-24 Eli Zaretskii + + * job.c (construct_command_argv_internal): Fix last change. + + * w32/subproc/sub_proc.c (process_pipe_io): Make dwStdin, + dwStdout, and dwStderr unsigned int: avoids compiler warnings in + the calls to _beginthreadex. + + * expand.c (recursively_expand_for_file): Initialize `save' to + prevent compiler warnings. + +2006-02-18 Eli Zaretskii + + * job.c (construct_command_argv_internal): Don't create a temporary + script/batch file if we are under -n. Call _setmode to switch the + script file stream to text mode. + +2006-02-17 Paul D. Smith + + * variable.c (merge_variable_set_lists): Don't try to merge the + global_setlist. Not only is this useless, but it can lead to + circularities in the linked list, if global_setlist->next in one + list gets set to point to another list which also ends in + global_setlist. + Fixes Savannah bug #15757. + +2006-02-15 Paul D. Smith + + Fix for Savannah bug #106. + + * expand.c (expanding_var): Keep track of which variable we're + expanding. If no variable is being expanded, it's the same as + reading_file. + * make.h (expanding_var): Declare it. + * expand.c (recursively_expand_for_file): Set expanding_var to the + current variable we're expanding, unless there's no file info in + it (could happen if it comes from the command line or a default + variable). Restore it before we exit. + * expand.c (variable_expand_string): Use the expanding_var file + info instead of the reading_file info. + * function.c (check_numeric): Ditto. + (func_word): Ditto. + (func_wordlist): Ditto. + (func_error): Ditto. + (expand_builtin_function): Ditto. + (handle_function): Ditto. + +2006-02-14 Paul D. Smith + + * read.c (eval): Even if the included filenames expands to the + empty string we still need to free the allocated buffer. + + * implicit.c (pattern_search): If we allocated a variable set for + an impossible file, free it. + * variable.c (free_variable_set): New function. + * variable.h: Declare it. + + * read.c (read_all_makefiles): Makefile names are kept in the + strcache, so there's never any need to alloc/free them. + (eval): Ditto. + + * main.c (main): Add "archives" to the .FEATURES variable if + archive support is enabled. + * doc/make.texi (Special Variables): Document it. + +2006-02-13 Paul D. Smith + + * implicit.c (pattern_search): Add checking for DOS pathnames to + the pattern rule target LASTSLASH manipulation. + Fixes Savannah bug #11183. + +2006-02-11 Paul D. Smith + + * (ALL FILES): Updated copyright and license notices. + +2006-02-10 Paul D. Smith + + A new internal capability: the string cache is a read-only cache + of strings, with a hash table interface for fast lookup. Nothing + in the cache will ever be freed, so there's no need for reference + counting, etc. This is the beginning of a full solution for + Savannah bug #15182, but for now we only store makefile names here. + + * strcache.c: New file. Implement a read-only string cache. + * make.h: Add prototypes for new functions. + * main.c (initialize_global_hash_tables): Initialize the string cache. + (print_data_base): Print string cache stats. + * read.c (eval_makefile): Use the string cache to store makefile + names. Rewrite the string allocation to be sure we free everything. + +2006-02-10 Eli Zaretskii + + * dir.c (dir_contents_file_exists_p): Don't opendir if the + directory time stamp didn't change, except on FAT filesystems. + Suggested by J. David Bryan . + +2006-02-09 Paul D. Smith + + * function.c (func_or): Implement a short-circuiting OR function. + (func_and): Implement a short-circuiting AND function. + (function_table_init): Update the table with the new functions. + * doc/make.texi (Conditional Functions): Changed the "if" section + to one on general conditional functions. Added documentation for + $(and ...) and $(or ...) functions. + * NEWS: Note new $(and ...) and $(or ...) functions. + +2006-02-08 Boris Kolpackov + + * job.h (struct child): Add the dontcare bitfield. + * job.c (new_job): Cache dontcare flag. + * job.c (reap_children): Use cached dontcare flag instead of the + one in struct file. Fixes Savannah bug #15641. + +2006-02-06 Paul D. Smith + + * vpath.c (selective_vpath_search): If the file we find has a + timestamp from -o or -W, use that instead of the real time. + * remake.c (f_mtime): If the mtime is a special token from -o or + -W, don't overwrite it with the real mtime. + Fixes Savannah bug #15341. + + Updates from Markus Mauhart : + + * w32/subproc/sub_proc.c (process_begin): Remove no-op tests. + (process_signal, process_last_err, process_exit_code): Manage + invalid handle values. + (process_{outbuf,errbuf,outcnt,errcnt,pipes}): Unused and don't + manage invalid handles; remove them. + * job.c (start_job_command) [WINDOWS32]: Jump out on error. + * config.h.W32.template [WINDOWS32]: Set flags for Windows builds. + * README.cvs: Updates for building from CVS. + +2006-02-05 Paul D. Smith + + * file.c (enter_file): Keep track of the last double_colon entry, + to avoid walking the list every time we want to add a new one. + Fixes Savannah bug #15533. + * filedef.h (struct file): Add a new LAST pointer. + + * dir.c (directory_contents_hash_cmp): Don't use subtraction to do + the comparison. For 64-bits systems the result of the subtraction + might not fit into an int. Use comparison instead. + Fixes Savannah bug #15534. + + * doc/make.texi: Update the chapter on writing commands to reflect + the changes made in 3.81 for backslash/newline and SHELL handling. + +2006-02-01 Paul D. Smith + + * dir.c (dir_contents_file_exists_p) [WINDOWS32]: Make sure + variable st is not used when it's not initialized. + Patch from Eli Zaretskii . + +2006-01-31 Paul D. Smith + + * README.W32.template: Applied patch #4785 from + Markus Mauhart . + * README.cvs: Applied patch #4786 from + Markus Mauhart . + * make_msvc_net2003.vcproj [WINDOWS32]: New version from + J. Grant . + + * main.c: Update the copyright year in the version output. + * prepare_w32.bat: Remove this file from the distribution. + +2006-01-21 Eli Zaretskii + + * remake.c (update_goal_chain): Set g->changed instead of + incrementing it, as it is only 8-bit wide, and could overflow if + many commands got started in update_file. + + * w32/include/sub_proc.h: Add a prototype for process_used_slots. + + * w32/subproc/sub_proc.c: Change dimension of proc_array[] to + MAXIMUM_WAIT_OBJECTS. + (process_wait_for_any_private): Change dimension of handles[] + array to MAXIMUM_WAIT_OBJECTS. + (process_used_slots): New function. + (process_register): Don't register more processes than the + available number of slots. + (process_easy): Don't start new processes if all slots are used up. + + * job.c (load_too_high, start_waiting_jobs) [WINDOWS32]: If there + are already more children than sub_proc.c can handle, behave as if + the load were too high. + (start_job_command): Fix a typo in error message when process_easy + fails. + +2006-01-14 Eli Zaretskii + + * main.c (main) [WINDOWS32]: Don't refuse to run with -jN, even if + the shell is not sh.exe. + + * job.c (create_batch_file): Renamed from create_batch_filename; + all callers changed. Don't close the temporary file; return its + file descriptor instead. New arg FD allows to return the file + descriptor. + (construct_command_argv_internal): Use _fdopen instead of fopen to + open the batch file. + +2006-01-04 Paul D. Smith + + * readme.vms: Updates for case-insensitive VMS file systems from + Hartmut Becker . + * dir.c (vms_hash): Ditto. + * vmsify.c (copyto): Ditto. + * vmsfunctions.c (readdir): Ditto. + + * make.1: Add a section on the exit codes for make. + + * doc/make.texi: A number of minor updates to the documentation. + +2006-01-03 Paul D. Smith + + * remake.c (update_file_1): Mark a prerequisite changed if it + doesn't exist. + + * read.c (eval): Be sure to strip off trailing whitespace from the + prerequisites list properly. Also, initialize all fields in + struct dep when creating a new one. + +2005-12-28 Paul D. Smith + + * config.h.W32.template [WINDOWS32]: Add in some pragmas to + disable warnings for MSC. + Patch by Rob Tulloh . + +2005-12-17 Eli Zaretskii + + * doc/make.texi (Execution): Add a footnote about changes in + handling of backslash-newline sequences. Mention the differences + on MS-DOS and MS-Windows. + + * NEWS: More details about building the MinGW port and a pointer + to README.W32. Fix the section name that describes the new + backward-incompatible processing of backslash-newline sequences. + The special processing of SHELL set to "cmd" is only relevant to + MS-Windows, not MS-DOS. + +2005-12-17 Eli Zaretskii + + * main.c (handle_runtime_exceptions): Cast exrec->ExceptionAddress + to DWORD, to avoid compiler warnings. + * job.c (exec_command): Cast hWaitPID and hPID to DWORD, and + use %ld in format, to avoid compiler warnings. + + * doc/make.texi (Special Targets): Fix a typo. + (Appending): Fix cross-reference to Setting. + (Special Variables, Secondary Expansion, File Name Functions) + (Flavor Function, Pattern Match, Quick Reference): Ensure two + periods after a sentence. + (Execution): Add @: after "e.g.". + (Environment): Fix punctuation. + (Target-specific, Call Function, Quick Reference): Add @: after "etc." + (Shell Function, Target-specific): Add @: after "vs." + +2005-12-14 Boris Kolpackov + + * read.c (record_target_var): Initialize variable's export field + with v_default instead of leaving it "initialized" by whatever + garbage happened to be on the heap. + +2005-12-12 Paul D. Smith + + * make.1: Fix some display errors and document all existing options. + Patch by Mike Frysinger . + +2005-12-11 Paul D. Smith + + * implicit.c (pattern_search): If 2nd expansion is not set for + this implicit rule, replace the pattern with the stem directly, + and don't re-expand the variable list. Along with the other + .SECONDEXPANSION changes below, fixes bug #13781. + +2005-12-09 Boris Kolpackov + + * implicit.c (pattern_search): Mark other files that this rule + builds as targets so that they are not treated as intermediates + by the pattern rule search algorithm. Fixes bug #13022. + +2005-12-07 Boris Kolpackov + + * remake.c (notice_finished_file): Propagate the change of + modification time to all the double-colon entries only if + it is the last one to be updated. Fixes bug #14334. + +2005-11-17 Boris Kolpackov + + * function.c (func_flavor): Implement the flavor function which + returns the flavor of a variable. + * doc/make.texi (Functions for Transforming Text): Document it. + * NEWS: Add it to the list of new functions. + +2005-11-14 Boris Kolpackov + + * read.c (construct_include_path): Set the .INCLUDE_DIRS special + variable. + * doc/make.texi (Special Variables): Document .INCLUDE_DIRS. + * NEWS: Add .INCLUDE_DIRS to the list of new special variables. + +2005-10-26 Paul Smith + + * read.c (record_files): Don't set deps flags if there are no deps. + * maintMakefile: We only need to build the templates when we are + creating a distribution, so don't do it for "all". + +2005-10-24 Paul D. Smith + + Make secondary expansion optional: its enabled by declaring the + special target .SECONDEXPANSION. + + * NEWS: Update information on second expansion capabilities. + * doc/make.texi (Secondary Expansion): Document the + .SECONDEXPANSION special target and its behavior. + * dep.h (struct dep): Add a flag STATICPATTERN, set to true if the + prerequisite list was found in a static pattern rule. + (free_dep_chain): Declare a prototype. + * file.c (parse_prereqs): New function: break out some complexity + from expand_deps(). + (expand_deps): If we aren't doing second expansion, replace % with + the stem for static pattern rules. Call the new function. + * filedef.h (parse_prereqs): Declare a prototype. + * implicit.c (pattern_search): Initialize the new staticpattern + field. + * main.c (second_expansion): Declare a global variable to remember + if the special target has been seen. Initialize the new + staticpattern field for prerequisites. + * make.h: Extern for second_expansion. + * misc.c (free_dep_chain): New function: frees a struct dep list. + * read.c (read_all_makefiles): Initialize the staticpattern field. + (eval_makefile): Ditto. + (record_files): Check for the .SECONDEXPANSION target and set + second_expansion global if it's found. + Use the new free_dep_chain() instead of doing it by hand. + Set the staticpattern field for prereqs of static pattern targets. + +2005-10-16 Paul D. Smith + + * main.c (main): Set CURDIR to be a file variable instead of a + default, so that values of CURDIR inherited from the environment + won't override the make value. + +2005-09-26 Paul D. Smith + + * job.c (construct_command_argv_internal): If the line is empty + remember to free the temporary argv strings. + Fixes bug # 14527. + +2005-09-16 Paul D. Smith + + * job.c (start_job_command): The noerror flag is a boolean (single + bit); set it appropriately. + Reported by Mark Eichin + +2005-08-29 Paul D. Smith + + * function.c (func_error): On Windows, output from $(info ...) + seems to come in the wrong order. Try to force it with fflush(). + +2005-08-10 Boris Kolpackov + + * read.c (record_files): Move code that sets stem for static + pattern rules out of the if (!two_colon) condition so it is + also executed for two-colon rules. Fixes Savannah bug #13881. + +2005-08-08 Paul D. Smith + + * make.h: Don't test that __STDC__ is non-0. Some compilers + (Windows for example) set it to 0 to denote "ISO C + extensions". + Fixes bug # 13594. + +2005-08-07 Paul D. Smith + + * w32/pathstuff.c (getcwd_fs): Fix warning about assignment in a + conditional (slightly different version of a fix from Eli). + + Fix a bug reported by Michael Matz : patch included. + If make is running in parallel without -k and two jobs die in a + row, but not too close to each other, then make will quit without + waiting for the rest of the jobs to die. + + * main.c (die): Don't reset err before calling reap_children() the + second time: we still want it to be in the error condition. + * job.c (reap_children): Use a static variable, rather than err, + to control whether or not the error message should be printed. + +2005-08-06 Eli Zaretskii + + * w32/subproc/sub_proc.c: Include signal.h. + (process_pipe_io, process_file_io): Pass a pointer to a local + DWORD variable to GetExitCodeProcess. If the exit code is + CONTROL_C_EXIT, put SIGINT into pproc->signal. + + * job.c [WINDOWS32]: Include windows.h. + (main_thread) [WINDOWS32]: New global variable. + (reap_children) [WINDOWS32]: Get the handle for the main thread + and store it in main_thread. + + * commands.c [WINDOWS32]: Include windows.h and w32err.h. + (fatal_error_signal) [WINDOWS32]: Suspend the main thread before + doing anything else. When we are done, close the main thread + handle and exit with status 130. + +2005-07-30 Eli Zaretskii + + * w32/subproc/sub_proc.c (process_begin): Don't pass a NULL + pointer to fprintf. + + * main.c (find_and_set_default_shell): If found a DOSish shell, + set sh_found and the value of default_shell, and report the + findings in debug mode. + + * job.c (construct_command_argv_internal): Check unixy_shell, not + no_default_sh_exe, to decide whether to use Unixy or DOSish + builtin commands. + + * README.W32: Update with info about the MinGW build. + + * build_w32.bat: Support MinGW. + + * w32/subproc/build.bat: Likewise. + + * w32/subproc/sub_proc.c (process_easy): Fix format strings for + printing DWORD args. + + * function.c (windows32_openpipe): Fix format strings for printing + DWORD args. + + * job.c (reap_children) [WINDOWS32]: Don't declare 'status' and + 'reap_mode'. + (start_job_command): Fix format string for printing the result of + process_easy. + (start_job_command) [WINDOWS32]: Do not define. + (exec_command): Fix format string for printing HANDLE args. + + * main.c (handle_runtime_exceptions): Fix sprintf format strings + to avoid compiler warnings. + (open_tmpfile): Declare fd only if HAVE_FDOPEN is defined. + (Note: some of these fixes were submitted independently by J. Grant) + +2005-07-30 J. Grant + + * prepare_w32.bat: Copy config.h.w32 to config.h if not exist. + * make_msvc_net2003.vcproj, make_msvc_net2003.sln: MSVC Project files. + * Makefile.am (EXTRA_DIST): Add MSVC Project files. + +2005-07-15 Paul Smith + + * job.c (construct_command_argv_internal) [DOS,WINDOWS32,OS/2]: If + we don't have a POSIX shell, then revert to the old + backslash-newline behavior (where they are stripped). + Fixes bug #13665. + +2005-07-08 Paul D. Smith + + * config.h.W32.template: Reorder to match the standard config.h, + for easier comparisons. + From J. Grant + + * maintMakefile: Remove .dep_segment before overwriting it, in + case it's not writable or noclobber is set. + * expand.c (variable_expand_string): Cast result of pointer + arithmetic to avoid a warning. + * main.c (switches): Add full-fledged final initializer. + +2005-07-06 Paul D. Smith + + * configure.in: IRIX has _sys_siglist. Tru64 UNIX has __sys_siglist. + * signame.c (strsignal): If we found _sys_siglist[] or + __sys_siglist[] use those instead of sys_siglist[]. + From Albert Chin + +2005-07-04 Paul D. Smith + + * config.h-vms.template [VMS]: Latest VMS has its own glob() and + globfree(); set up to use the GNU versions. + From Martin Zinser + +2005-07-03 Paul D. Smith + + From J. Grant : + + * README.W32.template: Update the Windows and tested MSVC versions. + * NMakefile.template (CFLAGS_any): Change warning level from W3 to W4. + * w32/subproc/NMakefile (CFLAGS_any): Ditto. + * build_w32.bat: Ditto. + * w32/subproc/build.bat: Ditto. + +2005-06-28 Paul D. Smith + + * signame.c: HAVE_DECL_* macros are set to 0, not undef, if the + declaration was checked but not present. + +2005-06-27 Paul D. Smith + + * dir.c (find_directory): Change type of fs_serno/fs_flags/fs_len + to unsigned long. Fixes Savannah bug #13550. + + * w32/subproc/sub_proc.c: Remove (HANDLE) casts on lvalues. + (process_pipe_io): Initialize tStdin/tStdout/tStderr variables. + Fixes Savannah bug #13551. + +2005-06-26 Paul D. Smith + + * make.h: Fix bug in ANSI_STRING/strerror() handling; only define + it if ANSI_STRING is not set. + +2005-06-25 Paul D. Smith + + * read.c (eval): If no filenames are passed to any of the + "include" variants, don't print an error. + * doc/make.texi (Include): Document this. + Fixes Savannah bug #1761. + + * job.c (construct_command_argv_internal): Sanitize handling of + backslash/newline pairs according to POSIX: that is, keep the + backslash-newline in the command script, but remove a following + TAB character, if present. In the fast path, make sure that the + behavior matches what the shell would do both inside and outside + of quotes. In the slow path, quote the backslash and put a + literal newline in the string. + Fixes Savannah bug #1332. + * doc/make.texi (Execution): Document the new behavior and give + some examples. + * NEWS: Make a note of the new behavior. + + * make.h [WINDOWS32]: #include . + Fixes Savannah bug #13478. + + * remake.c (name_mtime): If the stat() of a file fails and the -L + option was given and the file is a symlink, take the best mtime of + the symlink we can get as the mtime of the file and don't fail. + Fixes Savannah bug #13280. + + * read.c (find_char_unquote): Accept a new argument IGNOREVARS. + If it's set, then don't stop on STOPCHARs or BLANKs if they're + inside a variable reference. Make this function static as it's + only used here. + (eval): Call find_char_unquote() with IGNOREVARS set when we're + parsing an unexpanded line looking for semicolons. + Fixes Savannah bug #1454. + * misc.c (remove_comments): Move this to read.c and make it static + as it's only used there. Call find_char_unquote() with new arg. + * make.h: Remove prototypes for find_char_unquote() and + remove_comments() since they're static now. + + * main.c (main): If we see MAKE_RESTARTS in the environment, unset + its export flag and obtain its value. When we need to re-exec, + increment the value and add it into the environment. + * doc/make.texi (Special Variables): Document MAKE_RESTARTS. + * NEWS: Mention MAKE_RESTARTS. + * main.c (always_make_set): New variable. Change the -B option to + set this one instead. + (main): When checking makefiles, only set always_make_flag if + always_make_set is set AND the restarts flag is 0. When building + normal targets, set it IFF always_make_set is set. + (main): Avoid infinite recursion with -W, too: only set what-if + files to NEW before we check makefiles if we've never restarted + before. If we have restarted, set what-if files to NEW _after_ we + check makefiles. + Fixes Savannah bug #7566: + +2005-06-17 Paul D. Smith + + * default.c: Change VMS implicit rules to use $$$$ instead of $$ + in the prerequisites list. + +2005-06-12 Paul D. Smith + + Fix Savannah bug # 1328. + + * configure.in: Check for atexit(). + * misc.c (close_stdout): Test stdout to see if writes to it have + failed. If so, be sure to exit with a non-0 error code. Based on + code found in gnulib. + * make.h: Prototype. + * main.c (main): Install close_stdout() with atexit(). + +2005-06-10 Paul D. Smith + + VMS build updates from Hartmut Becker : + + * vmsjobs.c [VMS]: Updates to compile on VMS: add some missing + headers; make vmsWaitForChildren() static; extern vmsify(). + * job.c [VMS]: Move vmsWaitForChildren() prototype to be global. + Don't create child_execute_job() here (it's in vmsjobs.c). + * makefile.vms (job.obj) [VMS]: Add vmsjobs.c as a prerequisite. + +2005-06-09 Paul D. Smith + + * variable.c (push_new_variable_scope): File variables point + directly to the global_setlist variable. So, inserting a new + scope in front of that has no effect on those variables: they + don't go through current_variable_set_list. If we're pushing a + scope and the current scope is global, push it "the other way" so + that the new setlist is in the global_setlist variable, and + next points to a new setlist with the global variable set. + (pop_variable_scope): Properly undo a push with the new + semantics. + Fixes Savannah bug #11913. + +2005-05-31 Boris Kolpackov + + * job.c (reap_children): Don't die of the command failed but + the dontcare flag is set. Fixes Savannah bug #13216. + + * implicit.c (pattern_search): When creating a target from + an implicit rule match, lookup pattern target and set precious + flag in a newly created target. Fixes Savannah bug #13218. + +2005-05-13 Paul D. Smith + + Implement "if... else if... endif" syntax. + + * read.c (eval): Push all checks for conditional words ("ifeq", + "else", etc.) down into the conditional_line() function. + (conditional_line): Rework to allow "else if..." clause. New + return value -2 for lines which are not conditionals. The + ignoring flag can now also be 2, which means "already parsed a + true branch". If that value is seen no other branch of this + conditional can be considered true. In the else parsing if there + is extra text after the else, invoke conditional_line() + recursively to see if it's another conditional. If not, it's an + error. If so, raise the conditional value to this level instead + of creating a new conditional nesting level. Special check for + "else" and "endif", which aren't allowed on the "else" line. + * doc/make.texi (Conditional Syntax): Document the new syntax. + +2005-05-09 Paul D. Smith + + * Makefile.am (EXTRA_make_SOURCES): Add vmsjobs.c + (MAYBE_W32): Rework how SUBDIRS are handled so that "make dist" + recurses to the w32 directory, even on non-Windows systems. Use + the method suggested in the automake manual. + * configure.in: Add w32/Makefile to AC_CONFIG_FILES. + * maintMakefile (gnulib-url): They moved the texinfo.tex files. + +2005-05-07 Paul D. Smith + + * main.c (die): If we're dying with a fatal error (not that a + command has failed), write back any leftover tokens before we go. + + * job.c (set_child_handler_action_flags): If there are jobs + waiting for the load to go down, set an alarm to go off in 1 + second. This allows us to wake up from a potentially long-lasting + read() and start a new job if the load has gone down. Turn it off + after the read. + (job_noop): Dummy signal handler function. + (new_job): Invoke it with the new semantics. + + * docs/make.texi: Document secondary expansion. Various cleanups + and random work. + +2005-05-03 Paul D. Smith + + Rename .DEFAULT_TARGET to .DEFAULT_GOAL: in GNU make terminology + the targets which are to ultimately be made are called "goals"; + see the GNU make manual. Also, MAKECMDGOALS, etc. + + * filedef.h, read.c, main.c: Change .DEFAULT_TARGET to + .DEFAULT_GOAL, and default_target_name to default_goal_name. + * doc/make.texi (Special Variables): Document .DEFAULT_GOAL. + +2005-05-02 Paul D. Smith + + * job.c, vmsjobs.c (vmsWaitForChildren, vms_redirect, + vms_handle_apos, vmsHandleChildTerm, reEnableAst, astHandler, + tryToSetupYAst, child_execute_job) [VMS]: Move VMS-specific + functions to vmsjobs.c. #include it into jobs.c. + + Grant Taylor reports that -j# can lose + jobserver tokens. I found that this happens when an exported + recursive variable contains a $(shell ...) function reference: in + this situation we could "forget" to write back a token. + + * job.c, job.h: Add variable jobserver_tokens: counts the tokens + we have. It's not reliable to depend on the number of children in + our linked list so keep a separate count. + (new_job): Check jobserver_tokens rather than children && + waiting_jobs. Increment jobserver_tokens when we get one. + (free_child): If jobserver_tokens is 0, internal error. If it's + >1, write a token back to the jobserver pipe (we don't write a + token for the "free" job). Decrement jobserver_tokens. + + * main.c: Add variable master_job_slots. + (main): Set it to hold the number of jobs requested if we're the + master process, when using the jobserver. + (die): Sanity checks: first test jobserver_tokens to make sure + this process isn't holding any tokens we didn't write back. + Second, if master_job_slots is set count the tokens left in the + jobserver pipe and ensure it's the same as master_job_slots (- 1). + +2005-04-24 Paul D. Smith + + Grant Taylor reports that -j# in conjunction + with -l# can lose jobserver tokens, because waiting jobs are not + consulted properly when checking for the "free" token. + + * job.c (free_child): Count waiting_jobs as having tokens. + * job.c (new_job): Ditto. Plus, call start_waiting_jobs() here to + handle jobs waiting for the load to drop. + +2005-04-23 Paul D. Smith + + * main.c (main): Be careful to not core if a variable setting in + the environment doesn't contain an '='. This is illegal but can + happen in broken setups. + Reported by Joerg Schilling . + +2005-04-12 Paul D. Smith + + The second expansion feature causes significant slowdown. Timing + a complex makefile (GCC 4.1) shows a slowdown from .25s to just + read the makefile before the feature, to 11+s to do the same + operations after the feature. Additionally, memory usage + increased drastically. To fix this I added some intelligence that + avoids the overhead of the second expansion unless it's required. + + * dep.h: Add a new boolean field, need_2nd_expansion. + + * read.c (eval): When creating the struct dep for the target, + check if the name contains a "$"; if so set need_2nd_expansion to 1. + (record_files): If there's a "%" in a static pattern rule, it gets + converted to "$*" so set need_2nd_expansion to 1. + + * file.c (expand_deps): Rework to be more efficient. Only perform + initialize_file_variables(), set_file_variables(), and + variable_expand_for_file() if the need_2nd_expansion is set. + + * implicit.c (pattern_search): Default need_2nd_expansion to 0. + (pattern_search): Ditto. + * main.c (handle_non_switch_argument): Ditto. + (main): Ditto. + * read.c (read_all_makefiles): Ditto. + (eval_makefile): Ditto. + +2005-04-07 Paul D. Smith + + * main.c (main) [WINDOWS32]: Export PATH to sub-shells, not Path. + * variable.c (sync_Path_environment): Ditto. + Patch by Alessandro Vesely. Fixes Savannah bug #12209. + + * main.c (main): Define the .FEATURES variable. + * NEWS: Announce .FEATURES. + * doc/make.texi (Special Variables): Document .FEATURES. + + * remake.c (check_dep): If a file is .PHONY, update it even if + it's marked intermediate. Fixes Savannah bug #12331. + +2005-03-15 Boris Kolpackov + + * file.c (expand_deps): Factor out the second expansion and + prerequisite line parsing logic from snap_deps(). + + * file.c (snap_deps): Use expand_deps(). Expand and parse + prerequisites of the .SUFFIXES special target first. Fixes + Savannah bug #12320. + +2005-03-13 Paul D. Smith + + * main.c (main) [MSDOS]: Export SHELL in MSDOS. Requested by Eli + Zaretskii. + +2005-03-11 Paul D. Smith + + * signame.c (strsignal): HAVE_DECL_SYS_SIGLIST is 0 when not + available, not undefined (from Earnie Boyd). + +2005-03-10 Boris Kolpackov + + * implicit.c (pattern_search): Mark an intermediate target as + precious if it happened to be a prerequisite of some (other) + target. Fixes Savannah bug #12267. + +2005-03-09 Paul D. Smith + + * read.c (eval_makefile): Add alloca(0). + (eval_buffer): Ditto. + +2005-03-09 Boris Kolpackov + + * main.c (main): Use o_file instead of o_default when defining + the .DEFAULT_TARGET special variable. + * read.c (eval): Use define_variable_global() instead of + define_variable() when setting new value for the .DEFAULT_TARGET + special variable. Fixes Savannah bug #12266. + +2005-03-04 Boris Kolpackov + + * imlicit.c (pattern_search): Mark files for which an implicit + rule has been found as targets. Fixes Savannah bug #12202. + +2005-03-04 Paul D. Smith + + * AUTHORS: Update. + * doc/make.texi (Automatic Variables): Document $|. + +2005-03-03 Boris Kolpackov + + * read.c (record_files): Instead of substituting % with + actual stem value in dependency list replace it with $*. + This fixes stem triple expansion bug. + + * implicit.c (pattern_search): Copy stem to a separate + buffer and make it a properly terminated string. Assign + this buffer instead of STEM (which is not terminated) to + f->stem. Instead of substituting % with actual stem value + in dependency list replace it with $*. This fixes stem + triple expansion bug. + +2005-03-01 Paul D. Smith + + * commands.c (fatal_error_signal) [WINDOWS32]: Don't call kill() + on Windows, as it takes a handle not a pid. Just exit. + Fix from patch #3679, provided by Alessandro Vesely. + + * configure.in: Update check for sys_siglist[] from autoconf manual. + * signame.c (strsignal): Update to use the new autoconf macro. + +2005-03-01 Boris Kolpackov + + * read.c (record_files): Add a check for the list of prerequisites + of a static pattern rule being empty. Fixes Savannah bug #12180. + +2005-02-28 Paul D. Smith + + * doc/make.texi (Text Functions): Update docs to allow the end + ordinal for $(wordlist ...) to be 0. + * function.c (func_wordlist): Fail if the start ordinal for + $(wordlist ...) is <1. Matches documentation. + Resolves Savannah support request #103195. + + * remake.c (update_goal_chain): Fix logic for stopping in -q: + previously we were stopping when !-q, exactly the opposite. This + has been wrong since version 1.34, in 1994! + (update_file): If we got an error don't break out to run more + double-colon rules: just return immediately. + Fixes Savannah bug #7144. + +2005-02-27 Paul D. Smith + + * misc.c (end_of_token): Make argument const. + * make.h: Update prototype. + + * function.c (abspath, func_realpath, func_abspath): Use + PATH_VAR() and GET_PATH_MAX instead of PATH_MAX. + * dir.c (downcase): Use PATH_VAR() instead of PATH_MAX. + * read.c (record_files): Ditto. + * variable.c (do_variable_definition): Ditto. + + * function.c (func_error): Create a new function $(info ...) that + simply prints the message to stdout with no extras. + (function_table_init): Add new function to the table. + * NEWS: Add $(info ...) reference. + * doc/make.texi (Make Control Functions): Document it. + + New feature: if the system supports symbolic links, and the user + provides the -L/--check-symlink-time flag, then use the latest + mtime between the symlink(s) and the target file. + + * configure.in (MAKE_SYMLINKS): Check for lstat() and + readlink(). If both are available, define MAKE_SYMLINKS. + * main.c: New variable: check_symlink_flag. + (usage): Add a line for -L/--check-symlink-times to the help string. + (switches): Add -L/--check-symlink-times command line argument. + (main): If MAKE_SYMLINKS is not defined but the user specified -L, + print a warning and disable it again. + * make.h: Declare check_symlink_flag. + * remake.c (name_mtime): If MAKE_SYMLINKS and check_symlink_flag, + if the file is a symlink then check each link in the chain and + choose the NEWEST mtime we find as the mtime for the file. The + newest mtime might be the file itself! + * NEWS: Add information about this new feature. + * doc/make.texi (Options Summary): Add -L/--check-symlink-times docs. + + Avoid core dumps described in Savannah bug # 12124: + + * file.c: New variable snapped_deps remember whether we've run + snap_deps(). + (snap_deps): Set it. + * filedef.h: Extern it. + * read.c (record_files): Check snapped_deps; if it's set then + we're trying to eval a new target/prerequisite relationship from + within a command script, which we don't support. Fatal. + +2005-02-28 Boris Kolpackov + + Implementation of the .DEFAULT_TARGET special variable. + + * read.c (eval): If necessary, update default_target_name when + reading rules. + * read.c (record_files): Update default_target_file if + default_target_name has changed. + * main.c (default_target_name): Define. + * main.c (main): Enter .DEFAULT_TARGET as make variable. If + default_target_name is set use default_target_file as a root + target to make. + * filedef.h (default_target_name): Declare. + * dep.h (free_dep_chain): + * misc.c (free_dep_chain): Change to operate on struct nameseq + and change name to free_ns_chain. + * file.c (snap_deps): Update to use free_ns_chain. + +2005-02-27 Boris Kolpackov + + Implementation of the second expansion in explicit rules, + static pattern rules and implicit rules. + + * read.c (eval): Refrain from chopping up rule's dependencies. + Store them in a struct dep as a single dependency line. Remove + the code that implements SySV-style automatic variables. + + * read.c (record_files): Adjust the code that handles static + pattern rules to expand all percents instead of only the first + one. Reverse the order in which dependencies are stored so that + when the second expansion reverses them again they appear in + the makefile order (with some exceptions, see comments in + the code). Remove the code that implements SySV-style automatic + variables. + + * file.c (snap_deps): Implement the second expansion and chopping + of dependency lines for explicit rules. + + * implicit.c (struct idep): Define an auxiliary data type to hold + implicit rule's dependencies after stem substitution and + expansion. + + * implicit.c (free_idep_chain): Implement. + + * implicit.c (get_next_word): Implement helper function for + parsing implicit rule's dependency lines into words taking + into account variable expansion requests. Used in the stem + splitting code. + + * implicit.c (pattern_search): Implement the second expansion + for implicit rules. Also fixes bug #12091. + + * commands.h (set_file_variables): Declare. + * commands.c (set_file_variables): Remove static specifier. + + * dep.h (free_dep_chain): Declare. + * misc.c (free_dep_chain): Implement. + + * variable.h (variable_expand_for_file): Declare. + * expand.c (variable_expand_for_file): Remove static specifier. + + * make.h (strip_whitespace): Declare. + * function.c (strip_whitespace): Remove static specifier. + +2005-02-26 Paul D. Smith + + * main.c (main): Check for ferror() when reading makefiles from stdin. + Apparently some shells in Windows don't close pipes properly and + require this check. + +2005-02-24 Jonathan Grant + + * configure.in: Add MinGW configuration options, and extra w32 code + directory. + * Makefile.am: Add MinGW configuration options, and extra w32 code + directory. + * main.c: Determine correct program string (after last \ without .exe). + * subproc/sub_proc.c: `GetExitCodeProcess' from incompatible pointer + type fix x2 + * w32/Makefile.am: Import to build win32 lib of sub_proc etc. + * subproc/w32err.c: MSVC thread directive not applied to MinGW builds. + * tests/run_make_tests.pl, tests/test_driver.pl: MSYS testing + environment support. + +2004-04-16 Dmitry V. Levin + + * function.c (func_shell): When initializing error_prefix, check + that reading file name is not null. This fixes long-standing + segfault in cases like "make 'a1=$(shell :)' 'a2:=$(a1)'". + +2005-02-09 Paul D. Smith + + * maintMakefile: Update the CVS download URL to simplify them. + Also, the ftp://ftp.gnu.org/GNUinfo site was removed so I'm + downloading the .texi files from Savannah now. + + Fixed these issues reported by Markus Mauhart : + + * main.c (handle_non_switch_argument): Only add variables to + command_variables if they're not already there: duplicate settings + waste space and can be confusing to read. + + * w32/include/sub_proc.h: Remove WINDOWS32. It's not needed since + this header is never included by non-WINDOWS32 code, and it + requires to define which isn't always included first. + + * dir.c (read_dirstream) [MINGW]: Use proper macro names when + testing MINGW32 versions. + + * main.c (log_working_directory): flush stdout to be sure the WD + change is printed before any stderr messages show up. + +2005-02-01 Paul D. Smith + + * maintMakefile (po_repo): Update the GNU translation site URL. + +2004-12-01 Paul D. Smith + + * main.c (main): Change char* env_shell to struct variable shell_var. + * variable.c (target_environment): Use new shell_var. + +2004-11-30 Paul D. Smith + + * configure.in: The old way we avoided creating build.sh from + build.sh.in before build.sh.in exists doesn't work anymore; we + have to use raw M4 (thanks to Andreas Schwab for + the help!). This also keeps automake from complaining. + * Makefile.am (README): Add a dummy target so automake won't + complain that this file doesn't exist when we checkout from CVS. + * maintMakefile (.dep_segment): Rewrite this rule since newer + versions of automake don't provide DEP_FILES. + +2004-11-30 Boris Kolpackov + + Implementation of `realpath' and `abspath' built-in functions. + + * configure.in: Check for realpath. + * function.c (abspath): Return an absolute file name that does + not contain any `.' or `..' components, nor repeated `/'. + * function.c (func_abspath): For each name call abspath. + * function.c (func_realpath): For each name call realpath + from libc or delegate to abspath if realpath is not available. + * doc/make.texi (Functions for File Names): Document new functions. + * doc/make.texi (Quick Reference): Ditto. + +2004-11-28 Paul D. Smith + + * main.c (main) [WINDOWS32]: Remove any trailing slashes from -C + arguments. Fixes bug #10252. + + Fix for bug #1276: Handle SHELL according to POSIX requirements. + + * main.c (main): Set SHELL to v_noexport by default. Remember the + original environment setting of SHELL in the env_shell variable. + * main.h: Export new env_shell variable. + * variable.c (target_environment): If we find a v_noexport + variable for SHELL, add a SHELL variable with the env_shell value. + * doc/make.texi (Quick Reference): Document the POSIX behavior. + * doc/make.texi (Variables/Recursion): Ditto. + +2004-11-28 Paul D. Smith + + * main.c (find_and_set_default_shell) [WINDOWS32]: check for + equality of "cmd"/"cmd.exe", not inequality. Fixes bug #11155. + Patch by Alessandro Vesely. + +2004-11-12 Paul D. Smith + + * job.c (child_execute_job) [VMS]: Don't treat "#" as a comment on + the command line if it's inside a string. + Patch by: Hartmut Becker + +2004-10-21 Boris Kolpackov + + * function.c (func_lastword): New function: return last word + from the list of words. + * doc/make.texi: Document $(lastword ). Fix broken links in + Quick Reference section. + +2004-10-06 Paul D. Smith + + Apply patch from Alessandro Vesely, provided with bug # 9748. + Fix use of tmpnam() to work with Borland C. + + * job.c (construct_command_argv_internal) [WINDOWS32]: Remove + construction of a temporary filename, and call new function + create_batch_filename(). + (create_batch_filename) [WINDOWS32]: New function to create a + temporary filename. + +2004-10-05 Boris Kolpackov + + * read.c (record_target_var): Expand simple pattern-specific + variable. + * variable.c (initialize_file_variables): Do not expand simple + pattern-specific variable. + +2004-09-28 Boris Kolpackov + + * remake.c (update_file_1): When rebuilding makefiles inherit + dontcare flag from a target that triggered update. + +2004-09-27 Boris Kolpackov + + * variable.c (initialize_file_variables): Mark pattern-specific + variable as a per-target and copy export status. + +2004-09-21 Boris Kolpackov + + * file.c (snap_deps): Mark .PHONY prerequisites as targets. + + * implicit.c (pattern_search): When considering an implicit rule's + prerequisite check that it is actually a target rather then + just an entry in the file hashtable. + +2004-09-21 Paul D. Smith + + * read.c (readstring): Fix some logic errors in backslash handling. + (eval): Remove some unnecessary processing in buffer handling. + (record_target_var): Assert that parse_variable_definition() succeeded. + Reported by: Markus Mauhart . + + * misc.c: Removed the sindex() function. All instances of this + function were trivially replaceable by the standard strstr() + function, and that function will always have better (or certainly + no worse) performance than the very simple-minded algorithm + sindex() used. This can matter with complex makefiles. + * make.h: Remove the prototype for sindex(). + * function.c (subst_expand): Convert sindex() call to strstr(). + This means we no longer need to track the TLEN value so remove that. + (func_findstring): Convert sindex() to strstr(). + * commands.c (chop_commands): Convert sindex() calls to strstr(). + Suggested by: Markus Mauhart . + + * main.c (find_and_set_default_shell) [WINDOWS32]: Implement the + idea behind Savannah Patch #3144 from david.baird@homemail.com. + If SHELL is set to CMD.EXE then assume it's batch-mode and + non-unixy. I wrote the code differently from the patch, though, + to make it safer. This also resolves bug #9174. + +2004-09-20 Paul D. Smith + + * expand.c (variable_expand_string): Modify to invoke + patsubst_expand() instead of subst_expand(); the latter didn't + handle suffix patterns correctly. + * function.c (subst_expand): Remove the SUFFIX_ONLY parameter; it + was used only from variable_expand_string() and is no longer used + there. + (func_subst): Ditto, on call to subst_expand(). + (patsubst_expand): Require the percent pointers to point to the + character after the %, not to the % itself. + * read.c (record_files): New call criteria for patsubst_expand(). + * variable.h: Remove SUFFIX_ONLY from subst_expand() prototype. + This is to fix a bug reported by Markus Mauhart . + +2004-09-19 Paul D. Smith + + * function.c (subst_expand): Fix a check in by_word: look for a + previous blank if we're beyond the beginning of the string, not + the beginning of the word. + Bugs reported by Markus Mauhart . + +2004-05-16 Paul D. Smith + + * remake.c (update_goal_chain): Change the argument specifying + whether we're rebuilding makefiles to be a global variable, + REBUILDING_MAKEFILES. + (complain): Extract the code that complains about no rules to make + a target into a separate function. + (update_file_1): If we tried to rebuild a file during the makefile + rebuild phase and it was dontcare, then no message was printed. + If we then try to build the same file during the normal build, + print a message this time. + (remake_file): Don't complain about un-remake-able files when + we're rebuilding makefiles. + +2004-05-11 Paul D. Smith + + * job.c (construct_command_argv_internal): OS/2 patches from + Andreas Buening . + +2004-05-10 Paul D. Smith + + * remake.c (update_file): Don't walk the double-colon chain unless + this is a double-colon rule. Fix suggested by Boris Kolpackov + . + + * makefile.vms (CFLAGS): Remove glob/globfree (see readme.vms docs) + * readme.vms: New section describing OpenVMS support and issues. + * default.c (default_variables): Add support for IA64. + * job.c (tryToSetupYAst) [VMS]: On VMS running make in batch mode + without some privilege aborts make with the error + %SYSTEM-F-NOPRIV. It happens when setting up a handler for + pressing Ctrl+Y and the input device is no terminal. The change + catches this error and just continues. + + Patches by Hartmut Becker + +2004-04-25 Paul D. Smith + + * commands.c (set_file_variables): Set $< properly in the face of + order-only prerequisites. + Patch from Boris Kolpackov + +2004-04-21 Bob Byrnes + + * main.c (main): Notice failures to remake makefiles. + +2004-03-28 Paul D. Smith + + Patches for Acorn RISC OS by Peter Naulls + + * job.c: No default shell for RISC OS. + (load_too_high): Hard-code the return to 1. + (construct_command_argv_internal): No sh_chars or sh_cmds. + * getloadavg.c: Don't set LOAD_AVE_TYPE on RISC OS. + +2004-03-20 Paul D. Smith + + * variable.c (do_variable_definition): Don't append from the + global set if a previous non-appending target-specific variable + definition exists. Reported by Oliver Schmidt + (with fix). + + * expand.c (reference_variable): Don't give up on variables with + no value that have the target-specific append flag set: they might + have a value after all. Reported by Oliver Schmidt + (with fix) and also by Maksim A. Nikulin + . + + * rule.c (count_implicit_rule_limits): Don't delete patterns which + refer to absolute pathnames in directories that don't exist: some + portion of the makefile could create those directories before we + match the pattern. Fixes bugs #775 and #108. + + Fixes from Jonathan R. Grant : + + * main.c (main): Free makefile_mtimes if we have any. + * README.W32.template: Update documentation for the current status + of the MS-Windows port. + * NMakefile.template (MAKE): Add "MAKE = nmake". A conflicting + environment variable is sometimes already defined which causes the + build to fail. + * main.c (debug_signal_handler): Only define this function if + SIGUSR1 is available. + + Fixes for OS/2 from Andreas Beuning : + + * configure.in [OS/2]: Relocate setting of HAVE_SA_RESTART for OS/2. + * README.OS2.template: Documentation updates. + * build.template: Add LIBINTL into LOADLIBES. Add $CFLAGS to the + link line for safety. + * maintMakefile (build.sh.in): Remove an extraneous ")". + * job.c (child_execute_job): Close saved FDs. + * job.c (exec_command) [OS/2]: exec_command(): If the command + can't be exec'ed and if the shell is not Unix-sh, then try again + with argv = { "cmd", "/c", ... }. Normally, this code is never + reached for the cmd shell unless the command really doesn't exist. + (construct_command_argv_internal) [OS/2]: The code for cmd + handling now uses new_argv = { "cmd", "/c", "original line", NULL}. + The CMD builtin commands are case insensitive so use strcasecmp(). + +2004-03-19 Paul D. Smith + + * read.c (do_define): Re-order line counter increment so the count + is accurate (we were losing one line per define). Reported by + Dave Yost . + +2004-03-06 Paul D. Smith + + * configure.in (HAVE_ANSI_COMPILER): Define if we have an ANSI/ISO + compiler. + * make.h: Convert uses of __STDC__ to HAVE_ANSI_COMPILER. + * misc.c (message,error,fatal): Ditto. + * configh.dos.template: Define HAVE_ANSI_COMPILER. + * config.h.W32.template: Ditto. + * config.h-vms.template: Ditto. + * config.ami.template: Ditto. + +2004-03-04 Paul D. Smith + + * README.template: Add a note about broken /bin/sh on SunOS + 4.1.3_U1 & 4.1.4. Fix up Savannah links. + + * misc.c (message, error, fatal): Don't use "..." if we're using + varargs. ansi2knr should handle this but it doesn't work: it + translates "..." to va_dcl etc. but _AFTER_ the preprocessor is + done. On many systems (SunOS for example) va_dcl is a #define. + So, force the use of the non-"..." version on pre-ANSI compilers. + + * maintMakefile (sign-dist): Create some rules to help automate + the new GNU ftp upload method. + +2004-02-24 Paul D. Smith + + * config.h.W32.template: Add HAVE_STDARG_H + * config.h-vms.template: Ditto. + * config.ami.template: Ditto. + +2004-02-23 Jonathan Grant + + * README.W32.template: Add a notation about -j with BATCH_MODE_ONLY. + * build_w32.bat: Remove extra "+". + +2004-02-23 Paul D. Smith + + * make.h: Create an UNUSED macro to mark unused parameters. + * (many): Clean up warnings by applying UNUSED, fixing + signed/unsigned incompatibilities, etc. + + * acinclude.m4 (AC_STRUCT_ST_MTIM_NSEC): Add quoting to silence + autoconf warnings. + * filedef.h: Name the command_state enumeration. + * file.c (set_command_state): Use the enumeration in the function + argument. + + * configure.in: Explicitly set SET_MAKE to empty, to disable + MAKE=make even when no make already exists. Fix bug #3823. + +2004-02-22 Paul D. Smith + + * maintMakefile: Perl script to clean up all non-CVS files. Use + it on all the subdirectories for the cvs-clean target. + + * main.c (decode_switches): Require non-empty strings for all our + string command-line options. Fixes Debian bug # 164165. + + * configure.in: Check for stdarg.h and varargs.h. + * make.h (USE_VARIADIC): Set this if we can use variadic functions + for printing messages. + * misc.c: Check USE_VARIADIC instead of (obsolete) HAVE_STDVARARGS. + (message): Ditto. + (error): Ditto. + (fatal): Ditto. + + A number of patches for OS/2 support from Andreas Buening + : + + * job.c (child_handler) [OS/2]: Allow this on OS/2 but we have to + disable the SIGCHLD handler. + (reap_children) [OS/2]: Remove special handling of job_rfd. + (set_child_handler_action_flags) [OS/2]: Use this function in OS/2. + (new_job) [OS/2]: Disable the SIGCHLD handler on OS/2. + * main.c (main) [OS/2]: Special handling for paths in OS/2. + * configure.in [OS/2]: Force SA_RESTART for OS/2. + * Makefile.am (check-regression): Use $(EXEEXT) for Windows-type + systems. + +2004-02-21 Paul D. Smith + + * w32/subproc/sub_proc.c (process_easy) [W32]: Christoph Schulz + reports that if process_begin() fails we don't + handle the error condition correctly in all cases. + * w32/subproc/w32err.c (map_windows32_error_to_string): Make sure + to have a newline on the message. + + * job.c (construct_command_argv_internal): Add "test" to UNIX + sh_cmds[]. Fixes Savannah bug # 7606. + +2004-02-04 Paul D. Smith + + * job.c (vms_handle_apos) [VMS]: Fix various string handling + situations in VMS DCL. Fixes Savannah bug #5533. Fix provided by + Hartmut Becker . + +2004-01-21 Paul D. Smith + + * job.c (load_too_high): Implement an algorithm to control the + "thundering herd" problem when using -l to control job creation + via the load average. The system only recomputes the load once a + second but we can start many jobs in a second. To solve this we + keep track of the number of jobs started in the last second and + apply a weight to try to guess what a correct load would be. + The algorithm was provided by Thomas Riedl . + Also fixes bug #4693. + (reap_children): Decrease the job count for this second. + (start_job_command): Increase the job count for this second. + + * read.c (conditional_line): Expand the text after ifn?def before + checking to see if it's a single word. Fixes bug #7257. + +2004-01-09 Paul D. Smith + + * file.c (print_file): Recurse to print all targets in + double-colon rules. Fixes bug #4518, reported (with patch) by + Andrew Chatham . + +2004-01-07 Paul D. Smith + + * acinclude.m4: Remove make_FUNC_SETVBUF_REVERSED. + * configure.in: Change make_FUNC_SETVBUF_REVERSED to + AC_FUNC_SETVBUF_REVERSED. + + * doc/make.texi (Target-specific): Fix Savannah bug #1772. + (MAKE Variable): Fix Savannah bug #4898. + + * job.c (construct_command_argv_internal): Add "!" to the list of + shell escape chars. POSIX sh allows it to appear before a + command, to negate the exit code. Fixes bug #6404. + + * implicit.c (pattern_search): When matching an implicit rule, + remember which dependencies have the ignore_mtime flag set. + Original fix provided in Savannah patch #2349, by Benoit + Poulot-Cazajous . + +2003-11-22 Paul D. Smith + + * README.W32.template (Outputs): Clarification on -j with + BATCH_MODE_ONLY_SEHLL suggested by Jonathan R. Grant + . + +2003-11-02 Paul D. Smith + + * function.c (func_if): Strip all the trailing whitespace from the + condition, then don't expand it. Fixed bug # 5798. + + * expand.c (recursively_expand_for_file): If we're expanding a + variable with no file context, then use the variable's context. + Fixes bug # 6195. + +2003-10-21 Paul D. Smith + + * main.c (log_working_directory): Add newlines to printf()s. + + * README.cvs: Add a note to ignore warnings during autoreconf. + + * maintMakefile (po_repo): Set a new URL for PO file updates. + (get-config/config.guess get-config/config.sub): Get these files + from the Savannah config project instead of ftp.gnu.org. + +2003-10-05 Paul Eggert + + * main.c (main): Avoid potential subscript error if environ has + short strings. + +2003-08-22 Paul D. Smith + + * misc.c (xmalloc, xrealloc): Add one to 0 sizes, to cater to + systems which don't yet implement the C89 standard :-/. + +2003-07-18 Paul D. Smith + + * dir.c (directory_contents_hash_1, directory_contents_hash_1) + [WINDOWS32]: Initialize hash. + +2003-06-19 Earnie Boyd + + * dir.c (read_dirstream): Provide a workaround for broken versions of + the MinGW dirent structure. + +2003-05-30 Earnie Boyd + + * w32/include/dirent.h: Add __MINGW32__ filter. + +2003-05-30 Earnie Boyd + + * make.h: Add global declaration of *make_host. + * main.c (print_usage): Remove local declaration of *make_host. + (print_version): Display "This program built for ..." after Copyright + notice. + +2003-05-30 Earnie Boyd + + * doc/make.texi: Change "ifinfo" to "ifnottex" as suggested by the + execution of "makeinfo --html make.texi". + +2003-04-30 Paul D. Smith + + * build.template: Make some changes to maybe allow this script to + work on DOS/Windows/OS2 systems. Suggested by Andreas Buening. + + * README.OS2.template: New file for OS/2 support. Original + contributed by Andreas Buening. + * configure.in: Invoke new pds_AC_DOS_PATHS macro to test for + DOS-style paths. + +2003-04-19 Paul D. Smith + + Fix bug #1405: allow a target to match multiple pattern-specific + variables. + + * rule.c (create_pattern_var, lookup_pattern_var): Move these to + variable.c, where they've always belonged. + * rule.h: Move the prototypes and struct pattern_var as well. + * variable.c (initialize_file_variables): Invoke + lookup_pattern_var() in a loop, until no more matches are found. + If a match is found, create a new variable set for the target's + pattern variables. Then merge the contents of each matching + pattern variable set into the target's pattern variable set. + (lookup_pattern_var): Change this function to be usable + in a loop. It takes a starting position: if NULL, start at the + beginning; if non-NULL, start with the pattern variable after that + position, and return the next matching pattern. + (create_pattern_var): Create a unique instance of + pattern-specific variables for every definition in the makefile. + Don't combine the same pattern together. This allows us to + process the variable handling properly even when the same pattern + is used multiple times. + (parse_variable_definition): New function: break out the parsing + of a variable definition line from try_variable_definition. + (try_variable_definition): Call parse_variable_definition to + parse. + (print_variable_data_base): Print out pattern-specific variables. + * variable.h (struct variable): Remember when a variable is + conditional. Also remember its flavor. + (struct pattern_var): Instead of keeping a variable set, we just + keep a single variable for each pattern. + * read.c (record_target_var): Each pattern variable contains only a + single variable, not a set, so create it properly. + * doc/make.texi (Pattern-specific): Document the new behavior. + +2003-04-17 Paul D. Smith + + * dir.c (file_exists_p) [VMS]: Patch provided with Bug #3018 by + Jean-Pierre Portier . I don't understand the + file/directory naming rules for VMS so I can't tell whether this + is correct or not. + +2003-04-09 Paul D. Smith + + * configure.in (HAVE_DOS_PATHS): Define this on systems that need + DOS-style pathnames: backslash separators and drive specifiers. + +2003-03-28 Paul D. Smith + + * file.c (snap_deps): If .SECONDARY with no targets is given, set + the intermediate flag on all targets. Fixes bug #2515. + +2003-03-24 Paul D. Smith + + * configure.in, Makefile.am, glob/Makefile.am, doc/Makefile.am: + Upgrade to autoconf 2.57 and automake 1.7.3. + + * job.c: More OS/2 changes from Andreas Buening. + + * file.c (print_file): Fix variable initialization. + Fixes bug #2892. + + * remake.c (notice_finished_file): + + * make.h (ENULLLOOP): Set errno = 0 before invoking the command; + some calls (like readdir()) return NULL in valid situations + without resetting errno. Fixes bug #2846. + +2003-02-25 Paul D. Smith + + Port to OS/2 (__EMX__) by Andreas Buening . + + * job.c (_is_unixy_shell) [OS/2]: New function. + Set default shell to /bin/sh. + (reap_children): Close the job_rfd pipe here since we don't use a + SIGCHLD handler. + (set_child_handler_action_flags): define this to empty on OS/2. + (start_job_command): Close the jobserver pipe and use + child_execute_job() instead of fork/exec. + (child_execute_job): Rewrite to handle stdin/stdout FDs and spawn + rather than exec'ing, then reconfigure stdin/stdout. + (exec_command): Rewrite to use spawn instead of exec. Return the + PID of the child. + + * main.c (main) [OS/2]: Call initialize_main(). Handle argv[0] as + in DOS. Handle the TEMP environment variable as in DOS. Don't + use a SIGCHLD handler on OS/2. Choose a shell as in DOS. Don't + use -j in DOS mode. Use child_execute_job() instead of + exec_command(). + + * function.c (func_shell) [OS/2]: Can't use fork/exec on OS/2: use + spawn() instead. + + * job.h [OS/2]: Move CLOSE_ON_EXEC here from job.c. Add + prototypes that return values. + + * remake.c (f_mtime) [OS/2]: Handle FAT timestamp offsets for OS/2. + + * read.c (readline) [OS/2]: Don't handle CRLF specially on OS/2. + * default.c (default_suffixes) [OS/2]: Set proper default suffixes + for OS/2. + * vpath.c (construct_vpath_list) [OS/2]: Handle OS/2 paths like + DOS paths. + +2003-02-24 Paul D. Smith + + * default.c [VMS]: New default rules for .cxx -> .obj compiles. + * job.c (child_execute_job) [VMS]: New code for handling spawn(). + (child_execute_job) [VMS]: Handle error status properly. + Patches provided by Hartmut Becker . + + * function.c (func_shell): Use EINTRLOOP() while reading from the + subshell pipe (Fixes bug #2502). + * job.c (free_child): Use EINTRLOOP() while writing tokens to the + jobserver pipe. + * main.c (main): Ditto. + +2003-01-30 Paul D. Smith + + * read.c (eval): eval() was not fully reentrant, because the + collapsed buffer was static. Change it to be an automatic + variable so that eval() can be invoked recursively. + Fixes bug # 2238. + (eval): Apply patch # 1022: fix memory reference error on long + target-specific variable lines. + Patch provided by Steve Brown . + + * function.c (check_numeric): Combine the is_numeric() function + into this function, since it's only called from one place. + Constify this function. Have it print the incorrect string in the + error message. Fixes bug #2407. + (strip_whitespace): Constify. + (func_if): Constify. + * expand.c (expand_argument): Constify. + +2003-01-29 Paul D. Smith + + Fix bug # 2169, also reported by other people on various systems. + + * make.h: Some systems, such as Solaris and PTX, do not fully + implement POSIX-compliant SA_RESTART functionality; important + system calls like stat() and readdir() can still fail with EINTR + even if SA_RESTART has been set on the signal handler. So, + introduce macros EINTRLOOP() and ENULLLOOP() which can loop on + EINTR for system calls which return -1 or 0 (NULL), respectively, + on error. + Also, remove the old atomic_stat()/atomic_readdir() and + HAVE_BROKEN_RESTART handling. + + * configure.in: Remove setting of HAVE_BROKEN_RESTART. + + * arscan.c (ar_member_touch): Use EINTRLOOP() to wrap fstat(). + * remake.c (touch_file): Ditto. + + * commands.c (delete_target): Use EINTRLOOP() to wrap stat(). + * read.c (construct_include_path): Ditto. + * remake.c (name_mtime): Ditto. + * vpath.c (selective_vpath_search): Ditto. + * dir.c (find_directory): Ditto. + (local_stat): Ditto. + (find_directory): Use ENULLLOOP() to wrap opendir(). + (dir_contents_file_exists_p): Use ENULLLOOP() to wrap readdir(). + + * misc.c: Remove HAVE_BROKEN_RESTART, atomic_stat(), and + atomic_readdir() handling. + +2003-01-22 Paul D. Smith + + * function.c (func_call): Fix Bug #1744. If we're inside a + recursive invocation of $(call ...), mask any of the outer + invocation's arguments that aren't used by this one, so that this + invocation doesn't "inherit" them accidentally. + +2002-12-05 Paul D. Smith + + * function.c (subst_expand): Valery Khamenia reported a + pathological performance hit when doing substitutions on very + large values with lots of words: turns out we were invoking + strlen() a ridiculous number of times. Instead of having each + call to sindex() call strlen() again, keep track of how much of + the text we've seen and pass the length to sindex(). + +2002-11-19 Paul D. Smith + + * README.cvs, configure.in: Upgrade to require autoconf 2.56. + + +2002-11-16 Paul D. Smith + + * NMakefile.template (OBJS): Add hash.c object file. + * SMakefile.template (srcs): Ditto. + * Makefile.ami (objs): Ditto. + * build_w32.bat: Ditto. + + * Makefile.DOS.template: Remove extra dependencies. + +2002-10-25 Paul D. Smith + + * expand.c (install_variable_buffer): New function. Install a new + variable_buffer context and return the previous one. + (restore_variable_buffer): New function. Free the current + variable_buffer context and put a previously saved one back. + * variable.h: Prototypes for {install,restore}_variable_buffer. + * function.c (func_eval): Push a new variable_buffer context + before we eval, then restore the old one when we're done. + Fixes Bug #1517. + + * read.c (install_conditionals): New function. Install a new + conditional context and return the previous one. + (restore_conditionals): New function. Free the current + conditional context and put a previously saved one back. + (eval): Use the {install,restore}_conditionals for "include" + handling. + (eval_buffer): Use {install,restore}_conditionals to preserve the + present conditional state before we evaluate the buffer. + Fixes Bug #1516. + + * doc/make.texi (Quick Reference): Add references to $(eval ...) + and $(value ...). + (Recursion): Add a variable index entry for CURDIR. + + * README.cvs: Update to appropriate versions. + * Makefile.am (nodist_loadavg_SOURCES): automake gurus point out I + don't need to copy loadavg.c: automake is smart enough to create + it for me. Still have a bug in automake related to ansi2knr tho. + +2002-10-14 Paul D. Smith + + * remake.c (notice_finished_file): Only touch targets if they have + at least one command (as per POSIX). Resolve Bug #1418. + + * *.c: Convert to using ANSI C-style function definitions. + * Makefile.am: Enable the ansi2knr feature of automake. + * configure.in: ditto. + +2002-10-13 Paul D. Smith + + * commands.c (set_file_variables): Bug #1379: Don't use alloca() + for automatic variable values like $^, etc. In the case of very + large lists of prerequisites this causes problems. Instead reuse + a static buffer (resizeable) for each variable. + + * read.c (eval): Fix Bug #1391: allow "export" keyword in + target-specific variable definitions. Check for it and set an + "exported" flag. + (record_target_var): Set the export field to v_export if the + "exported" flag is set. + * doc/make.texi (Target-specific): Document the ability to use + "export". + + * doc/make.texi: Change the name of the section on automatic + variables from "Automatic" to "Automatic Variables". Added text + clarifying the scope of automatic variables. + +2002-10-04 Paul D. Smith + + * read.c (eval): Allow SysV $$@ variables to use {} braces as well + as () braces. + (record_files): Ditto. + + * expand.c (variable_expand_string): In $(A:x=y) expansion limit + the search for the '=' to only within the enclosing parens. + +2002-10-03 Paul D. Smith + + Version 3.80 released. + + * dir.c: Change hash functions to use K&R function definition style. + * function.c: Ditto. + * read.c: Ditto. + * variable.c: Ditto. + + Update to automake 1.7. + + * Makefile.am (AUTOMAKE_OPTIONS): Update to require 1.7. + (pdf): Remove this target as automake now provides one. + + * configure.in: Change AM_CONFIG_HEADER to AC_CONFIG_HEADERS. + +2002-09-30 Martin P.J. Zinser + + * makefile.com: Updates for GNU make 3.80. + * makefile.vms: Ditto. + +2002-09-23 Paul D. Smith + + * read.c (enum make_word_type): Remove w_comment. + (get_next_mword): Don't treat comment characters as special; where + this function is used we will never see a comment (it's stripped + before we get here) and treating comments specially means that + targets like "foo\#bar" aren't handled properly. + +2002-09-18 Paul D. Smith + + * doc/make.texi (Bugs): Update with some info on Savannah, etc. + + * read.c (eval): Expansion of arguments to export/unexport was + ignoring all arguments after the first one. Change the algorithm + to expand the whole line once, then parse the results. + +2002-09-17 Paul D. Smith + + Fix Bug #940 (plus another bug I found while looking at this): + + * read.c (record_target_var): enter_file() will add a new entry if + it's a double-colon target: we don't want to do that in this + situation. Invoke lookup_file() and only enter_file() if it does + not already exist. If the file we get back is a double-colon then + add this variable to the "root" double-colon target. + + * variable.c (initialize_file_variables): If this file is a + double-colon target but is not the "root" target, then initialize + the root and make the root's variable list the parent of our + variable list. + +2002-09-13 Paul D. Smith + + * doc/make.texi (MAKE Variable): Add some indexing for "+". + + * hash.c (round_up_2): Get rid of a warning. + +2002-09-12 Paul D. Smith + + * Makefile.am (loadavg_SOURCES, loadavg.c): Tiptoe around automake + so it doesn't complain about getloadavg.c. + + * commands.c (set_file_variables): Make sure we always alloca() at + least 1 character for the value of $? (for '\0'). + +2002-09-11 Paul D. Smith + + * hash.h (STRING_COMPARE, ISTRING_COMPARE, STRING_N_COMPARE): Fix + macro to use RESULT instead of the incorrect _RESULT_. + + * make.h (HAVE_BROKEN_RESTART): Add prototypes for atomic_stat() + and atomic_readdir(). We need to #include dirent.h to get this to + work. + * misc.c (atomic_readdir): Fix typos. + +2002-09-10 Paul D. Smith + + * read.c (eval): Expand variable lists given to export and + unexport, so that "export $(LIST_OF_VARIABLES)" (etc.) works. + (conditional_line): Ditto for "ifdef". Fixes bug #103. + + * doc/make.texi (Variables/Recursion): Document this. + (Conditional Syntax): And here. + +2002-09-09 Paul D. Smith + + * configure.in: Check for memmove(). + +2002-09-07 Paul D. Smith + + * configure.in (HAVE_BROKEN_RESTART): Define this on PTX systems; + Michael Sterrett reports that while it has + SA_RESTART, it does not work properly. + + * misc.c (atomic_stat): If HAVE_BROKEN_RESTART, create a function + that invokes stat() and loops to do it again if it returns EINTR. + (atomic_readdir): Ditto, with readdir(). + + * make.h (stat, readdir): If HAVE_BROKEN_RESTART, alias stat() + and readdir() to atomic_stat() and atomic_readdir(). + +2002-09-04 Paul D. Smith + + * implicit.c (pattern_search): Daniel + reports that GNU make sometimes doesn't recognize that targets can + be made, when directories can be created as prerequisites. He + reports that changing the order of predicates in the DEP->changed + flag test so that lookup_file() is always performed, solves this + problem. + +2002-08-08 Paul D. Smith + + * configure.in: Require a newer version of gettext. + + * misc.c (perror_with_name): Translate the format string (for + right-to-left language support). + (pfatal_with_name): Ditto. + + * main.c: Create a static array of strings to store the usage + text. This is done to facilitate translations. + (struct command_switch): Remove argdesc and description fields. + (switches): Remove values for obsolete fields. + (print_usage): Print each element of the usage array. + + * hash.c: Change function definitions to be K&R style. + +2002-08-02 Paul D. Smith + + * NEWS: Remove the mention of .TARGETS; we aren't going to publish + this one because it's too hard to get right. We'll look at it for + a future release. + * main.c (main): Don't create the .TARGETS variable. + * variable.c (handle_special_var): Don't handle .TARGETS. + +2002-08-01 Paul D. Smith + + * main.c (switches): Add a new option, -B (--always-make). If + specified, make will rebuild all targets that it encounters even + if they don't appear to be out of date. + (always_make_flag): New flag. + * make.h: Extern always_make_flag. + * remake.c (update_file_1): Check always_make_flag; if it's set we + will always rebuild any target we can, even if none of its + prerequisites are newer. + * NEWS: Mention it. + + * doc/make.texi (Shell Function): Make it clear that make + variables marked as "export" are not passed to instances of the + shell function. + + Add new introspection variable .VARIABLES and .TARGETS. + + * variable.c (handle_special_var): New function. If the variable + reference passed in is "special" (.VARIABLES or .TARGETS), + calculate the new value if necessary. .VARIABLES is handled here: + walk through the hash of defined variables and construct a value + which is a list of the names. .TARGETS is handled by + build_target_list(). + (lookup_variable): Invoke handle_special_var(). + * file.c (build_target_list): Walk through the hask of known files + and construct a list of the names of all the ones marked as + targets. + * main.c (main): Initialize them to empty (and as simple variables). + * doc/make.texi (Special Variables): Document them. + * NEWS: Mention them. + + * variable.h (struct variable): Add a new flag "exportable" which + is true if the variable name is valid for export. + * variable.c (define_variable_in_set): Set "exportable" when a new + variable is defined. + (target_environment): Use the "exportable" flag instead of + re-checking the name here... an efficiency improvement. + +2002-07-31 Paul D. Smith + + * config.h-vms.template: Updates to build on VMS. Thanks to + Brian_Benning@aksteel.com for helping verify the build. + * makefile.com: Build the new hash.c file. + * hash.h: Use strcpmi(), not stricmp(), in the + HAVE_CASE_INSENSITIVE_FS case. + +2002-07-30 Paul D. Smith + + * hash.h (ISTRING_COMPARE, return_ISTRING_COMPARE): Add missing + backslashes to the HAVE_CASE_INSENSITIVE_FS case. + Reported by . + +2002-07-10 Paul D. Smith + + * variable.c (pop_variable_scope): Remove variable made unused by + new hash infrastructure. + * read.c (dep_hash_cmp): Rewrite this to handle ignore_mtime + comparisons as well as name comparisons. + * variable.h: Add a prototype for new hash_init_function_table(). + * file.c (lookup_file): Remove variables made unused by new hash + infrastructure. + * dir.c (directory_contents_hash_2): Missing return of hash value. + (dir_contents_file_exists_p): Remove variables made unused by new + hash infrastructure. + + + Installed Greg McGary's integration of the hash functions from the + GNU id-utils package: + +2002-07-10 Greg McGary + + * scripts/functions/filter-out: Add literals to to the + pattern space in order to add complexity, and trigger + use of an internal hash table. Fix documentation strings. + * scripts/targets/INTERMEDIATE: Reverse order of files + passed to expected `rm' command. + +2002-07-10 Greg McGary + + * Makefile.am (SRCS): Add hash.c (noinst_HEADERS): Add hash.h + * hash.c: New file, taken from id-utils. + * hash.h: New file, taken from id-utils. + + * make.h (HASH, HASHI): Remove macros. + (find_char_unquote): Change arglist in decl. + (hash_init_directories): New function decl. + * variable.h (hash.h): New #include. + (MAKELEVEL_NAME, MAKELEVEL_LENGTH): New constants. + * filedef.h (hash.h): New #include. + (struct file) [next]: Remove member. + (file_hash_enter): Remove function decl. + (init_hash_files): New function decl. + + * ar.c (ar_name): Delay call to strlen until needed. + * main.c (initialize_global_hash_tables): New function. + (main): Call it. Use MAKELEVEL_NAME & MAKELEVEL_LENGTH. + * misc.c (remove_comments): Pass char constants to find_char_unquote. + * remake.c (notice_finished_file): Update last_mtime on `prev' chain. + + * dir.c (hash.h): New #include. + (struct directory_contents) [next, files]: Remove members. + [ctime]: Add member for VMS. [dirfiles]: Add hash-table member. + (directory_contents_hash_1, directory_contents_hash_2, + directory_contents_hash_cmp): New functions. + (directories_contents): Change type to `struct hash_table'. + (struct directory) [next]: Remove member. + (directory_hash_1, directory_hash_2, directory_hash_cmp): New funcs. + (directory): Change type to `struct hash_table'. + (struct dirfile) [next]: Remove member. + [length]: Add member. [impossible]: widen type to fill alignment gap. + (dirfile_hash_1, dirfile_hash_2, dirfile_hash_cmp): New functions. + (find_directory): Use new hash table package. + (dir_contents_file_exists_p): Likewise. + (file_impossible): Likewise. + (file_impossible_p): Likewise. + (print_dir_data_base): Likewise. + (open_dirstream): Likewise. + (read_dirstream): Likewise. + (hash_init_directories): New function. + + * file.c (hash.h): New #include. + (file_hash_1, file_hash_2, file_hash_cmp): New functions. + (files): Change type to `struct hash_table'. + (lookup_file): Use new hash table package. + (enter_file): Likewise. + (remove_intermediates): Likewise. + (snap_deps): Likewise. + (print_file_data_base): Likewise. + + * function.c + (function_table_entry_hash_1, function_table_entry_hash_2, + function_table_entry_hash_cmp): New functions. + (lookup_function): Remove `table' argument. + Use new hash table package. + (struct a_word) [chain, length]: New members. + (a_word_hash_1, a_word_hash_2, a_word_hash_cmp): New functions. + (struct a_pattern): New struct. + (func_filter_filterout): Pass through patterns noting boundaries + and '%', if present. Note a_word length. Use a hash table if + arglists are large enough to justify cost. + (function_table_init): Renamed from function_table. + (function_table): Declare as `struct hash_table'. + (FUNCTION_TABLE_ENTRIES): New constant. + (hash_init_function_table): New function. + + * read.c (hash.h): New #include. + (read_makefile): Pass char constants to find_char_unquote. + (dep_hash_1, dep_hash_2, dep_hash_cmp): New functions. + (uniquize_deps): Use hash table to efficiently identify duplicates. + (find_char_unquote): Accept two char-constant stop chars, rather + than a string constant, avoiding zillions of calls to strchr. + Tighten inner search loops to test only for desired delimiters. + + * variable.c (variable_hash_1, variable_hash_2, + variable_hash_cmp): New functions. + (variable_table): Declare as `struct hash_table'. + (global_variable_set): Remove initialization. + (init_hash_global_variable_set): New function. + (define_variable_in_set): Use new hash table package. + (lookup_variable): Likewise. + (lookup_variable_in_set): Likewise. + (initialize_file_variables): Likewise. + (pop_variable_scope): Likewise. + (create_new_variable_set): Likewise. + (merge_variable_sets): Likewise. + (define_automatic_variables): Likewise. + (target_environment): Likewise. + (print_variable_set): Likewise. + +2002-07-10 Paul D. Smith + + Implement the SysV make syntax $$@, $$(@D), and $$(@F) in the + prerequisite list. A real SysV make will expand the entire + prerequisites list _twice_: we don't do that as it's a big + backward-compatibility problem. We only replace those specific + variables. + + * read.c (record_files): Replace any $@, $(@D), and $(@F) variable + references left in the list of prerequisites. Check for .POSIX as + we record targets, so we can disable non-POSIX behavior while + reading makefiles as well as running them. + (eval): Check the prerequisite list to see if we have anything + that looks like a SysV prerequisite variable reference. + +2002-07-09 Paul D. Smith + + * doc/make.texi (Prerequisite Types): Add a new section describing + order-only prerequisites. + + * read.c (uniquize_deps): If we have the same file as both a + normal and order-only prereq, get rid of the order-only prereq, + since the normal one supersedes it. + +2002-07-08 Paul D. Smith + + * AUTHORS: Added Greg McGary to the AUTHORS file. + * NEWS: Blurbed order-only prerequisites. + * file.c (print_file): Show order-only deps properly when printing + the database. + + * maintMakefile: Add "update" targets for wget'ing the latest + versions of various external files. Taken from Makefile.maint in + autoconf, etc. + + * dosbuild.bat: Somehow we got _double_ ^M's. Remove them. + Reported by Eli Zaretskii . + +2002-07-07 Paul D. Smith + + * po/*.po: Remove. We'll use wget to retrieve them at release + time. + + * variable.c (do_variable_definition) [W32]: On W32 using cmd + rather than a shell you get an exception. Make sure we look up + the variable. Patch provided by Eli Zaretskii . + + * remake.c (notice_finished_file): Fix handling of -t flag. + Patch provided by Henning Makholm . + + * implicit.c (pattern_search): Some systems apparently run short + of stack space, and using alloca() in this function caused an + overrun. I modified it to use xmalloc() on the two variables + which seemed like they might get large. Fixes Bug #476. + + * main.c (print_version): Update copyright notice to conform with + GNU standards. + (print_usage): Update help output. + + * function.c (func_eval): Create a new make function, $(eval + ...). Expand the arguments, put them into a buffer, then invoke + eval_buffer() on the resulting string. + (func_quote): Create a new function, $(quote VARNAME). Inserts + the value of the variable VARNAME without expanding it any + further. + + * read.c (struct ebuffer): Change the linebuffer structure to an + "eval buffer", which can be either a file or a buffer. + (eval_makefile): Move the code in the old read_makefile() which + located a makefile into here: create a struct ebuffer with that + information. Have it invoke the new function eval() with that + ebuffer. + (eval_buffer): Create a new function that creates a struct ebuffer + that holds a string buffer instead of a file. Have it invoke + eval() with that ebuffer. + (eval): New function that contains the guts of the old + read_makefile() function: this function parses makefiles. Obtains + data to parse from the provided ebuffer. Some modifications to + make the flow of the function cleaner and clearer. Still could + use some work here... + (do_define): Takes a struct ebuffer instead of a FILE*. Read the + contents of the define/endef variable from the ebuffer. + (readstring): Read the next line from a string-style ebuffer. + (readline): Read the next line from an ebuffer. If it's a string + ebuffer, invoke readstring(). If it's a FILE* ebuffer, read it + from the file. + + * dep.h (eval_buffer): Prototype eval_buffer(); + + * variable.c (do_variable_definition): Make sure that all + non-target-specific variables are registered in the global set. + If we're invoked from an $(eval ...) we might be inside a $(call + ...) or other function which has pushed a variable scope; we still + want to define our variables from evaluated makefile code in the + global scope. + +2002-07-03 Greg McGary + + * dep.h (struct dep) [ignore_mtime]: New member. + [changed]: convert to a bitfield. + * implicit.c (pattern_search): Zero ignore_mtime. + * main.c (main, handle_non_switch_argument): Likewise. + * rule.c (convert_suffix_rule): Likewise. + * read.c (read_all_makefiles, read_makefile, multi_glob): Likewise. + (read_makefile): Parse '|' in prerequisite list. + (uniquize_deps): Consider ignore_mtime when comparing deps. + * remake.c (update_file_1, check_dep): Don't force remake for + dependencies that have d->ignore_mtime. + * commands.c (FILE_LIST_SEPARATOR): New constant. + (set_file_variables): Don't include a + prerequisite in $+, $^ or $? if d->ignore_mtime. + Define $|. + +2002-06-18 Paul D. Smith + + * make.texinfo: Updates for next revision. New date/rev/etc. + Recreate all Info menus. Change license on the manual to the GNU + Free Documentation License. A number of typos. + (Variables Simplify): Don't use "-" before it's defined. + (Automatic Prerequisites): Rewrite the target example to work + properly if the compile fails. Remove incorrect comments about + how "set -e" behaves. + (Text Functions): Move the "word", "wordlist", "words", and + "firstword" functions here, from "File Name Functions". + * make-stds.texi: Update from latest GNU version. + * fdl.texi: (created) Import the latest GNU version. + +2002-06-06 Paul D. Smith + + * variable.c (do_variable_definition): New function: extract the + part of try_variable_definition() that actually sets the value + into a separate function. + (try_variable_definition): Call do_variable_definition() after + parsing the variable definition string. + (define_variable_in_set): Make the name argument const. + + * variable.h (enum variable_flavor): Make public. + (do_variable_definition): Create prototype. + + * read.c (read_all_makefiles): Create a new built-in variable, + MAKEFILE_LIST. + (read_makefile): Add each makefile read in to this variable value. + +2002-05-18 Eli Zaretskii + + * Makefile.DOS.template: Tweak according to changes in the + distribution. Add back the dependencies of *.o files. + + * configh.dos.template: Synchronize with config.h.in. + +2002-05-09 Paul D. Smith + + * file.c (file_timestamp_now): Use K&R function declaration. + + * getloadavg.c (getloadavg): Merge setlocale() fix from sh-utils + getloadavg.c. Autoconf thinks QNX is SVR4-like, but it isn't, so + #undef it. Remove predefined setup of NLIST_STRUCT. Decide + whether to include nlist.h based on HAVE_NLIST_H. Change obsolete + NLIST_NAME_UNION to new HAVE_STRUCT_NLIST_N_UN_N_NAME. + * configure.in (NLIST_STRUCT): Define this if we have nlist.h and + nlist.n_name is a pointer rather than an array. + + * acinclude.m4 (make_FUNC_SETVBUF_REVERSED): Grab the latest + version of AC_FUNC_SETVBUF_REVERSED from autoconf CVS. + * configure.in: Use it instead of the old version. + + * main.c (main): Prefer setvbuf() to setlinebuf(). + +2002-05-08 Paul D. Smith + + * Makefile.am (make_LDADD): Add GETLOADAVG_LIBS. + (loadavg_LDADD): Ditto. + +2002-04-29 Paul D. Smith + + * expand.c (recursively_expand_for_file): Rename + recursively_expand() to recursively_expand_for_file() and provide + an extra argument, struct file. If the argument is provided, set + the variable scope to that of the file before expanding. + * variable.h (recursively_expand): Make this a macro that invokes + recursively_expand_for_file() with a NULL file pointer. + * variable.c (target_environment): Call the renamed function and + provide the current file context. + Fixes Debian bug #144306. + +2002-04-28 Paul D. Smith + + Allow $(call ...) user-defined variables to be self-referencing + without throwing an error. Allows implementation of transitive + closures, among other possibly useful things. + Requested by: Philip Guenther + + * variable.h (struct variable): Add a new field: exp_count, and + new macros to hold its size and maximum value. + (warn_undefined): Make this a macro. + * variable.c (define_variable_in_set): Initialize it. + * expand.c (recursively_expand): If we detect recursive expansion + of a variable, check the exp_count field. If it's greater than 0 + allow the recursion and decrement the count. + (warn_undefined): Remove this (now a macro in variable.h). + * function.c (func_call): Before we expand the user-defined + function, modify its exp_count field to contain the maximum + number of recursive calls we'll allow. After the call, reset it + to 0. + +2002-04-21 Paul D. Smith + + Modified to use latest autoconf (2.53), automake (1.6.1), and + gettext (0.11.1). We're using gettext's new "external" support, + to avoid including libintl source with GNU make. + + * README.cvs: New file. Explain how to build GNU make from CVS. + + * configure.in: Modify checking for the system glob library. + Use AC_EGREP_CPP instead of AC_TRY_CPP. Remove the setting of + GLOBDIR (we will always put "glob" in SUBDIRS, so automake + etc. will manage it correctly). Set an automake conditional + USE_LOCAL_GLOB to decide whether to compile the glob library. + + * getloadavg.c (main): Include make.h in the "TEST" program to + avoid warnings. + + * Makefile.am: Remove special rules for loadavg. Replace them + with Automake capabilities for building extra programs. + + * signame.c: This file does nothing if the system provide + strsignal(). If not, it implements strsignal(). If the system + doesn't define sys_siglist, then we make our own; otherwise we use + the system version. + * signame.h: Removed. + + * main.c (main): No need to invoke signame_init(). Update copyright. + + * ABOUT-NLS: Removed. + * gettext.c: Removed. + * gettext.h: Get a simplified copy from the gettext package. + * po/*: Created. + * i18n/*.po: Moved to po/. + * i18n/: Removed. + + * config/*: Created. Contains package configuration helper files. + * config.guess, config.sub: Moved to config directory. + + * configure.in (AC_CONFIG_FILES): Add po/Makefile.in, config/Makefile. + Rework to use new-style autoconf features. Use the "external" + mode for gettext. Make the build.sh config file conditional on + whether build.sh.in exists, to avoid autoconf errors. + * acinclude.m4: Removed almost all macros as being obsolete. + Rewrote remaining macros to use AC_DEFINE. + * acconfig.h: Removed. + + * Makefile.am (EXTRA_DIST): Add config/config.rpath. Use a + conditional to handle customs support. Remove special handling + for i18n features. + +2002-04-20 Paul D. Smith + + * function.c (func_call): Don't mark the argument variables $1, + etc. as recursive. They've already been fully expanded so + there's no need to do it again, and doing so strips escaped $'s. + Reported by Sebastian Glita . + + * remake.c (notice_finished_file): Walk through double-colon + entries via the prev field, not the next field! + Reported by Greg McGary . + + * main.c (main): If the user specifies -q and asks for a specific + target which is a makefile, we got an assert. In that case it + turns out we should continue normally instead. + + * i18n/de.po, i18n/fr.po: Installed an updated translation. + + * i18n/he.po: Installed a new translation. + +2002-01-07 Paul D. Smith + + * i18n/es.po, i18n/ru.po: Installed an updated translation. + +2001-12-04 Paul D. Smith + + * i18n/ja.po: Installed an updated translation. + +2001-09-06 Paul Eggert + + * configure.in (AC_CHECK_HEADERS): Add sys/resource.h. + (AC_CHECK_FUNCS): Add getrlimit, setrlimit. + + * main.c: Include if it, getrlimit, and setrlimit + are available. + (main): Get rid of any avoidable limit on stack size. + +2001-09-04 Paul D. Smith + + * i18n/da.po: Installed an updated translation. + +2001-08-03 Paul D. Smith + + * i18n/fr.po: Installed an updated translation. + Resolves Debian bug #106720. + +2001-06-13 Paul D. Smith + + * i18n/da.po, configure.in (ALL_LINGUAS): Installed a new + translation. + +2001-06-11 Paul D. Smith + + * i18n/ko.po: Installed a new translation. + +2001-05-06 Paul D. Smith + + Modify the EINTR handling. + + * job.c (new_job): Reorganize the jobserver algorithm. Reorder + the way in which we manage the file descriptor/signal handler race + trap to be more efficient. + +2001-05-06 Paul Eggert + + Restart almost all system calls that are interrupted, instead + of worrying about EINTR. The lone exception is the read() for + job tokens. + + * configure.in (HAVE_SA_RESTART): New macro. + (MAKE_JOBSERVER): Define to 1 only if HAVE_SA_RESTART. + * main.c (main): Use SA_RESTART instead of the old, + nonstandard SA_INTERRUPT. + + * configure.in (AC_CHECK_FUNCS): Add bsd_signal. + * main.c (bsd_signal): New function or macro, + if the implementation doesn't supply it. + (The bsd_signal function will be in POSIX 1003.1-200x.) + (HANDLESIG): Remove. + (main, FATAL_SIG): Use bsd_signal instead of signal or HANDLESIG. + + * make.h (EINTR_SET): Remove. + (SA_RESTART): New macro. + + * arscan.c (ar_member_touch): Don't worry about EINTR. + * function.c (func_shell): Likewise. + * job.c (reap_children, free_child, new_job): Likewise. + * main.c (main): Likewise. + * remake.c (touch_file, name_mtime): Likewise. + + * arscan.c (ar_member_touch): Fix bug uncovered by EINTR removal; + if fstat failed with errno!=EINTR, the error was ignored. + + * job.c (set_child_handler_action_flags): New function. + (new_job): Use it to temporarily clear the SIGCHLD action flags + while reading the token. + +2001-05-02 Paul D. Smith + + * job.c (start_job_command): Don't add define/endef per-line flags + to the top-level flags setting. + +2001-04-03 Paul D. Smith + + * arscan.c (VMS_get_member_info,ar_scan) [VMS]: VMS sets the low + bit on error, so check for odd return values, not non-0 return + values. + (VMS_get_member_info): Calculate the timezone differences correctly. + Reported by John Fowler . + + +2001-03-14 Paul D. Smith + + * variable.c (lookup_variable) [VMS]: Null-terminate the variable + value before invoking define_variable(). + Reported by John Fowler . + +2001-02-07 Paul D. Smith + + * read.c (record_target_var): If we reset the variable due to a + command-line variable setting overriding it, turn off the "append" + flag. + +2001-01-17 Paul D. Smith + + * variable.c (lookup_variable) [VMS]: When getting values from the + environment, allocate enough space for the _value_ plus escapes, + not enough space for the name plus escapes :-/. + Reported by John Fowler . + + * remake.c (f_mtime): Removed the "***" prefix from the mod time + warnings that make generates, so it doesn't look like an error. + Reported by Karl Berry . + + + Fix for PR/2020: Rework appended target-specific variables. I'm + fairly confident this algorithm is finally correct. + + * expand.c (allocated_variable_append): Rewrite. Instead of + expanding each appended variable then adding all the expanded + strings together, we append all the unexpanded values going up + through the variable set contexts, then expand the final result. + This behaves just like non-target-specific appended variable + values, while the old way didn't in various corner cases. + (variable_append): New function: recursively append the unexpanded + value of a variable, walking from the outermost variable scope to + the innermost. + * variable.c (lookup_variable): Remove the code that looked up the + variable set list if the found variable was "append". We don't + need this anymore. + (lookup_variable_in_set): Make this non-static so we can use it + elsewhere. + (try_variable_definition): Use lookup_variable_in_set() rather + than faking out current_variable_set_list by hand (cleanup). + * variable.h: Add a prototype for the now non-static + lookup_variable_in_set(). + +2000-11-17 Paul D. Smith + + * remake.c (f_mtime) [WINDOWS32]: On various advice, I changed the + WINDOWS32 port to assume timestamps can be up to 3 seconds away + before throwing a fit. + +2000-11-17 Paul D. Smith + + * read.c (readline): CRLF calculations had a hole, if you hit the + buffer grow scenario just right. Reworked the algorithm to avoid + the need for len or lastlen at all. Problem description with + sample code chages provided by Chris Faylor . + +2000-10-24 Paul D. Smith + + * gettext.c (SWAP): Declare this with the prototype, otherwise + some systems don't work (non-32-bit? Reported for Cray T3E). + Reported by Thorstein Thorsteinsson . + +2000-10-05 Paul D. Smith + + * acinclude.m4 (AM_LC_MESSAGES): Remove undefined macro + AM_LC_MESSAGES; it doesn't seem to do anything anyway?? + + * i18n/gl.po, configure.in (ALL_LINGUAS): New Galician translation. + +2000-09-22 Paul D. Smith + + * gettext.c: Don't #define _GETTEXT_H here; we only include some + parts of the real gettext.h here, and we expect to really include + the real gettext.h later. If we keep this #define, it's ignored. + +2000-09-21 Paul D. Smith + + * main.c (log_working_directory): Rework the text to use complete + sentences, to make life simpler for the translators. + +2000-08-29 Paul D. Smith + + * file.c (remove_intermediates): Print a debug message before we + remove intermediate files, so the user (if she uses -d) knows + what's going on. + +2000-08-21 Paul D. Smith + + * variable.c (try_variable_definition): Change how we handle + target-specific append variable defns: instead of just setting the + value, expand it as an append _but_ only within the current + target's context. Otherwise we lose all but the last value if the + variable is appended more than once within the current target + context. Fixes PR/1831. + +2000-08-16 Paul D. Smith + + * function.c (func_shell): Nul-terminate the buffer before + printing an exec error message (just in case it's not!). + Fixes PR/1860, reported by Joey Hess . + +2000-07-25 Paul D. Smith + + * job.c (construct_command_argv_internal): Add "~" to the list of + sh_chars[] which disallow optimizing out the shell call. + +2000-07-23 Paul Eggert + + * NEWS, make.texinfo: Document .LOW_RESOLUTION_TIME, which + supersedes --disable-nsec-timestamps. + * make.texinfo: Consistently use "time stamp" instead of "timestamp". + * README: Remove --disable-nsec-timestamps. + + * filedef.h (struct file.low_resolution_time): New member. + * file.c (snap_deps): Add support for .LOW_RESOLUTION_TIME. + * remake.c (update_file_1): + Avoid spurious rebuilds due to low resolution time stamps, + generalizing the earlier code that applied only to archive members. + (f_mtime): Archive members always have low resolution time stamps. + + * configure.in: Remove --disable-nsec-timestamps, as this has + been superseded by .LOW_RESOLUTION_TIME. + +2000-07-23 Paul Eggert + + * configure.in (enable_nsec_timestamps): Renamed from + make_cv_nsec_timestamps, since enable/disable options + shouldn't be cached. + +2000-07-23 Bruno Haible + and Paul Eggert + + * file.c (file_timestamp_now): + Use preprocessor-time check for FILE_TIMESTAMP_HI_RES + so that clock_gettime is not linked unless needed. + + * filedef.h (FILE_TIMESTAMP_HI_RES): + Remove definition; "configure" now does this. + + * configure.in (jm_AC_TYPE_UINTMAX_T): Move up, + to before high resolution file timestamp check, + since that check now uses uintmax_t. + (FILE_TIMESTAMP_HI_RES): Define to nonzero if the code should use + high resolution file timestamps. + (HAVE_CLOCK_GETTIME): Do not define if !FILE_TIMESTAMP_HI_RES, + so that we don't link in clock_gettime unnecessarily. + +2000-07-17 Paul D. Smith + + * i18n/ja.po: New version of the translation file. + +2000-07-07 Paul D. Smith + + * remake.c (f_mtime): If NO_FLOAT is defined, don't bother with + the offset calculation. + (name_mtime): Replace EINTR test with EINTR_SET macro. + +2000-07-07 Paul Eggert + + Fix for PR/1811: + + * remake.c (update_file_1): + Avoid spurious rebuilds of archive members due to their + timestamp resolution being only one second. + (f_mtime): Avoid spurious warnings of timestamps in the future due to + the clock's resolution being lower than file timestamps'. + When warning about future timestamps, report only the discrepancy, + not the absolute value of the timestamp and the current time. + + * file.c (file_timestamp_now): New arg RESOLUTION. + * filedef.h (file_timestamp_now): Likewise. + (FILE_TIMESTAMP_NS): Now returns int. All uses changed. + +2000-07-05 Paul D. Smith + + * variable.c (lookup_variable) [VMS]: Remove vestigial references + to listp. Fixes PR/1793. + +2000-06-26 Paul Eggert + + * Makefile.am (MAINTAINERCLEANFILES): New macro, with stamp-pot in it. + + * dir.c (vms_hash): Ensure ctype macro args are nonnegative. + + * remake.c (f_mtime): Remove unused var memtime. + +2000-06-25 Martin Buchholz + + * make.texinfo, NEWS, TODO.private: Minor spelling corrections. + Ran spell-check on make.texinfo. + +2000-06-23 Paul D. Smith + + * main.c (main): Replace EXIT_SUCCESS, EXIT_FAILURE, and + EXIT_TROUBLE with MAKE_SUCCESS, MAKE_FAILURE, and MAKE_TROUBLE. + * make.h: Define these macros. + + * Version 3.79.1 released. + + * configure.in: Add a new option, --disable-nsec-timestamps, to + avoid using sub-second timestamps on systems that support it. It + can lead to problems, e.g. if your makefile relies on "cp -p". + * README.template: Document the issue with "cp -p". + + * config.guess, config.sub: Updated. + + + +See ChangeLog.2, available in the CVS repository at: + + http://savannah.gnu.org/cvs/?group=make + +for earlier changes. + + +Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free +Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..095b1eb --- /dev/null +++ b/INSTALL @@ -0,0 +1,231 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + +By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.DOS b/Makefile.DOS new file mode 100644 index 0000000..58c950c --- /dev/null +++ b/Makefile.DOS @@ -0,0 +1,763 @@ +# -*-Makefile-*- template for DJGPP +# Makefile.in generated automatically by automake 1.2 from Makefile.am +# +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, +# 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +SHELL = /bin/sh + +srcdir = . +VPATH = $(srcdir) +# $DJDIR is defined automatically by DJGPP to point +# to the root of the DJGPP installation tree. +prefix = /dev/env/DJDIR +exec_prefix = ${prefix} + +bindir = /bin +datadir = /share +libdir = /lib +infodir = /info +mandir = /man +includedir = /include +oldincludedir = c:/djgpp/include + +DESTDIR = /dev/env/DJDIR + +pkgdatadir = $(datadir)/make +pkglibdir = $(libdir)/make +pkgincludedir = $(includedir)/make +localedir = $(datadir)/locale + +INSTALL = ${exec_prefix}/bin/ginstall -c +INSTALL_PROGRAM = ${exec_prefix}/bin/ginstall -c +INSTALL_DATA = ${exec_prefix}/bin/ginstall -c -m 644 +INSTALL_SCRIPT = ${exec_prefix}/bin/ginstall -c +transform = s,x,x, + +# This will fail even if they don't have a Unix-like shell (stock DOS +# shell doesn't know about `false'). The only difference is that they +# get "Error -1" instead of "Error 1". +EXIT_FAIL = false + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +EXEEXT = .exe +OBJEXT = o + +AR = ar +AWK = gawk +CC = gcc +CPP = gcc -E +LIBOBJS = +MAKEINFO = ${exec_prefix}/bin/makeinfo +PACKAGE = make +PERL = perl +RANLIB = ranlib +REMOTE = stub +VERSION = 3.82 + +AUTOMAKE_OPTIONS = 1.2 + +bin_PROGRAMS = make$(EXEEXT) + +make_SOURCES = ar.c arscan.c commands.c default.c dir.c expand.c file.c function.c getopt.c getopt1.c implicit.c job.c main.c misc.c read.c remake.c rule.c signame.c strcache.c variable.c version.c vpath.c hash.c remote-$(REMOTE).c +# This should include the glob/ prefix +libglob_a_SOURCES = glob/fnmatch.c glob/glob.c glob/fnmatch.h glob/glob.h +make_LDADD = glob/libglob.a + +man_MANS = make.1 + +INCLUDES = -I$(srcdir)/glob -DLIBDIR=\"$(prefix)$(libdir)\" -DINCLUDEDIR=\"$(prefix)$(includedir)\" -DLOCALEDIR=\"$(prefix)$(localedir)\" + +BUILT_SOURCES = README build.sh-in + +EXTRA_DIST = $(BUILT_SOURCES) $(man_MANS) README.customs remote-cstms.c make-stds.texi texinfo.tex SCOPTIONS SMakefile Makefile.ami README.Amiga config.ami amiga.c amiga.h NMakefile README.DOS configh.dos configure.bat makefile.com README.W32 build_w32.bat config.h-W32 subproc.bat make.lnk config.h-vms makefile.vms readme.vms vmsdir.h vmsfunctions.c vmsify.c + +SUBDIRS = glob doc +mkinstalldirs = ${exec_prefix}/bin/gmkdir -p +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = build.sh +PROGRAMS = $(bin_PROGRAMS) + +MAKE_HOST = i386-pc-msdosdjgpp + + +DEFS = -I. -I$(srcdir) -I. +CPPFLAGS = -DHAVE_CONFIG_H +LDFLAGS = +LIBS = +make_OBJECTS = ar.o arscan.o commands.o default.o dir.o expand.o file.o function.o getopt.o getopt1.o implicit.o job.o main.o misc.o read.o remake.o rule.o signame.o strcache.o variable.o version.o vpath.o hash.o remote-$(REMOTE).o +make_DEPENDENCIES = glob/libglob.a +make_LDFLAGS = +libglob_a_LIBADD = +libglob_a_OBJECTS = fnmatch.o glob.o +noinst_LIBRARIES = glob/libglob.a +CFLAGS = -O2 -g +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) +LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@ +TEXI2DVI = texi2dvi +TEXINFO_TEX = $(srcdir)/config/texinfo.tex +INFO_DEPS = doc/make.info +DVIS = doc/make.dvi +TEXINFOS = doc/make.texi +noinst_TEXINFOS = doc/fdl.texi doc/make-stds.texi +man1dir = $(mandir)/man1 +MANS = $(man_MANS) + +NROFF = nroff +DIST_COMMON = README ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 alloca.c build.sh-in config.h-in configure configure.in getloadavg.c + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = gtar +GZIP = --best +SOURCES = $(make_SOURCES) +OBJECTS = $(make_OBJECTS) +HEADERS = $(wildcard $(srcdir)/*.h) + +default: all + +.SUFFIXES: +.SUFFIXES: .c .dvi .info .o .obj .ps .texi .tex .html + +mostlyclean-hdr: + +clean-hdr: + +distclean-hdr: + -rm -f config.h + +maintainer-clean-hdr: + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do if test -f $$p; then echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`"; $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; else :; fi; done + +uninstall-binPROGRAMS: + $(NORMAL_UNINSTALL) + list='$(bin_PROGRAMS)'; for p in $$list; do rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`.exe; done + +.c.o: + $(COMPILE) -c $< + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) *$(EXEEXT) make.new core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c *_tab.c + +maintainer-clean-compile: + +make$(EXEEXT): $(make_OBJECTS) $(make_DEPENDENCIES) + @command.com /c if exist make del make + @command.com /c if exist make.exe del make.exe + $(LINK) $(make_LDFLAGS) $(make_OBJECTS) $(make_LDADD) $(LIBS) + +# Documentation + +make.info: make.texi +make.dvi: make.texi +make.ps: make.dvi make.texi +make.html: make.texi + + +DVIPS = dvips + +.texi.info: + @command.com /c if exist make.info* del make.info* + @command.com /c if exist make.i* del make.i* + $(MAKEINFO) -I$(srcdir) --no-split $< -o ./$@ + +.texi: + @command.com /c if exist make.info* del make.info* + @command.com /c if exist make.i* del make.i* + $(MAKEINFO) -I$(srcdir) --no-split $< -o ./$@ + +.texi.dvi: + TEXINPUTS="$(srcdir);$$TEXINPUTS" MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< + +.dvi.ps: + $(DVIPS) $< -o $@ + +# Other documentation formats + +html: html-recursive + +.texi.html: + @command.com /c if exist make.html* del make.html* + $(MAKEINFO) --html -I$(srcdir) --no-split $< -o ./$@ + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(infodir) + @for file in $(INFO_DEPS); do iifile=`echo $$file | sed "s|doc/||"`; d=$(srcdir); for ifile in `cd $$d && echo $$file`; do if test -f $$d/$$ifile; then echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$iifile"; $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$iifile; else : ; fi; done; done + @$(POST_INSTALL) + @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then for file in $(INFO_DEPS); do iifile=`echo $$file | sed "s|doc/||"`; echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$iifile"; install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$iifile || :; done; else : ; fi + +uninstall-info: + $(PRE_UNINSTALL) + @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then ii=yes; else ii=; fi; for file in $(INFO_DEPS); do test -z $ii || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; done + $(NORMAL_UNINSTALL) + for file in $(INFO_DEPS); do (cd $(DESTDIR)$(infodir) && rm -f $$file); done + +dist-info: $(INFO_DEPS) + for base in $(INFO_DEPS); do d=$(srcdir); for file in `cd $$d && eval echo $$base*`; do test -f $(distdir)/$$file || ln $$d/$$file $(distdir)/$$file 2> /dev/null || cp -p $$d/$$file $(distdir)/$$file; done; done + +mostlyclean-aminfo: + -rm -f $(srcdir)/doc/make.aux $(srcdir)/doc/make.cp $(srcdir)/doc/make.cps $(srcdir)/doc/make.dvi \ + $(srcdir)/doc/make.fn $(srcdir)/doc/make.fns $(srcdir)/doc/make.ky $(srcdir)/doc/make.kys \ + $(srcdir)/doc/make.ps $(srcdir)/doc/make.log $(srcdir)/doc/make.pg $(srcdir)/doc/make.toc \ + $(srcdir)/doc/make.tp $(srcdir)/doc/make.tps $(srcdir)/doc/make.vr $(srcdir)/doc/make.vrs \ + $(srcdir)/doc/make.op $(srcdir)/doc/make.tr $(srcdir)/doc/make.cv $(srcdir)/doc/make.cn \ + $(srcdir)/doc/make.html + +clean-aminfo: + +distclean-aminfo: + +maintainer-clean-aminfo: + for i in $(INFO_DEPS); do rm -f $$i*; done + +install-man1: + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done + +uninstall-man1: + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done +install-man: $(MANS) + @$(NORMAL_INSTALL) + $(MAKE) install-man1 +uninstall-man: + @$(NORMAL_UNINSTALL) + $(MAKE) uninstall-man1 + +# Assume that the only thing to do in glob is to build libglob.a, +# but do a sanity check: if $SUBDIRS will ever have more than +# a single directory, yell bloody murder. +all-recursive: +ifeq ($(findstring glob, $(SUBDIRS)), glob) + @command.com /c if not exist glob\\nul md glob + @echo Making all in glob + $(MAKE) -C glob -f ../Makefile INCLUDES='-I$(srcdir) -I$(srcdir)/glob' DEFS='-I.. -I$(srcdir)' VPATH=$(srcdir)/glob libglob.a +endif + +$(SUBDIRS): + command.com /c md $@ + +libglob.a: $(libglob_a_OBJECTS) + command.com /c if exist libglob.a del libglob.a + $(AR) cru libglob.a $(libglob_a_OBJECTS) $(libglob_a_LIBADD) + $(RANLIB) libglob.a + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive check-recursive: +ifeq ($(words $(SUBDIRS)), 2) + @echo Making $(shell echo $@ | sed s/-recursive//) in glob + $(MAKE) -C glob -f ../Makefile $(shell echo $@ | sed s/-recursive//)-am + @echo Making $(shell echo $@ | sed s/-recursive//) in doc + $(MAKE) -C doc -f ../Makefile $(shell echo $@ | sed s/-recursive//)-am +else + @echo FATAL: There is more than two directory in "($(SUBDIRS))" + @$(EXIT_FAIL) +endif + +tags-in-glob: $(libglob_a_SOURCES) + etags $(addprefix $(srcdir)/,$^) -o ./glob/TAGS + +tags-recursive: +ifeq ($(words $(SUBDIRS)), 2) + $(MAKE) tags-in-glob +else + @echo FATAL: There is more than two directory in "($(SUBDIRS))" + @$(EXIT_FAIL) +endif + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) + mkid $(srcdir)/$(SOURCES) $(srcdir)/$(libglob_a_SOURCES) ./config.h $(HEADERS) + +TAGS: tags-recursive $(HEADERS) $(srcdir)/$(SOURCES) config.h $(TAGS_DEPENDENCIES) + etags -i ./glob/TAGS $(ETAGS_ARGS) $(srcdir)/$(SOURCES) ./config.h $(HEADERS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + rm -rf $(distdir) + GZIP=$(GZIP) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; cd $(distdir)/=build && ../configure --srcdir=.. --prefix=$$dc_install_base && $(MAKE) && $(MAKE) dvi && $(MAKE) check && $(MAKE) install && $(MAKE) installcheck && $(MAKE) dist + rm -rf $(distdir) + @echo "========================"; echo "$(distdir).tar.gz is ready for distribution"; echo "========================" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir) + rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir) + rm -rf $(distdir) +distdir: $(DISTFILES) + rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + @for file in $(DISTFILES); do d=$(srcdir); test -f $(distdir)/$$file || ln $$d/$$file $(distdir)/$$file 2> /dev/null || cp -p $$d/$$file $(distdir)/$$file; done; for subdir in $(SUBDIRS); do test -d $(distdir)/$$subdir || mkdir $(distdir)/$$subdir || exit 1; chmod 777 $(distdir)/$$subdir; (cd $$subdir && $(MAKE) top_distdir=../$(top_distdir)/$$subdir distdir=../$(distdir)/$$subdir distdir) || exit 1; done + $(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info + $(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook + +info: info-recursive +info-recursive: +ifeq ($(findstring doc, $(SUBDIRS)), doc) + @command.com /c if not exist doc\\nul md doc + @echo Making all in doc + $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.info +endif + +dvi: dvi-recursive +dvi-recursive: +ifeq ($(findstring doc, $(SUBDIRS)), doc) + @command.com /c if not exist doc\\nul md doc + @echo Making all in doc + $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.dvi +endif + +ps: ps-recursive +ps-recursive: +ifeq ($(findstring doc, $(SUBDIRS)), doc) + @command.com /c if not exist doc\\nul md doc + @echo Making all in doc + $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.ps +endif + +html-recursive: +ifeq ($(findstring doc, $(SUBDIRS)), doc) + @command.com /c if not exist doc\\nul md doc + @echo Making all in doc + $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.html +endif + +check: all-am check-recursive check-local + @: +installcheck: installcheck-recursive +all-recursive-am: config.h + $(MAKE) all-recursive + +all-am: Makefile $(PROGRAMS) config.h info + +install-exec-am: install-binPROGRAMS + +install-data-am: install-info-am + +uninstall-am: uninstall-binPROGRAMS uninstall-info + +install-exec: install-exec-recursive install-exec-am + @$(NORMAL_INSTALL) + +install-data: install-data-recursive install-data-am + @$(NORMAL_INSTALL) + +install-recursive uninstall-recursive: + @: + +install: install-recursive install-exec-am install-data-am + @: + +uninstall: uninstall-recursive uninstall-am + +all: all-recursive-am all-am + +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install +installdirs: installdirs-recursive + $(mkinstalldirs) $(bindir) $(infodir) + + +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -rm -f Makefile $(DISTCLEANFILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS mostlyclean-compile mostlyclean-aminfo mostlyclean-tags mostlyclean-generic + +clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-aminfo clean-tags clean-generic mostlyclean-am + +distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile distclean-aminfo distclean-tags distclean-generic clean-am + +maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS maintainer-clean-compile maintainer-clean-aminfo maintainer-clean-tags maintainer-clean-generic distclean-am + +mostlyclean: mostlyclean-recursive mostlyclean-am + +clean: clean-noinstLIBRARIES clean-recursive clean-am + +distclean: distclean-recursive distclean-am + rm -f config.status + +maintainer-clean: maintainer-clean-recursive maintainer-clean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f config.status + +.PHONY: default mostlyclean-hdr distclean-hdr clean-hdr \ +maintainer-clean-hdr mostlyclean-binPROGRAMS distclean-binPROGRAMS \ +clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \ +install-binPROGRAMS mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile install-info-am uninstall-info \ +mostlyclean-aminfo distclean-aminfo clean-aminfo \ +maintainer-clean-aminfo install-data-recursive uninstall-data-recursive \ +install-exec-recursive uninstall-exec-recursive installdirs-recursive \ +uninstalldirs-recursive all-recursive check-recursive check-am \ +installcheck-recursive info-recursive dvi-recursive \ +mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir \ +mostlyclean-depend distclean-depend clean-depend \ +maintainer-clean-depend info dvi check-local installcheck \ +all-recursive-am all-am install-exec-am install-data-am uninstall-am \ +install-exec install-data install uninstall all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean \ +html + + +# --------------- Local DIST Section + +# Install the w32 subdirectory +# +dist-hook: + (cd $(srcdir); \ + w32=`find w32 -follow \( -name CVS -prune \) -o -type f -print`; \ + tar chf - $$w32) \ + | (cd $(distdir); tar xfBp -) + +# --------------- Local CHECK Section + +# Note: check-loadavg is NOT a prerequisite of check-local, since +# there's no uptime utility, and the test it does doesn't make sense +# on MSDOS anyway. +check-local: check-shell check-regression + @banner=" Regression PASSED: GNU Make $(VERSION) ($(MAKE_HOST)) built with $(CC) "; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + echo + +.PHONY: check-loadavg check-shell check-regression + +# > check-shell +# +# check-shell is designed to fail if they don't have a Unixy shell +# installed. The test suite requires such a shell. +check-shell: + @echo If Make says Error -1, you do not have Unix-style shell installed + @foo=bar.exe : + +# > check-loadavg +# +loadavg: loadavg.c config.h + @rm -f loadavg + $(LINK) -DTEST $(make_LDFLAGS) loadavg.c $(LIBS) +# We copy getloadavg.c into a different file rather than compiling it +# directly because some compilers clobber getloadavg.o in the process. +loadavg.c: getloadavg.c + ln $(srcdir)/getloadavg.c loadavg.c || \ + cp $(srcdir)/getloadavg.c loadavg.c +check-loadavg: loadavg + @echo The system uptime program believes the load average to be: + -uptime + @echo The GNU load average checking code believes: + -./loadavg + +# > check-regression +# +# Look for the make test suite, and run it if found. Look in MAKE_TEST if +# specified, or else in the srcdir or the distdir, their parents, and _their_ +# parents. +# +check-regression: + @if test -f "$(srcdir)/tests/run_make_tests"; then \ + if $(PERL) -v >/dev/null 2>&1; then \ + case `cd $(srcdir); pwd` in `pwd`) : ;; \ + *) test -d tests || mkdir tests; \ + for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \ + rm -rf tests/$$f; cp -pr $(srcdir)/tests/$$f tests; \ + done ;; \ + esac; \ + echo "cd tests && $(PERL) ./run_make_tests.pl -make ../make.exe $(MAKETESTFLAGS)"; \ + cd tests && $(PERL) ./run_make_tests.pl -make ../make.exe $(MAKETESTFLAGS); \ + else \ + echo "Can't find a working Perl ($(PERL)); the test suite requires Perl."; \ + fi; \ + else \ + echo "Can't find the GNU Make test suite ($(srcdir)/tests)."; \ + fi + +# --------------- Maintainer's Section + +# Note this requires GNU make. Not to worry, since it will only be included +# in the Makefile if we're in the maintainer's environment. +#include $(srcdir)/maintMakefile + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# --------------- DEPENDENCIES + +# --------------- DEPENDENCIES +# + +# .deps/alloca.Po +# dummy + +# .deps/ar.Po +ar.o: ar.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + +# .deps/arscan.Po +arscan.o: arscan.c make.h config.h \ + getopt.h \ + gettext.h \ + +# .deps/commands.Po +commands.o: commands.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h hash.h variable.h job.h \ + commands.h + +# .deps/default.Po +default.o: default.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h rule.h dep.h \ + job.h \ + commands.h + +# .deps/dir.Po +dir.o: dir.c make.h config.h \ + getopt.h \ + gettext.h \ + hash.h \ + +# .deps/expand.Po +expand.o: expand.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + job.h \ + commands.h variable.h \ + rule.h + +# .deps/file.Po +file.o: file.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h \ + hash.h job.h \ + commands.h variable.h \ + debug.h + +# .deps/function.Po +function.o: function.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h dep.h job.h \ + commands.h debug.h + +# .deps/getloadavg.Po +# dummy + +# .deps/getopt.Po +getopt.o: getopt.c config.h \ + +# .deps/getopt1.Po +getopt1.o: getopt1.c config.h getopt.h \ + +# .deps/hash.Po +hash.o: hash.c make.h config.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/implicit.Po +implicit.o: implicit.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h rule.h dep.h debug.h \ + variable.h job.h \ + commands.h + +# .deps/job.Po +job.o: job.c make.h config.h \ + getopt.h \ + gettext.h \ + job.h \ + debug.h filedef.h hash.h commands.h \ + variable.h + +# .deps/loadavg-getloadavg.Po +# dummy + +# .deps/main.Po +main.o: main.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h hash.h variable.h job.h \ + commands.h rule.h debug.h getopt.h \ + +# .deps/misc.Po +misc.o: misc.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h debug.h + +# .deps/read.Po +read.o: read.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h hash.h job.h \ + commands.h variable.h rule.h debug.h \ + +# .deps/remake.Po +remake.o: remake.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + commands.h dep.h variable.h debug.h \ + +# .deps/remote-cstms.Po +# dummy + +# .deps/remote-stub.Po +remote-stub.o: remote-stub.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + commands.h + +# .deps/rule.Po +rule.o: rule.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h \ + hash.h job.h \ + commands.h variable.h \ + rule.h + +# .deps/signame.Po +signame.o: signame.c make.h config.h \ + getopt.h \ + gettext.h \ + +# .deps/strcache.Po +strcache.o: strcache.c make.h config.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/variable.Po +variable.o: variable.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h \ + hash.h job.h \ + commands.h variable.h \ + rule.h + +# .deps/version.Po +version.o: version.c config.h + +# .deps/vmsjobs.Po +# dummy + +# .deps/vpath.Po +vpath.o: vpath.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..92acdc2 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,199 @@ +# This is a -*-Makefile-*-, or close enough +# +# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +AUTOMAKE_OPTIONS = 1.8 dist-bzip2 check-news +ACLOCAL_AMFLAGS = -I config + +MAKE_HOST = @MAKE_HOST@ + +# Only process if target is MS-Windows +if WINDOWSENV + MAYBE_W32 = w32 + W32INC = -I $(top_srcdir)/w32/include + W32LIB = -Lw32 -lw32 +endif + +SUBDIRS = glob config po doc $(MAYBE_W32) + +bin_PROGRAMS = make + +if USE_CUSTOMS + remote = remote-cstms.c +else + remote = remote-stub.c +endif + + +make_SOURCES = ar.c arscan.c commands.c default.c dir.c expand.c file.c \ + function.c getopt.c getopt1.c implicit.c job.c main.c \ + misc.c read.c remake.c $(remote) rule.c signame.c \ + strcache.c variable.c version.c vpath.c hash.c + +EXTRA_make_SOURCES = vmsjobs.c remote-stub.c remote-cstms.c + +noinst_HEADERS = commands.h dep.h filedef.h job.h make.h rule.h variable.h \ + debug.h getopt.h gettext.h hash.h + +make_LDADD = @LIBOBJS@ @ALLOCA@ $(GLOBLIB) @GETLOADAVG_LIBS@ @LIBINTL@ +# Only process if target is MS-Windows +if WINDOWSENV + make_LDADD += $(W32LIB) +endif + +man_MANS = make.1 + +DEFS = -DLOCALEDIR=\"$(localedir)\" -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" @DEFS@ + +AM_CPPFLAGS = $(GLOBINC) +# Only process if target is MS-Windows +if WINDOWSENV + AM_CPPFLAGS += $(W32INC) +endif + + +# Extra stuff to include in the distribution. + +EXTRA_DIST = README build.sh.in $(man_MANS) \ + README.customs README.OS2 \ + SCOPTIONS SMakefile \ + README.Amiga Makefile.ami config.ami make.lnk amiga.c amiga.h \ + README.DOS Makefile.DOS configure.bat dosbuild.bat configh.dos\ + README.W32 NMakefile config.h.W32 build_w32.bat subproc.bat \ + make_msvc_net2003.sln make_msvc_net2003.vcproj \ + readme.vms makefile.vms makefile.com config.h-vms \ + vmsdir.h vmsfunctions.c vmsify.c + +# This is built during configure, but behind configure's back + +DISTCLEANFILES = build.sh + +# Forward targets + +html: + cd doc && $(MAKE) $(AM_MAKEFLAGS) $@ + +.PHONY: html + +# --------------- Internationalization Section + +localedir = $(datadir)/locale + +# --------------- Local INSTALL Section + +# If necessary, change the gid of the app and turn on the setgid flag. +# + +# Whether or not make needs to be installed setgid. +# The value should be either `true' or `false'. +# On many systems, the getloadavg function (used to implement the `-l' +# switch) will not work unless make is installed setgid kmem. +# +inst_setgid = @NEED_SETGID@ + +# Install make setgid to this group so it can get the load average. +# +inst_group = @KMEM_GROUP@ + +install-exec-local: + @if $(inst_setgid); then \ + app=$(DESTDIR)$(bindir)/`echo $(bin_PROGRAMS)|sed '$(transform)'`; \ + if chgrp $(inst_group) $$app && chmod g+s $$app; then \ + echo "chgrp $(inst_group) $$app && chmod g+s $$app"; \ + else \ + echo "$$app needs to be owned by group $(inst_group) and setgid;"; \ + echo "otherwise the \`-l' option will probably not work."; \ + echo "You may need special privileges to complete the installation"; \ + echo "of $$app."; \ + fi; \ + else true; fi + +# --------------- Local DIST Section + +# Install the w32 and tests subdirectories +# +dist-hook: + (cd $(srcdir); \ + sub=`find w32 tests -follow \( -name CVS -prune -o -name .cvsignore -o -name work -prune \) -o \( -name \*.orig -o -name \*.rej -o -name \*~ -prune \) -o -type f -print`; \ + tar chf - $$sub) \ + | (cd $(distdir); tar xfBp -) + + +# --------------- Local CHECK Section + +check-local: check-regression check-loadavg + @banner=" Regression PASSED: GNU Make $(VERSION) ($(MAKE_HOST)) built with $(CC) "; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + echo + +.PHONY: check-loadavg check-regression + +check-loadavg: loadavg$(EXEEXT) + @echo The system uptime program believes the load average to be: + -uptime + @echo The GNU load average checking code thinks: + -./loadavg$(EXEEXT) + +# The loadavg function is invoked during "make check" to test getloadavg. +check_PROGRAMS = loadavg +nodist_loadavg_SOURCES = getloadavg.c +loadavg_CPPFLAGS = -DTEST +loadavg_LDADD = @GETLOADAVG_LIBS@ + +# > check-regression +# +# Look for the make test suite, and run it if found and we can find perl. +# If we're building outside the tree, we use symlinks to make a local copy of +# the test suite. Unfortunately the test suite itself isn't localizable yet. +# +MAKETESTFLAGS = + +check-regression: + @if test -f "$(srcdir)/tests/run_make_tests"; then \ + if $(PERL) -v >/dev/null 2>&1; then \ + case `cd $(srcdir); pwd` in `pwd`) : ;; \ + *) test -d tests || mkdir tests; \ + rm -f srctests; \ + if ln -s "$(srcdir)/tests" srctests; then \ + for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \ + rm -f tests/$$f; ln -s ../srctests/$$f tests; \ + done; fi ;; \ + esac; \ + echo "cd tests && $(PERL) ./run_make_tests.pl -make ../make$(EXEEXT) $(MAKETESTFLAGS)"; \ + cd tests && $(PERL) ./run_make_tests.pl -make ../make$(EXEEXT) $(MAKETESTFLAGS); \ + else \ + echo "Can't find a working Perl ($(PERL)); the test suite requires Perl."; \ + fi; \ + else \ + echo "Can't find the GNU Make test suite ($(srcdir)/tests)."; \ + fi + + +# --------------- Maintainer's Section + +# Tell automake that I haven't forgotten about this file and it will be +# created before we build a distribution (see maintMakefile in the CVS +# distribution). + +README: + +@MAINT_MAKEFILE@ diff --git a/Makefile.ami b/Makefile.ami new file mode 100644 index 0000000..8cc67df --- /dev/null +++ b/Makefile.ami @@ -0,0 +1,307 @@ +# -*-Makefile-*- for GNU make on Amiga +# +# NOTE: If you have no `make' program at all to process this makefile, run +# `build.sh' instead. +# +# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +# +# Makefile for GNU Make +# + +CC = sc +RM = delete + +CFLAGS = +CPPFLAGS = +LDFLAGS = + +# Define these for your system as follows: +# -DNO_ARCHIVES To disable `ar' archive support. +# -DNO_FLOAT To avoid using floating-point numbers. +# -DENUM_BITFIELDS If the compiler isn't GCC but groks enum foo:2. +# Some compilers apparently accept this +# without complaint but produce losing code, +# so beware. +# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline. +# See also `config.h'. +defines = + +# Which flavor of remote job execution support to use. +# The code is found in `remote-$(REMOTE).c'. +REMOTE = stub + +# If you are using the GNU C library, or have the GNU getopt functions in +# your C library, you can comment these out. +GETOPT = getopt.o getopt1.o +GETOPT_SRC = $(srcdir)getopt.c $(srcdir)getopt1.c $(srcdir)getopt.h + +# If you are using the GNU C library, or have the GNU glob functions in +# your C library, you can comment this out. GNU make uses special hooks +# into the glob functions to be more efficient (by using make's directory +# cache for globbing), so you must use the GNU functions even if your +# system's C library has the 1003.2 glob functions already. Also, the glob +# functions in the AIX and HPUX C libraries are said to be buggy. +GLOB = glob/glob.lib + +# If your system doesn't have alloca, or the one provided is bad, define this. +ALLOCA = alloca.o +ALLOCA_SRC = $(srcdir)alloca.c + +# If your system needs extra libraries loaded in, define them here. +# System V probably need -lPW for alloca. HP-UX 7.0's alloca in +# libPW.a is broken on HP9000s300 and HP9000s400 machines. Use +# alloca.c instead on those machines. +LOADLIBES = + +# Any extra object files your system needs. +extras = amiga.o + +# Common prefix for machine-independent installed files. +prefix = +# Common prefix for machine-dependent installed files. +exec_prefix = + +# Directory to install `make' in. +bindir = sc:c +# Directory to find libraries in for `-lXXX'. +libdir = lib: +# Directory to search by default for included makefiles. +includedir = include: +# Directory to install the Info files in. +infodir = doc: +# Directory to install the man page in. +mandir = t: +# Number to put on the man page filename. +manext = 1 +# Prefix to put on installed `make' binary file name. +binprefix = +# Prefix to put on installed `make' man page file name. +manprefix = $(binprefix) + +# Whether or not make needs to be installed setgid. +# The value should be either `true' or `false'. +# On many systems, the getloadavg function (used to implement the `-l' +# switch) will not work unless make is installed setgid kmem. +install_setgid = false +# Install make setgid to this group so it can read /dev/kmem. +group = sys + +# Program to install `make'. +INSTALL_PROGRAM = copy +# Program to install the man page. +INSTALL_DATA = copy +# Generic install program. +INSTALL = copy + +# Program to format Texinfo source into Info files. +MAKEINFO = makeinfo +# Program to format Texinfo source into DVI files. +TEXI2DVI = texi2dvi + +# Programs to make tags files. +ETAGS = etags -w +CTAGS = ctags -w + +objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o \ + rule.o implicit.o default.o variable.o expand.o function.o \ + vpath.o version.o ar.o arscan.o signame.o strcache.o hash.o \ + remote-$(REMOTE).o $(GETOPT) $(ALLOCA) $(extras) +srcs = $(srcdir)commands.c $(srcdir)job.c $(srcdir)dir.c \ + $(srcdir)file.c $(srcdir)getloadavg.c $(srcdir)misc.c \ + $(srcdir)main.c $(srcdir)read.c $(srcdir)remake.c \ + $(srcdir)rule.c $(srcdir)implicit.c $(srcdir)default.c \ + $(srcdir)variable.c $(srcdir)expand.c $(srcdir)function.c \ + $(srcdir)vpath.c $(srcdir)version.c $(srcdir)hash.c \ + $(srcdir)remote-$(REMOTE).c \ + $(srcdir)ar.c $(srcdir)arscan.c $(srcdir)strcache.c \ + $(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC) \ + $(srcdir)commands.h $(srcdir)dep.h $(srcdir)filedep.h \ + $(srcdir)job.h $(srcdir)make.h $(srcdir)rule.h \ + $(srcdir)variable.h $(ALLOCA_SRC) $(srcdir)config.h.in + + +.SUFFIXES: +.SUFFIXES: .o .c .h .ps .dvi .info .texinfo + +all: make +info: make.info +dvi: make.dvi +# Some makes apparently use .PHONY as the default goal if it is before `all'. +.PHONY: all check info dvi + +make.info: make.texinfo + $(MAKEINFO) -I$(srcdir) $(srcdir)make.texinfo -o make.info + +make.dvi: make.texinfo + $(TEXI2DVI) $(srcdir)make.texinfo + +make.ps: make.dvi + dvi2ps make.dvi > make.ps + +make: $(objs) $(GLOB) + $(CC) Link $(LDFLAGS) $(objs) Lib $(GLOB) $(LOADLIBES) To make.new + -delete make + rename make.new make + +TMPFILE = t:Make$$ + +$(GLOB): + cd glob @@\ + $(MAKE) -$(MAKEFLAGS) -f Makefile + +# -I. is needed to find config.h in the build directory. +OUTPUT_OPTION = +.c.o: + $(CC) $(defines) IDir "" IDir glob \ + $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) + +# For some losing Unix makes. +SHELL = /bin/sh +#@SET_MAKE@ + +glob/libglob.a: FORCE config.h + cd glob; $(MAKE) libglob.a +FORCE: + +tagsrcs = $(srcs) $(srcdir)remote-*.c + +.PHONY: install installdirs +install: installdirs \ + $(bindir)$(binprefix)make $(infodir)make.info \ + $(mandir)$(manprefix)make.$(manext) + +installdirs: + $(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(infodir) $(mandir) + +$(bindir)$(binprefix)make: make + $(INSTALL_PROGRAM) make $@.new + @if $(install_setgid); then \ + if chgrp $(group) $@.new && chmod g+s $@.new; then \ + echo "chgrp $(group) $@.new && chmod g+s $@.new"; \ + else \ + echo "$@ needs to be owned by group $(group) and setgid;"; \ + echo "otherwise the \`-l' option will probably not work."; \ + echo "You may need special privileges to install $@."; \ + fi; \ + else true; fi +# Some systems can't deal with renaming onto a running binary. + -$(RM) $@.old + -mv $@ $@.old + mv $@.new $@ + +$(infodir)make.info: make.info + if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \ + for file in $${dir}/make.info*; do \ + name="`basename $$file`"; \ + $(INSTALL_DATA) $$file \ + `echo $@ | sed "s,make.info\$$,$$name,"`; \ + done +# Run install-info only if it exists. +# Use `if' instead of just prepending `-' to the +# line so we notice real errors from install-info. +# We use `$(SHELL) -c' because some shells do not +# fail gracefully when there is an unknown command. + if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ + if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \ + install-info --infodir=$(infodir) $$dir/make.info; \ + else true; fi + +$(mandir)$(manprefix)make.$(manext): make.man + $(INSTALL_DATA) $(srcdir)make.man $@ + + +loadavg: loadavg.c config.h + $(CC) $(defines) -DTEST -I. -I$(srcdir) $(CFLAGS) $(LDFLAGS) \ + loadavg.c $(LOADLIBES) -o $@ +# We copy getloadavg.c into a different file rather than compiling it +# directly because some compilers clobber getloadavg.o in the process. +loadavg.c: getloadavg.c + ln $(srcdir)getloadavg.c loadavg.c || \ + cp $(srcdir)getloadavg.c loadavg.c +check-loadavg: loadavg + @echo The system uptime program believes the load average to be: + -uptime + @echo The GNU load average checking code believes: + ./loadavg +check: check-loadavg + + +.PHONY: clean realclean distclean mostlyclean +clean: glob-clean + -$(RM) make loadavg "#?.o" core make.dvi + +distclean: clean glob-realclean + -$(RM) Makefile config.h config.status build.sh + -$(RM) config.log config.cache + -$(RM) TAGS tags + -$(RM) make.?? make.??s make.log make.toc make.*aux + -$(RM) loadavg.c + +realclean: distclean + -$(RM) make.info* +mostlyclean: clean + +.PHONY: glob-clean glob-realclean +glob-clean glob-realclean: + cd glob @@\ + $(MAKE) $@ + +# This tells versions [3.59,3.63) of GNU make not to export all variables. +.NOEXPORT: + +# The automatically generated dependencies below may omit config.h +# because it is included with ``#include '' rather than +# ``#include "config.h"''. So we add the explicit dependency to make sure. +$(objs): config.h + +# Automatically generated dependencies will be put at the end of the file. + +# Automatically generated dependencies. +commands.o: commands.c make.h dep.h filedef.h variable.h job.h \ + commands.h +job.o: job.c make.h job.h filedef.h commands.h variable.h +dir.o: dir.c make.h +file.o: file.c make.h dep.h filedef.h job.h commands.h variable.h +misc.o: misc.c make.h dep.h +main.o: main.c make.h dep.h filedef.h variable.h job.h commands.h \ + getopt.h +read.o: read.c make.h dep.h filedef.h job.h commands.h variable.h \ + glob/glob.h +remake.o: remake.c make.h filedef.h job.h commands.h dep.h +rule.o: rule.c make.h dep.h filedef.h job.h commands.h variable.h \ + rule.h +implicit.o: implicit.c make.h rule.h dep.h filedef.h +default.o: default.c make.h rule.h dep.h filedef.h job.h commands.h \ + variable.h +variable.o: variable.c make.h dep.h filedef.h job.h commands.h \ + variable.h +expand.o: expand.c make.h filedef.h job.h commands.h variable.h +function.o: function.c make.h filedef.h variable.h dep.h job.h \ + commands.h amiga.h +vpath.o: vpath.c make.h filedef.h variable.h +strcache.o: strcache.c make.h hash.h +version.o: version.c +ar.o: ar.c make.h filedef.h dep.h +arscan.o: arscan.c make.h +signame.o: signame.c signame.h +remote-stub.o: remote-stub.c make.h filedef.h job.h commands.h +getopt.o: getopt.c +getopt1.o : getopt1.c getopt.h +getloadavg.o: getloadavg.c +amiga.o: amiga.c make.h variable.h amiga.h diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..6481e99 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1131 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This is a -*-Makefile-*-, or close enough +# +# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = make$(EXEEXT) +# Only process if target is MS-Windows +@WINDOWSENV_TRUE@am__append_1 = $(W32LIB) +# Only process if target is MS-Windows +@WINDOWSENV_TRUE@am__append_2 = $(W32INC) +check_PROGRAMS = loadavg$(EXEEXT) +subdir = . +DIST_COMMON = README $(am__configure_deps) $(noinst_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/config.h.in $(top_srcdir)/configure ABOUT-NLS \ + AUTHORS COPYING ChangeLog INSTALL NEWS alloca.c getloadavg.c +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/isc-posix.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +nodist_loadavg_OBJECTS = loadavg-getloadavg.$(OBJEXT) +loadavg_OBJECTS = $(nodist_loadavg_OBJECTS) +loadavg_DEPENDENCIES = +am__make_SOURCES_DIST = ar.c arscan.c commands.c default.c dir.c \ + expand.c file.c function.c getopt.c getopt1.c implicit.c job.c \ + main.c misc.c read.c remake.c remote-stub.c remote-cstms.c \ + rule.c signame.c strcache.c variable.c version.c vpath.c \ + hash.c +@USE_CUSTOMS_FALSE@am__objects_1 = remote-stub.$(OBJEXT) +@USE_CUSTOMS_TRUE@am__objects_1 = remote-cstms.$(OBJEXT) +am_make_OBJECTS = ar.$(OBJEXT) arscan.$(OBJEXT) commands.$(OBJEXT) \ + default.$(OBJEXT) dir.$(OBJEXT) expand.$(OBJEXT) \ + file.$(OBJEXT) function.$(OBJEXT) getopt.$(OBJEXT) \ + getopt1.$(OBJEXT) implicit.$(OBJEXT) job.$(OBJEXT) \ + main.$(OBJEXT) misc.$(OBJEXT) read.$(OBJEXT) remake.$(OBJEXT) \ + $(am__objects_1) rule.$(OBJEXT) signame.$(OBJEXT) \ + strcache.$(OBJEXT) variable.$(OBJEXT) version.$(OBJEXT) \ + vpath.$(OBJEXT) hash.$(OBJEXT) +make_OBJECTS = $(am_make_OBJECTS) +am__DEPENDENCIES_1 = +@WINDOWSENV_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +make_DEPENDENCIES = @LIBOBJS@ @ALLOCA@ $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(nodist_loadavg_SOURCES) $(make_SOURCES) \ + $(EXTRA_make_SOURCES) +DIST_SOURCES = $(am__make_SOURCES_DIST) $(EXTRA_make_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +HEADERS = $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = glob config po doc w32 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = -DLOCALEDIR=\"$(localedir)\" -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ + +# --------------- Internationalization Section +localedir = $(datadir)/locale +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = 1.8 dist-bzip2 check-news +ACLOCAL_AMFLAGS = -I config + +# Only process if target is MS-Windows +@WINDOWSENV_TRUE@MAYBE_W32 = w32 +@WINDOWSENV_TRUE@W32INC = -I $(top_srcdir)/w32/include +@WINDOWSENV_TRUE@W32LIB = -Lw32 -lw32 +SUBDIRS = glob config po doc $(MAYBE_W32) +@USE_CUSTOMS_FALSE@remote = remote-stub.c +@USE_CUSTOMS_TRUE@remote = remote-cstms.c +make_SOURCES = ar.c arscan.c commands.c default.c dir.c expand.c file.c \ + function.c getopt.c getopt1.c implicit.c job.c main.c \ + misc.c read.c remake.c $(remote) rule.c signame.c \ + strcache.c variable.c version.c vpath.c hash.c + +EXTRA_make_SOURCES = vmsjobs.c remote-stub.c remote-cstms.c +noinst_HEADERS = commands.h dep.h filedef.h job.h make.h rule.h variable.h \ + debug.h getopt.h gettext.h hash.h + +make_LDADD = @LIBOBJS@ @ALLOCA@ $(GLOBLIB) @GETLOADAVG_LIBS@ @LIBINTL@ \ + $(am__append_1) +man_MANS = make.1 +AM_CPPFLAGS = $(GLOBINC) $(am__append_2) + +# Extra stuff to include in the distribution. +EXTRA_DIST = README build.sh.in $(man_MANS) \ + README.customs README.OS2 \ + SCOPTIONS SMakefile \ + README.Amiga Makefile.ami config.ami make.lnk amiga.c amiga.h \ + README.DOS Makefile.DOS configure.bat dosbuild.bat configh.dos\ + README.W32 NMakefile config.h.W32 build_w32.bat subproc.bat \ + make_msvc_net2003.sln make_msvc_net2003.vcproj \ + readme.vms makefile.vms makefile.com config.h-vms \ + vmsdir.h vmsfunctions.c vmsify.c + + +# This is built during configure, but behind configure's back +DISTCLEANFILES = build.sh + +# --------------- Local INSTALL Section + +# If necessary, change the gid of the app and turn on the setgid flag. +# + +# Whether or not make needs to be installed setgid. +# The value should be either `true' or `false'. +# On many systems, the getloadavg function (used to implement the `-l' +# switch) will not work unless make is installed setgid kmem. +# +inst_setgid = @NEED_SETGID@ + +# Install make setgid to this group so it can get the load average. +# +inst_group = @KMEM_GROUP@ +nodist_loadavg_SOURCES = getloadavg.c +loadavg_CPPFLAGS = -DTEST +loadavg_LDADD = @GETLOADAVG_LIBS@ + +# > check-regression +# +# Look for the make test suite, and run it if found and we can find perl. +# If we're building outside the tree, we use symlinks to make a local copy of +# the test suite. Unfortunately the test suite itself isn't localizable yet. +# +MAKETESTFLAGS = +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .o .obj +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +loadavg$(EXEEXT): $(loadavg_OBJECTS) $(loadavg_DEPENDENCIES) + @rm -f loadavg$(EXEEXT) + $(LINK) $(loadavg_OBJECTS) $(loadavg_LDADD) $(LIBS) +make$(EXEEXT): $(make_OBJECTS) $(make_DEPENDENCIES) + @rm -f make$(EXEEXT) + $(LINK) $(make_OBJECTS) $(make_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getloadavg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arscan.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commands.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expand.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/function.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/implicit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loadavg-getloadavg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remake.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-cstms.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-stub.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rule.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signame.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcache.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vmsjobs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vpath.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +loadavg-getloadavg.o: getloadavg.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loadavg-getloadavg.o -MD -MP -MF $(DEPDIR)/loadavg-getloadavg.Tpo -c -o loadavg-getloadavg.o `test -f 'getloadavg.c' || echo '$(srcdir)/'`getloadavg.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/loadavg-getloadavg.Tpo $(DEPDIR)/loadavg-getloadavg.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='getloadavg.c' object='loadavg-getloadavg.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loadavg-getloadavg.o `test -f 'getloadavg.c' || echo '$(srcdir)/'`getloadavg.c + +loadavg-getloadavg.obj: getloadavg.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loadavg-getloadavg.obj -MD -MP -MF $(DEPDIR)/loadavg-getloadavg.Tpo -c -o loadavg-getloadavg.obj `if test -f 'getloadavg.c'; then $(CYGPATH_W) 'getloadavg.c'; else $(CYGPATH_W) '$(srcdir)/getloadavg.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/loadavg-getloadavg.Tpo $(DEPDIR)/loadavg-getloadavg.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='getloadavg.c' object='loadavg-getloadavg.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loadavg-getloadavg.obj `if test -f 'getloadavg.c'; then $(CYGPATH_W) 'getloadavg.c'; else $(CYGPATH_W) '$(srcdir)/getloadavg.c'; fi` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @case `sed 15q $(srcdir)/NEWS` in \ + *"$(VERSION)"*) : ;; \ + *) \ + echo "NEWS not updated; not releasing" 1>&2; \ + exit 1;; \ + esac + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-recursive +all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(DEPDIR) ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-exec-local + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf $(DEPDIR) ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check-am \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am check-local clean \ + clean-binPROGRAMS clean-checkPROGRAMS clean-generic ctags \ + ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-hook \ + dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ + distclean distclean-compile distclean-generic distclean-hdr \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-local \ + install-html install-html-am install-info install-info-am \ + install-man install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-binPROGRAMS uninstall-man \ + uninstall-man1 + + +# Forward targets + +html: + cd doc && $(MAKE) $(AM_MAKEFLAGS) $@ + +.PHONY: html + +install-exec-local: + @if $(inst_setgid); then \ + app=$(DESTDIR)$(bindir)/`echo $(bin_PROGRAMS)|sed '$(transform)'`; \ + if chgrp $(inst_group) $$app && chmod g+s $$app; then \ + echo "chgrp $(inst_group) $$app && chmod g+s $$app"; \ + else \ + echo "$$app needs to be owned by group $(inst_group) and setgid;"; \ + echo "otherwise the \`-l' option will probably not work."; \ + echo "You may need special privileges to complete the installation"; \ + echo "of $$app."; \ + fi; \ + else true; fi + +# --------------- Local DIST Section + +# Install the w32 and tests subdirectories +# +dist-hook: + (cd $(srcdir); \ + sub=`find w32 tests -follow \( -name CVS -prune -o -name .cvsignore -o -name work -prune \) -o \( -name \*.orig -o -name \*.rej -o -name \*~ -prune \) -o -type f -print`; \ + tar chf - $$sub) \ + | (cd $(distdir); tar xfBp -) + +# --------------- Local CHECK Section + +check-local: check-regression check-loadavg + @banner=" Regression PASSED: GNU Make $(VERSION) ($(MAKE_HOST)) built with $(CC) "; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + echo + +.PHONY: check-loadavg check-regression + +check-loadavg: loadavg$(EXEEXT) + @echo The system uptime program believes the load average to be: + -uptime + @echo The GNU load average checking code thinks: + -./loadavg$(EXEEXT) + +check-regression: + @if test -f "$(srcdir)/tests/run_make_tests"; then \ + if $(PERL) -v >/dev/null 2>&1; then \ + case `cd $(srcdir); pwd` in `pwd`) : ;; \ + *) test -d tests || mkdir tests; \ + rm -f srctests; \ + if ln -s "$(srcdir)/tests" srctests; then \ + for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \ + rm -f tests/$$f; ln -s ../srctests/$$f tests; \ + done; fi ;; \ + esac; \ + echo "cd tests && $(PERL) ./run_make_tests.pl -make ../make$(EXEEXT) $(MAKETESTFLAGS)"; \ + cd tests && $(PERL) ./run_make_tests.pl -make ../make$(EXEEXT) $(MAKETESTFLAGS); \ + else \ + echo "Can't find a working Perl ($(PERL)); the test suite requires Perl."; \ + fi; \ + else \ + echo "Can't find the GNU Make test suite ($(srcdir)/tests)."; \ + fi + +# --------------- Maintainer's Section + +# Tell automake that I haven't forgotten about this file and it will be +# created before we build a distribution (see maintMakefile in the CVS +# distribution). + +README: + +@MAINT_MAKEFILE@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..523c9a7 --- /dev/null +++ b/NEWS @@ -0,0 +1,1113 @@ +GNU make NEWS -*-indented-text-*- + History of user-visible changes. + 28 July 2010 + +See the end of this file for copyrights and conditions. + +All changes mentioned here are more fully described in the GNU make +manual, which is contained in this distribution as the file doc/make.texi. +See the README file and the GNU make manual for instructions for +reporting bugs. + +Version 3.82 + +A complete list of bugs fixed in this version is available here: + +http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=104&set=custom + +* Compiling GNU make now requires a conforming ISO C 1989 compiler and + standard runtime library. + +* WARNING: Future backward-incompatibility! + Wildcards are not documented as returning sorted values, but up to and + including this release the results have been sorted and some makefiles are + apparently depending on that. In the next release of GNU make, for + performance reasons, we may remove that sorting. If your makefiles + require sorted results from wildcard expansions, use the $(sort ...) + function to request it explicitly. + +* WARNING: Backward-incompatibility! + The POSIX standard for make was changed in the 2008 version in a + fundamentally incompatible way: make is required to invoke the shell as if + the '-e' flag were provided. Because this would break many makefiles that + have been written to conform to the original text of the standard, the + default behavior of GNU make remains to invoke the shell with simply '-c'. + However, any makefile specifying the .POSIX special target will follow the + new POSIX standard and pass '-e' to the shell. See also .SHELLFLAGS + below. + +* WARNING: Backward-incompatibility! + The '$?' variable now contains all prerequisites that caused the target to + be considered out of date, even if they do not exist (previously only + existing targets were provided in $?). + +* WARNING: Backward-incompatibility! + As a result of parser enhancements, three backward-compatibility issues + exist: first, a prerequisite containing an "=" cannot be escaped with a + backslash any longer. You must create a variable containing an "=" and + use that variable in the prerequisite. Second, variable names can no + longer contain whitespace, unless you put the whitespace in a variable and + use the variable. Third, in previous versions of make it was sometimes + not flagged as an error for explicit and pattern targets to appear in the + same rule. Now this is always reported as an error. + +* WARNING: Backward-incompatibility! + The pattern-specific variables and pattern rules are now applied in the + shortest stem first order instead of the definition order (variables + and rules with the same stem length are still applied in the definition + order). This produces the usually-desired behavior where more specific + patterns are preferred. To detect this feature search for 'shortest-stem' + in the .FEATURES special variable. + +* WARNING: Backward-incompatibility! + The library search behavior has changed to be compatible with the standard + linker behavior. Prior to this version for prerequisites specified using + the -lfoo syntax make first searched for libfoo.so in the current + directory, vpath directories, and system directories. If that didn't yield + a match, make then searched for libfoo.a in these directories. Starting + with this version make searches first for libfoo.so and then for libfoo.a + in each of these directories in order. + +* New command line option: --eval=STRING causes STRING to be evaluated as + makefile syntax (akin to using the $(eval ...) function). The evaluation + is performed after all default rules and variables are defined, but before + any makefiles are read. + +* New special variable: .RECIPEPREFIX allows you to reset the recipe + introduction character from the default (TAB) to something else. The + first character of this variable value is the new recipe introduction + character. If the variable is set to the empty string, TAB is used again. + It can be set and reset at will; recipes will use the value active when + they were first parsed. To detect this feature check the value of + $(.RECIPEPREFIX). + +* New special variable: .SHELLFLAGS allows you to change the options passed + to the shell when it invokes recipes. By default the value will be "-c" + (or "-ec" if .POSIX is set). + +* New special target: .ONESHELL instructs make to invoke a single instance + of the shell and provide it with the entire recipe, regardless of how many + lines it contains. As a special feature to allow more straightforward + conversion of makefiles to use .ONESHELL, any recipe line control + characters ('@', '+', or '-') will be removed from the second and + subsequent recipe lines. This happens _only_ if the SHELL value is deemed + to be a standard POSIX-style shell. If not, then no interior line control + characters are removed (as they may be part of the scripting language used + with the alternate SHELL). + +* New variable modifier 'private': prefixing a variable assignment with the + modifier 'private' suppresses inheritance of that variable by + prerequisites. This is most useful for target- and pattern-specific + variables. + +* New make directive: 'undefine' allows you to undefine a variable so that + it appears as if it was never set. Both $(flavor) and $(origin) functions + will return 'undefined' for such a variable. To detect this feature search + for 'undefine' in the .FEATURES special variable. + +* The parser for variable assignments has been enhanced to allow multiple + modifiers ('export', 'override', 'private') on the same line as variables, + including define/endef variables, and in any order. Also, it is possible + to create variables and targets named as these modifiers. + +* The 'define' make directive now allows a variable assignment operator + after the variable name, to allow for simple, conditional, or appending + multi-line variable assignment. + + +Version 3.81 + +* GNU make is ported to OS/2. + +* GNU make is ported to MinGW. The MinGW build is only supported by + the build_w32.bat batch file; see the file README.W32 for more + details. + +* WARNING: Future backward-incompatibility! + Up to and including this release, the '$?' variable does not contain + any prerequisite that does not exist, even though that prerequisite + might have caused the target to rebuild. Starting with the _next_ + release of GNU make, '$?' will contain all prerequisites that caused + the target to be considered out of date. See this Savannah bug: + http://savannah.gnu.org/bugs/index.php?func=detailitem&item_id=16051 + +* WARNING: Backward-incompatibility! + GNU make now implements a generic "second expansion" feature on the + prerequisites of both explicit and implicit (pattern) rules. In order + to enable this feature, the special target '.SECONDEXPANSION' must be + defined before the first target which takes advantage of it. If this + feature is enabled then after all rules have been parsed the + prerequisites are expanded again, this time with all the automatic + variables in scope. This means that in addition to using standard + SysV $$@ in prerequisites lists, you can also use complex functions + such as $$(notdir $$@) etc. This behavior applies to implicit rules, + as well, where the second expansion occurs when the rule is matched. + However, this means that when '.SECONDEXPANSION' is enabled you must + double-quote any "$" in your filenames; instead of "foo: boo$$bar" you + now must write "foo: foo$$$$bar". Note that the SysV $$@ etc. feature, + which used to be available by default, is now ONLY available when the + .SECONDEXPANSION target is defined. If your makefiles take advantage + of this SysV feature you will need to update them. + +* WARNING: Backward-incompatibility! + In order to comply with POSIX, the way in which GNU make processes + backslash-newline sequences in recipes has changed. If your makefiles + use backslash-newline sequences inside of single-quoted strings in + recipes you will be impacted by this change. See the GNU make manual + subsection "Splitting Recipe Lines" (node "Splitting Lines"), in + section "Recipe Syntax", chapter "Writing Recipe in Rules", for + details. + +* WARNING: Backward-incompatibility! + Some previous versions of GNU make had a bug where "#" in a function + invocation such as $(shell ...) was treated as a make comment. A + workaround was to escape these with backslashes. This bug has been + fixed: if your makefile uses "\#" in a function invocation the + backslash is now preserved, so you'll need to remove it. + +* New command line option: -L (--check-symlink-times). On systems that + support symbolic links, if this option is given then GNU make will + use the most recent modification time of any symbolic links that are + used to resolve target files. The default behavior remains as it + always has: use the modification time of the actual target file only. + +* The "else" conditional line can now be followed by any other valid + conditional on the same line: this does not increase the depth of the + conditional nesting, so only one "endif" is required to close the + conditional. + +* All pattern-specific variables that match a given target are now used + (previously only the first match was used). + +* Target-specific variables can be marked as exportable using the + "export" keyword. + +* In a recursive $(call ...) context, any extra arguments from the outer + call are now masked in the context of the inner call. + +* Implemented a solution for the "thundering herd" problem with "-j -l". + This version of GNU make uses an algorithm suggested by Thomas Riedl + to track the number of jobs started in the + last second and artificially adjust GNU make's view of the system's + load average accordingly. + +* New special variables available in this release: + - .INCLUDE_DIRS: Expands to a list of directories that make searches + for included makefiles. + - .FEATURES: Contains a list of special features available in this + version of GNU make. + - .DEFAULT_GOAL: Set the name of the default goal make will + use if no goals are provided on the command line. + - MAKE_RESTARTS: If set, then this is the number of times this + instance of make has been restarted (see "How Makefiles Are Remade" + in the manual). + - New automatic variable: $| (added in 3.80, actually): contains all + the order-only prerequisites defined for the target. + +* New functions available in this release: + - $(lastword ...) returns the last word in the list. This gives + identical results as $(word $(words ...) ...), but is much faster. + - $(abspath ...) returns the absolute path (all "." and ".." + directories resolved, and any duplicate "/" characters removed) for + each path provided. + - $(realpath ...) returns the canonical pathname for each path + provided. The canonical pathname is the absolute pathname, with + all symbolic links resolved as well. + - $(info ...) prints its arguments to stdout. No makefile name or + line number info, etc. is printed. + - $(flavor ...) returns the flavor of a variable. + - $(or ...) provides a short-circuiting OR conditional: each argument + is expanded. The first true (non-empty) argument is returned; no + further arguments are expanded. Expands to empty if there are no + true arguments. + - $(and ...) provides a short-circuiting AND conditional: each + argument is expanded. The first false (empty) argument is + returned; no further arguments are expanded. Expands to the last + argument if all arguments are true. + +* Changes made for POSIX compatibility: + - Only touch targets (under -t) if they have a recipe. + - Setting the SHELL make variable does NOT change the value of the + SHELL environment variable given to programs invoked by make. As + an enhancement to POSIX, if you export the make variable SHELL then + it will be set in the environment, just as before. + +* On MS Windows systems, explicitly setting SHELL to a pathname ending + in "cmd" or "cmd.exe" (case-insensitive) will force GNU make to use + the DOS command interpreter in batch mode even if a UNIX-like shell + could be found on the system. + +* On VMS there is now support for case-sensitive filesystems such as ODS5. + See the readme.vms file for information. + +* Parallel builds (-jN) no longer require a working Bourne shell on + Windows platforms. They work even with the stock Windows shells, such + as cmd.exe and command.com. + +* Updated to autoconf 2.59, automake 1.9.5, and gettext 0.14.1. Users + should not be impacted. + +* New translations for Swedish, Chinese (simplified), Ukrainian, + Belarusian, Finnish, Kinyarwandan, and Irish. Many updated + translations. + +A complete list of bugs fixed in this version is available here: + + http://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=103 + + +Version 3.80 + +* A new feature exists: order-only prerequisites. These prerequisites + affect the order in which targets are built, but they do not impact + the rebuild/no-rebuild decision of their dependents. That is to say, + they allow you to require target B be built before target A, without + requiring that target A will always be rebuilt if target B is updated. + Patch for this feature provided by Greg McGary . + +* For compatibility with SysV make, GNU make now supports the peculiar + syntax $$@, $$(@D), and $$(@F) in the prerequisites list of a rule. + This syntax is only valid within explicit and static pattern rules: it + cannot be used in implicit (suffix or pattern) rules. Edouard G. Parmelan + provided a patch implementing this feature; however, I + decided to implement it in a different way. + +* The argument to the "ifdef" conditional is now expanded before it's + tested, so it can be a constructed variable name. + + Similarly, the arguments to "export" (when not used in a variable + definition context) and "unexport" are also now expanded. + +* A new function is defined: $(value ...). The argument to this + function is the _name_ of a variable. The result of the function is + the value of the variable, without having been expanded. + +* A new function is defined: $(eval ...). The arguments to this + function should expand to makefile commands, which will then be + evaluated as if they had appeared in the makefile. In combination + with define/endef multiline variable definitions this is an extremely + powerful capability. The $(value ...) function is also sometimes + useful here. + +* A new built-in variable is defined, $(MAKEFILE_LIST). It contains a + list of each makefile GNU make has read, or started to read, in the + order in which they were encountered. So, the last filename in the + list when a makefile is just being read (before any includes) is the + name of the current makefile. + +* A new built-in variable is defined: $(.VARIABLES). When it is + expanded it returns a complete list of variable names defined by all + makefiles at that moment. + +* A new command line option is defined, -B or --always-make. If + specified GNU make will consider all targets out-of-date even if they + would otherwise not be. + +* The arguments to $(call ...) functions were being stored in $1, $2, + etc. as recursive variables, even though they are fully expanded + before assignment. This means that escaped dollar signs ($$ etc.) + were not behaving properly. Now the arguments are stored as simple + variables. This may mean that if you added extra escaping to your + $(call ...) function arguments you will need to undo it now. + +* The variable invoked by $(call ...) can now be recursive: unlike other + variables it can reference itself and this will not produce an error + when it is used as the first argument to $(call ...) (but only then). + +* New pseudo-target .LOW_RESOLUTION_TIME, superseding the configure + option --disable-nsec-timestamps. You might need this if your build + process depends on tools like "cp -p" preserving time stamps, since + "cp -p" (right now) doesn't preserve the subsecond portion of a time + stamp. + +* Updated translations for French, Galician, German, Japanese, Korean, + and Russian. New translations for Croatian, Danish, Hebrew, and + Turkish. + +* Updated internationalization support to Gettext 0.11.5. + GNU make now uses Gettext's "external" feature, and does not include + any internationalization code itself. Configure will search your + system for an existing implementation of GNU Gettext (only GNU Gettext + is acceptable) and use it if it exists. If not, NLS will be disabled. + See ABOUT-NLS for more information. + +* Updated to autoconf 2.54 and automake 1.7. Users should not be impacted. + +A complete list of bugs fixed in this version is available here: + + http://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=102 + + +Version 3.79.1 + +* .SECONDARY with no prerequisites now prevents any target from being + removed because make thinks it's an intermediate file, not just those + listed in the makefile. + +* New configure option --disable-nsec-timestamps, but this was + superseded in later versions by the .LOW_RESOLUTION_TIME pseudo-target. + +Version 3.79 + +* GNU make optionally supports internationalization and locales via the + GNU gettext (or local gettext if suitable) package. See the ABOUT-NLS + file for more information on configuring GNU make for NLS. + +* Previously, GNU make quoted variables such as MAKEFLAGS and + MAKEOVERRIDES for proper parsing by the shell. This allowed them to + be used within make build scripts. However, using them there is not + proper behavior: they are meant to be passed to subshells via the + environment. Unfortunately the values were not quoted properly to be + passed through the environment. This meant that make didn't properly + pass some types of command line values to submakes. + + With this version we change that behavior: now these variables are + quoted properly for passing through the environment, which is the + correct way to do it. If you previously used these variables + explicitly within a make rule you may need to re-examine your use for + correctness given this change. + +* A new pseudo-target .NOTPARALLEL is available. If defined, the + current makefile is run serially regardless of the value of -j. + However, submakes are still eligible for parallel execution. + +* The --debug option has changed: it now allows optional flags + controlling the amount and type of debugging output. By default only + a minimal amount information is generated, displaying the names of + "normal" targets (not makefiles) that were deemed out of date and in + need of being rebuilt. + + Note that the -d option behaves as before: it takes no arguments and + all debugging information is generated. + +* The `-p' (print database) output now includes filename and linenumber + information for variable definitions, to aid debugging. + +* The wordlist function no longer reverses its arguments if the "start" + value is greater than the "end" value. If that's true, nothing is + returned. + +* Hartmut Becker provided many updates for the VMS port of GNU make. + See the readme.vms file for more details. + +Version 3.78 + +* Two new functions, $(error ...) and $(warning ...) are available. The + former will cause make to fail and exit immediately upon expansion of + the function, with the text provided as the error message. The latter + causes the text provided to be printed as a warning message, but make + proceeds normally. + +* A new function $(call ...) is available. This allows users to create + their own parameterized macros and invoke them later. Original + implementation of this function was provided by Han-Wen Nienhuys + . + +* A new function $(if ...) is available. It provides if-then-else + capabilities in a builtin function. Original implementation of this + function was provided by Han-Wen Nienhuys . + +* Make defines a new variable, .LIBPATTERNS. This variable controls how + library dependency expansion (dependencies like ``-lfoo'') is performed. + +* Make accepts CRLF sequences as well as traditional LF, for + compatibility with makefiles created on other operating systems. + +* Make accepts a new option: -R, or --no-builtin-variables. This option + disables the definition of the rule-specific builtin variables (CC, + LD, AR, etc.). Specifying this option forces -r (--no-builtin-rules) + as well. + +* A "job server" feature, suggested by Howard Chu . + + On systems that support POSIX pipe(2) semantics, GNU make can now pass + -jN options to submakes rather than forcing them all to use -j1. The + top make and all its sub-make processes use a pipe to communicate with + each other to ensure that no more than N jobs are started across all + makes. To get the old behavior of -j back, you can configure make + with the --disable-job-server option. + +* The confusing term "dependency" has been replaced by the more accurate + and standard term "prerequisite", both in the manual and in all GNU make + output. + +* GNU make supports the "big archive" library format introduced in AIX 4.3. + +* GNU make supports large files on AIX, HP-UX, and IRIX. These changes + were provided by Paul Eggert . (Large file + support for Solaris and Linux was introduced in 3.77, but the + configuration had issues: these have also been resolved). + +* The Windows 95/98/NT (W32) version of GNU make now has native support + for the Cygnus Cygwin release B20.1 shell (bash). + +* The GNU make regression test suite, long available separately "under + the table", has been integrated into the release. You can invoke it + by running "make check" in the distribution. Note that it requires + Perl (either Perl 4 or Perl 5) to run. + +Version 3.77 + +* Implement BSD make's "?=" variable assignment operator. The variable + is assigned the specified value only if that variable is not already + defined. + +* Make defines a new variable, "CURDIR", to contain the current working + directory (after the -C option, if any, has been processed). + Modifying this variable has no effect on the operation of make. + +* Make defines a new default RCS rule, for new-style master file + storage: ``% :: RCS/%'' (note no ``,v'' suffix). + + Make defines new default rules for DOS-style C++ file naming + conventions, with ``.cpp'' suffixes. All the same rules as for + ``.cc'' and ``.C'' suffixes are provided, along with LINK.cpp and + COMPILE.cpp macros (which default to the same value as LINK.cc and + COMPILE.cc). Note CPPFLAGS is still C preprocessor flags! You should + use CXXFLAGS to change C++ compiler flags. + +* A new feature, "target-specific variable values", has been added. + This is a large change so please see the appropriate sections of the + manual for full details. Briefly, syntax like this: + + TARGET: VARIABLE = VALUE + + defines VARIABLE as VALUE within the context of TARGET. This is + similar to SunOS make's "TARGET := VARIABLE = VALUE" feature. Note + that the assignment may be of any type, not just recursive, and that + the override keyword is available. + + COMPATIBILITY: This new syntax means that if you have any rules where + the first or second dependency has an equal sign (=) in its name, + you'll have to escape them with a backslash: "foo : bar\=baz". + Further, if you have any dependencies which already contain "\=", + you'll have to escape both of them: "foo : bar\\\=baz". + +* A new appendix listing the most common error and warning messages + generated by GNU make, with some explanation, has been added to the + GNU make User's Manual. + +* Updates to the GNU make Customs library support (see README.customs). + +* Updates to the Windows 95/NT port from Rob Tulloh (see README.W32), + and to the DOS port from Eli Zaretski (see README.DOS). + +Version 3.76.1 + +* Small (but serious) bug fix. Quick rollout to get into the GNU source CD. + +Version 3.76 + +* GNU make now uses automake to control Makefile.in generation. This + should make it more consistent with the GNU standards. + +* VPATH functionality has been changed to incorporate the VPATH+ patch, + previously maintained by Paul Smith . See the + manual. + +* Make defines a new variable, `MAKECMDGOALS', to contain the goals that + were specified on the command line, if any. Modifying this variable + has no effect on the operation of make. + +* A new function, `$(wordlist S,E,TEXT)', is available: it returns a + list of words from number S to number E (inclusive) of TEXT. + +* Instead of an error, detection of future modification times gives a + warning and continues. The warning is repeated just before GNU make + exits, so it is less likely to be lost. + +* Fix the $(basename) and $(suffix) functions so they only operate on + the last filename, not the entire string: + + Command Old Result New Result + ------- ---------- ---------- + $(basename a.b) a a + $(basename a.b/c) a a.b/c + $(suffix a.b) b b + $(suffix a.b/c) b/c + +* The $(strip) function now removes newlines as well as TABs and spaces. + +* The $(shell) function now changes CRLF (\r\n) pairs to a space as well + as newlines (\n). + +* Updates to the Windows 95/NT port from Rob Tulloh (see README.W32). + +* Eli Zaretskii has updated the port to 32-bit protected mode on MSDOS + and MS-Windows, building with the DJGPP v2 port of GNU C/C++ compiler + and utilities. See README.DOS for details, and direct all questions + concerning this port to Eli Zaretskii or DJ + Delorie . + +* John W. Eaton has updated the VMS port to support libraries and VPATH. + +Version 3.75 + +* The directory messages printed by `-w' and implicitly in sub-makes, + are now omitted if Make runs no commands and has no other messages to print. + +* Make now detects files that for whatever reason have modification times + in the future and gives an error. Files with such impossible timestamps + can result from unsynchronized clocks, or archived distributions + containing bogus timestamps; they confuse Make's dependency engine + thoroughly. + +* The new directive `sinclude' is now recognized as another name for + `-include', for compatibility with some other Makes. + +* Aaron Digulla has contributed a port to AmigaDOS. See README.Amiga for + details, and direct all Amiga-related questions to . + +* Rob Tulloh of Tivoli Systems has contributed a port to Windows NT or 95. + See README.W32 for details, and direct all Windows-related questions to + . + +Version 3.73 + +* Converted to use Autoconf version 2, so `configure' has some new options. + See INSTALL for details. + +* You can now send a SIGUSR1 signal to Make to toggle printing of debugging + output enabled by -d, at any time during the run. + +Version 3.72 + +* DJ Delorie has ported Make to MS-DOS using the GO32 extender. + He is maintaining the DOS port, not the GNU Make maintainer; + please direct bugs and questions for DOS to . + MS-DOS binaries are available for FTP from ftp.simtel.net in + /pub/simtelnet/gnu/djgpp/. + +* The `MAKEFLAGS' variable (in the environment or in a makefile) can now + contain variable definitions itself; these are treated just like + command line variable definitions. Make will automatically insert any + variable definitions from the environment value of `MAKEFLAGS' or from + the command line, into the `MAKEFLAGS' value exported to children. The + `MAKEOVERRIDES' variable previously included in the value of `$(MAKE)' + for sub-makes is now included in `MAKEFLAGS' instead. As before, you can + reset `MAKEOVERRIDES' in your makefile to avoid putting all the variables + in the environment when its size is limited. + +* If `.DELETE_ON_ERROR' appears as a target, Make will delete the target of + a rule if it has changed when its recipe exits with a nonzero status, + just as when the recipe gets a signal. + +* The automatic variable `$+' is new. It lists all the dependencies like + `$^', but preserves duplicates listed in the makefile. This is useful + for linking rules, where library files sometimes need to be listed twice + in the link order. + +* You can now specify the `.IGNORE' and `.SILENT' special targets with + dependencies to limit their effects to those files. If a file appears as + a dependency of `.IGNORE', then errors will be ignored while running the + recipe to update that file. Likewise if a file appears as a dependency + of `.SILENT', then the recipe to update that file will not be printed + before it is run. (This change was made to conform to POSIX.2.) + +Version 3.71 + +* The automatic variables `$(@D)', `$(%D)', `$(*D)', `$(. diff --git a/NMakefile b/NMakefile new file mode 100644 index 0000000..f4a6fe5 --- /dev/null +++ b/NMakefile @@ -0,0 +1,297 @@ +# -*-Makefile-*- to build GNU make with nmake +# +# NOTE: If you have no 'make' program at all to process this makefile, +# run 'build_w32.bat' instead. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +LINK = link +CC = cl +MAKE = nmake + +OUTDIR=. +MAKEFILE=NMakefile +SUBPROC_MAKEFILE=NMakefile + +CFLAGS_any = /nologo /MT /W4 /GX /Zi /YX /I . /I glob /I w32/include /D WIN32 /D WINDOWS32 /D _CONSOLE /D HAVE_CONFIG_H +CFLAGS_debug = $(CFLAGS_any) /Od /D DEBUG /D _DEBUG /FR.\WinDebug/ /Fp.\WinDebug/make.pch /Fo.\WinDebug/ /Fd.\WinDebug/make.pdb +CFLAGS_release = $(CFLAGS_any) /O2 /D NDEBUG /FR.\WinRel/ /Fp.\WinRel/make.pch /Fo.\WinRel/ + +LDFLAGS_debug = w32\subproc\WinDebug\subproc.lib /NOLOGO /SUBSYSTEM:console\ + /INCREMENTAL:no /PDB:WinDebug/make.pdb /OUT:WinDebug/make.exe /DEBUG +LDFLAGS_release = w32\subproc\WinRel\subproc.lib /NOLOGO /SUBSYSTEM:console\ + /INCREMENTAL:no /OUT:WinRel/make.exe + +all: config.h subproc Release Debug + +# +# Make sure we build the subproc library first. It has it's own +# makefile. To be portable to Windows 95, we put the instructions +# on how to build the library into a batch file. On NT, we could +# simply have done foo && bar && dog, but this doesn't port. +# +subproc: w32/subproc/WinDebug/subproc.lib w32/subproc/WinRel/subproc.lib + +w32/subproc/WinDebug/subproc.lib w32/subproc/WinRel/subproc.lib: w32/subproc/misc.c w32/subproc/sub_proc.c w32/subproc/w32err.c + subproc.bat $(SUBPROC_MAKEFILE) $(MAKE) + if exist WinDebug\make.exe erase WinDebug\make.exe + if exist WinRel\make.exe erase WinRel\make.exe + +config.h: config.h.W32 + copy $? $@ + +Release: + $(MAKE) /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_release)" CFLAGS="$(CFLAGS_release)" OUTDIR=WinRel WinRel/make.exe +Debug: + $(MAKE) /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_debug)" CFLAGS="$(CFLAGS_debug)" OUTDIR=WinDebug WinDebug/make.exe + +clean: + if exist WinDebug\nul rmdir /s /q WinDebug + if exist WinRel\nul rmdir /s /q WinRel + if exist w32\subproc\WinDebug\nul rmdir /s /q w32\subproc\WinDebug + if exist w32\subproc\WinRel\nul rmdir /s /q w32\subproc\WinRel + if exist config.h erase config.h + erase *.pdb + +$(OUTDIR): + if not exist .\$@\nul mkdir .\$@ + +LIBS = kernel32.lib user32.lib advapi32.lib + +OBJS = \ + $(OUTDIR)/ar.obj \ + $(OUTDIR)/arscan.obj \ + $(OUTDIR)/commands.obj \ + $(OUTDIR)/default.obj \ + $(OUTDIR)/dir.obj \ + $(OUTDIR)/expand.obj \ + $(OUTDIR)/file.obj \ + $(OUTDIR)/function.obj \ + $(OUTDIR)/getloadavg.obj \ + $(OUTDIR)/getopt.obj \ + $(OUTDIR)/getopt1.obj \ + $(OUTDIR)/hash.obj \ + $(OUTDIR)/implicit.obj \ + $(OUTDIR)/job.obj \ + $(OUTDIR)/main.obj \ + $(OUTDIR)/misc.obj \ + $(OUTDIR)/read.obj \ + $(OUTDIR)/remake.obj \ + $(OUTDIR)/remote-stub.obj \ + $(OUTDIR)/rule.obj \ + $(OUTDIR)/signame.obj \ + $(OUTDIR)/strcache.obj \ + $(OUTDIR)/variable.obj \ + $(OUTDIR)/version.obj \ + $(OUTDIR)/vpath.obj \ + $(OUTDIR)/glob.obj \ + $(OUTDIR)/fnmatch.obj \ + $(OUTDIR)/dirent.obj \ + $(OUTDIR)/pathstuff.obj + +$(OUTDIR)/make.exe: $(OUTDIR) $(OBJS) + $(LINK) @<< + $(LDFLAGS) $(LIBS) $(OBJS) +<< + +.c{$(OUTDIR)}.obj: + $(CC) $(CFLAGS) /c $< + +$(OUTDIR)/glob.obj : glob/glob.c + $(CC) $(CFLAGS) /c $? +$(OUTDIR)/fnmatch.obj : glob/fnmatch.c + $(CC) $(CFLAGS) /c $? +$(OUTDIR)/dirent.obj : w32/compat/dirent.c + $(CC) $(CFLAGS) /c $? +$(OUTDIR)/pathstuff.obj : w32/pathstuff.c + $(CC) $(CFLAGS) /c $? + +# --------------- DEPENDENCIES +# + +# .deps/alloca.Po +# dummy + +# .deps/ar.Po +$(OUTDIR)/ar.obj: ar.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + +# .deps/arscan.Po +$(OUTDIR)/arscan.obj: arscan.c make.h config.h \ + getopt.h \ + gettext.h \ + +# .deps/commands.Po +$(OUTDIR)/commands.obj: commands.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h hash.h variable.h job.h \ + commands.h + +# .deps/default.Po +$(OUTDIR)/default.obj: default.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h rule.h dep.h \ + job.h \ + commands.h + +# .deps/dir.Po +$(OUTDIR)/dir.obj: dir.c make.h config.h \ + getopt.h \ + gettext.h \ + hash.h \ + +# .deps/expand.Po +$(OUTDIR)/expand.obj: expand.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + job.h \ + commands.h variable.h \ + rule.h + +# .deps/file.Po +$(OUTDIR)/file.obj: file.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h \ + hash.h job.h \ + commands.h variable.h \ + debug.h + +# .deps/function.Po +$(OUTDIR)/function.obj: function.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h dep.h job.h \ + commands.h debug.h + +# .deps/getloadavg.Po +# dummy + +# .deps/getopt.Po +$(OUTDIR)/getopt.obj: getopt.c config.h \ + +# .deps/getopt1.Po +$(OUTDIR)/getopt1.obj: getopt1.c config.h getopt.h \ + +# .deps/hash.Po +$(OUTDIR)/hash.obj: hash.c make.h config.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/implicit.Po +$(OUTDIR)/implicit.obj: implicit.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h rule.h dep.h debug.h \ + variable.h job.h \ + commands.h + +# .deps/job.Po +$(OUTDIR)/job.obj: job.c make.h config.h \ + getopt.h \ + gettext.h \ + job.h \ + debug.h filedef.h hash.h commands.h \ + variable.h + +# .deps/loadavg-getloadavg.Po +# dummy + +# .deps/main.Po +$(OUTDIR)/main.obj: main.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h hash.h variable.h job.h \ + commands.h rule.h debug.h getopt.h \ + +# .deps/misc.Po +$(OUTDIR)/misc.obj: misc.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h debug.h + +# .deps/read.Po +$(OUTDIR)/read.obj: read.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h hash.h job.h \ + commands.h variable.h rule.h debug.h \ + +# .deps/remake.Po +$(OUTDIR)/remake.obj: remake.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + commands.h dep.h variable.h debug.h \ + +# .deps/remote-cstms.Po +# dummy + +# .deps/remote-stub.Po +$(OUTDIR)/remote-stub.obj: remote-stub.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + commands.h + +# .deps/rule.Po +$(OUTDIR)/rule.obj: rule.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h \ + hash.h job.h \ + commands.h variable.h \ + rule.h + +# .deps/signame.Po +$(OUTDIR)/signame.obj: signame.c make.h config.h \ + getopt.h \ + gettext.h \ + +# .deps/strcache.Po +$(OUTDIR)/strcache.obj: strcache.c make.h config.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/variable.Po +$(OUTDIR)/variable.obj: variable.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h \ + hash.h job.h \ + commands.h variable.h \ + rule.h + +# .deps/version.Po +$(OUTDIR)/version.obj: version.c config.h + +# .deps/vmsjobs.Po +# dummy + +# .deps/vpath.Po +$(OUTDIR)/vpath.obj: vpath.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h diff --git a/README b/README new file mode 100644 index 0000000..07e5dc5 --- /dev/null +++ b/README @@ -0,0 +1,189 @@ +This directory contains the 3.82 release of GNU Make. + +See the file NEWS for the user-visible changes from previous releases. +In addition, there have been bugs fixed. + +Please check the system-specific notes below for any caveats related to +your operating system. + +For general building and installation instructions, see the file INSTALL. + +If you need to build GNU Make and have no other `make' program to use, +you can use the shell script `build.sh' instead. To do this, first run +`configure' as described in INSTALL. Then, instead of typing `make' to +build the program, type `sh build.sh'. This should compile the program +in the current directory. Then you will have a Make program that you can +use for `./make install', or whatever else. + +Some systems' Make programs are broken and cannot process the Makefile for +GNU Make. If you get errors from your system's Make when building GNU +Make, try using `build.sh' instead. + + +GNU Make is free software. See the file COPYING for copying conditions. + + +Downloading +----------- + +GNU Make can be obtained in many different ways. See a description here: + + http://www.gnu.org/software/software.html + + +Documentation +------------- + +GNU make is fully documented in the GNU Make manual, which is contained +in this distribution as the file make.texinfo. You can also find +on-line and preformatted (PostScript and DVI) versions at the FSF's web +site. There is information there about ordering hardcopy documentation. + + http://www.gnu.org/ + http://www.gnu.org/doc/doc.html + http://www.gnu.org/manual/manual.html + + +Development +----------- + +GNU Make development is hosted by Savannah, the FSF's online development +management tool. Savannah is here: + + http://savannah.gnu.org + +And the GNU Make development page is here: + + http://savannah.gnu.org/projects/make/ + +You can find most information concerning the development of GNU Make at +this site. + + +Bug Reporting +------------- + +You can send GNU make bug reports to . Please see the +section of the GNU make manual entitled `Problems and Bugs' for +information on submitting useful and complete bug reports. + +You can also use the online bug tracking system in the Savannah GNU Make +project to submit new problem reports or search for existing ones: + + http://savannah.gnu.org/bugs/?group=make + +If you need help using GNU make, try these forums: + + help-make@gnu.org + help-utils@gnu.org + news:gnu.utils.help + news:gnu.utils.bug + + http://savannah.gnu.org/support/?group=make + +You may also find interesting patches to GNU Make available here: + + http://savannah.gnu.org/patch/?group=make + +Note these patches are provided by our users as a service and we make no +statements regarding their correctness. Please contact the authors +directly if you have a problem or suggestion for a patch available on +this page. + + +CVS Access +---------- + +The GNU make source repository is available via anonymous CVS from the +GNU Subversions CVS server; look here for details: + + http://savannah.gnu.org/cvs/?group=make + +Please note: you won't be able to build GNU make from CVS without +installing appropriate maintainer's tools, such as GNU m4, automake, +autoconf, Perl, GNU make, and GCC. See the README.cvs file for hints on +how to build GNU make once these tools are available. We make no +guarantees about the contents or quality of the latest code in the CVS +repository: it is not unheard of for code that is known to be broken to +be checked in. Use at your own risk. + + +System-specific Notes +--------------------- + +It has been reported that the XLC 1.2 compiler on AIX 3.2 is buggy such +that if you compile make with `cc -O' on AIX 3.2, it will not work +correctly. It is said that using `cc' without `-O' does work. + +The standard /bin/sh on SunOS 4.1.3_U1 and 4.1.4 is broken and cannot be +used to configure GNU make. Please install a different shell such as +bash or pdksh in order to run "configure". See this message for more +information: + http://mail.gnu.org/archive/html/bug-autoconf/2003-10/msg00190.html + +One area that is often a problem in configuration and porting is the code +to check the system's current load average. To make it easier to test and +debug this code, you can do `make check-loadavg' to see if it works +properly on your system. (You must run `configure' beforehand, but you +need not build Make itself to run this test.) + +Another potential source of porting problems is the support for large +files (LFS) in configure for those operating systems that provide it. +Please report any bugs that you find in this area. If you run into +difficulties, then as a workaround you should be able to disable LFS by +adding the `--disable-largefile' option to the `configure' script. + +On systems that support micro- and nano-second timestamp values and +where stat(2) provides this information, GNU make will use it when +comparing timestamps to get the most accurate possible result. However, +note that many current implementations of tools that *set* timestamps do +not preserve micro- or nano-second granularity. This means that "cp -p" +and other similar tools (tar, etc.) may not exactly duplicate timestamps +with micro- and nano-second granularity on some systems. If your build +system contains rules that depend on proper behavior of tools like "cp +-p", you should consider using the .LOW_RESOLUTION_TIME pseudo-target to +force make to treat them properly. See the manual for details. + + +Ports +----- + + - See README.customs for details on integrating GNU make with the + Customs distributed build environment from the Pmake distribution. + + - See readme.vms for details about GNU Make on OpenVMS. + + - See README.Amiga for details about GNU Make on AmigaDOS. + + - See README.W32 for details about GNU Make on Windows NT, 95, or 98. + + - See README.DOS for compilation instructions on MS-DOS and MS-Windows + using DJGPP tools. + + A precompiled binary of the MSDOS port of GNU Make is available as part + of DJGPP; see the WWW page http://www.delorie.com/djgpp/ for more + information. + +Please note there are two _separate_ ports of GNU make for Microsoft +systems: a native Windows tool built with (for example) MSVC or Cygwin, +and a DOS-based tool built with DJGPP. Please be sure you are looking +at the right README! + + +------------------------------------------------------------------------------- +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/README.Amiga b/README.Amiga new file mode 100644 index 0000000..091b8b4 --- /dev/null +++ b/README.Amiga @@ -0,0 +1,78 @@ +Short: Port of GNU make with SAS/C (no ixemul.library required) +Author: GNU, Amiga port by Aaron "Optimizer" Digulla +Uploader: Aaron "Optimizer" Digulla (digulla@fh-konstanz.de) +Type: dev/c + +This is a pure Amiga port of GNU make. It needs no extra libraries or +anything. It has the following features (in addition to any features of +GNU make): + +- Runs Amiga-Commands with SystemTags() (Execute) +- Can run multi-line statements +- Allows to use Device-Names in targets: + + c:make : make.o + + is ok. To distinguish between device-names and target : or ::, MAKE + looks for spaces. If there are any around :, it's taken as a target + delimiter, if there are none, it's taken as the name of a device. Note + that "make:make.o" tries to create "make.o" on the device "make:". +- Replaces @@ by a newline in any command line: + + if exists make @@\ + delete make.bak quiet @@\ + rename make make.bak @@\ + endif @@\ + $(CC) Link Make.o To make + + works. Note that the @@ must stand alone (ie. "make@@\" is illegal). + Also be carefull that there is a space after the "\" (ie, at the + beginning of the next line). +- Can be made resident to save space and time +- Amiga specific wildcards can be used in $(wildcard ...) + +BUGS: +- The line + + dummy.h : src/*.c + +tries to make dummy.h from "src/*.c" (ie. no wildcard-expansion takes +place). You have to use "$(wildcard src/*.c)" instead. + +COMPILING FROM SCRATCH +---------------------- + +To recompile, you need SAS/C 6.51. make itself is not neccessary, there +is an smakefile. + +1. Copy config.ami to config.h +2. If you use make to compie, copy Makefile.ami to Makefile and + glob/Makefile.ami to glob/Makefile. Copy make into the current + directory. + +3. Run smake/make + +INSTALLATION + +Copy make somewhere in your search path (eg. sc:c or sc:bin). +If you plan to use recursive makes, install make resident: + + Resident make Add + + +------------------------------------------------------------------------------- +Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/README.DOS b/README.DOS new file mode 100644 index 0000000..52529ab --- /dev/null +++ b/README.DOS @@ -0,0 +1,341 @@ +Port of GNU Make to 32-bit protected mode on MSDOS and MS-Windows. + +Builds with DJGPP v2 port of GNU C/C++ compiler and utilities. + + +New (since 3.74) DOS-specific features: + + 1. Supports long filenames when run from DOS box on Windows 9x. + + 2. Supports both stock DOS COMMAND.COM and Unix-style shells + (details in ``Notes'' below). + + 3. Supports DOS drive letters in dependencies and pattern rules. + + 4. Better support for DOS-style backslashes in pathnames (but see + ``Notes'' below). + + 5. The $(shell) built-in can run arbitrary complex commands, + including pipes and redirection, even when COMMAND.COM is your + shell. + + 6. Can be built without floating-point code (see below). + + 7. Supports signals in child programs and restores the original + directory if the child was interrupted. + + 8. Can be built without (a previous version of) Make. + + 9. The build process requires only standard tools. (Optional + targets like "install:" and "clean:" still need additional + programs, though, see below.) + + 10. Beginning with v3.78, the test suite works in the DJGPP + environment (requires Perl and auxiliary tools; see below). + + +To install a binary distribution: + + Simply unzip the makNNNb.zip file (where NNN is the version number) + preserving the directory structure (-d switch if you use PKUNZIP). + If you are installing Make on Windows 9X or Windows 2000, use an + unzip program that supports long filenames in zip files. After + unzipping, make sure the directory with make.exe is on your PATH, + and that's all you need to use Make. + + +To build from sources: + + 1. Unzip the archive, preserving the directory structure (-d switch + if you use PKUNZIP). If you build Make on Windows 9X or Windows + 2000, use an unzip program that supports long filenames in zip + files. + + If you are unpacking an official GNU source distribution, use + either DJTAR (which is part of the DJGPP development + environment), or the DJGPP port of GNU Tar. + + 2. Invoke the `configure.bat' batch file. + + If you are building Make in-place, i.e. in the same directory + where its sources are kept, just type "configure.bat" and press + [Enter]. Otherwise, you need to supply the path to the source + directory as an argument to the batch file, like this: + + c:\djgpp\gnu\make-3.82\configure.bat c:/djgpp/gnu/make-3.82 + + Note the forward slashes in the source path argument: you MUST + use them here. + + 3. If configure.bat doesn't find a working Make, it will suggest to + use the `dosbuild.bat' batch file to build Make. Either do as it + suggests or install another Make program (a pre-compiled binary + should be available from the usual DJGPP sites) and rerun + configure.bat. + + 4. If you will need to run Make on machines without an FPU, you + might consider building a version of Make which doesn't issue + floating-point instructions (they don't help much on MSDOS + anyway). To this end, edit the Makefile created by + configure.bat and add -DNO_FLOAT to the value of CPPFLAGS. + + 5. Invoke Make. + + If you are building from outside of the source directory, you + need to tell Make where the sources are, like this: + + make srcdir=c:/djgpp/gnu/make-3.82 + + (configure.bat will tell you this when it finishes). You MUST + use a full, not relative, name of the source directory here, or + else Make might fail. + + 6. After Make finishes, if you have a Unix-style shell installed, + you can use the `install' target to install the package. You + will also need GNU Fileutils and GNU Sed for this (they should + be available from the DJGPP sites). + + By default, GNU make will install into your DJGPP installation + area. If you wish to use a different directory, override the + DESTDIR variable when invoking "make install", like this: + + make install DESTDIR=c:/other/dir + + This causes the make executable to be placed in c:/other/dir/bin, + the man pages in c:/other/dir/man, etc. + + Without a Unix-style shell, you will have to install programs + and the docs manually. Copy make.exe to a directory on your + PATH, make.i* info files to your Info directory, and update the + file `dir' in your Info directory by adding the following item + to the main menu: + + * Make: (make.info). The GNU make utility. + + If you have the `install-info' program (from the GNU Texinfo + package), it will do that for you if you invoke it like this: + + install-info --info-dir=c:/djgpp/info c:/djgpp/info/make.info + + (If your Info directory is other than C:\DJGPP\INFO, change this + command accordingly.) + + 7. The `clean' targets also require Unix-style shell, and GNU Sed + and `rm' programs (the latter from Fileutils). + + 8. To run the test suite, type "make check". This requires a Unix + shell (I used the DJGPP port of Bash 2.03), Perl, Sed, Fileutils + and Sh-utils. + + +Notes: +----- + + 1. The shell issue. + + This is probably the most significant improvement, first + introduced in the port of GNU Make 3.75. + + The original behavior of GNU Make is to invoke commands + directly, as long as they don't include characters special to + the shell or internal shell commands, because that is faster. + When shell features like redirection or filename wildcards are + involved, Make calls the shell. + + This port supports both DOS shells (the stock COMMAND.COM and its + 4DOS/NDOS replacements), and Unix-style shells (tested with the + venerable Stewartson's `ms_sh' 2.3 and the DJGPP port of `bash' by + Daisuke Aoyama ). + + When the $SHELL variable points to a Unix-style shell, Make + works just like you'd expect on Unix, calling the shell for any + command that involves characters special to the shell or + internal shell commands. The only difference is that, since + there is no standard way to pass command lines longer than the + infamous DOS 126-character limit, this port of Make writes the + command line to a temporary disk file and then invokes the shell + on that file. + + If $SHELL points to a DOS-style shell, however, Make will not + call it automatically, as it does with Unix shells. Stock + COMMAND.COM is too dumb and would unnecessarily limit the + functionality of Make. For example, you would not be able to + use long command lines in commands that use redirection or + pipes. Therefore, when presented with a DOS shell, this port of + Make will emulate most of the shell functionality, like + redirection and pipes, and shall only call the shell when a + batch file or a command internal to the shell is invoked. (Even + when a command is an internal shell command, Make will first + search the $PATH for it, so that if a Makefile calls `mkdir', + you can install, say, a port of GNU `mkdir' and have it called + in that case.) + + The key to all this is the extended functionality of `spawn' and + `system' functions from the DJGPP library; this port just calls + `system' where it would invoke the shell on Unix. The most + important aspect of these functions is that they use a special + mechanism to pass long (up to 16KB) command lines to DJGPP + programs. In addition, `system' emulates some internal + commands, like `cd' (so that you can now use forward slashes + with it, and can also change the drive if the directory is on + another drive). Another aspect worth mentioning is that you can + call Unix shell scripts directly, provided that the shell whose + name is mentioned on the first line of the script is installed + anywhere along the $PATH. It is impossible to tell here + everything about these functions; refer to the DJGPP library + reference for more details. + + The $(shell) built-in is implemented in this port by calling + `popen'. Since `popen' calls `system', the above considerations + are valid for $(shell) as well. In particular, you can put + arbitrary complex commands, including pipes and redirection, + inside $(shell), which is in many cases a valid substitute for + the Unix-style command substitution (`command`) feature. + + + 2. "SHELL=/bin/sh" -- or is it? + + Many Unix Makefiles include a line which sets the SHELL, for + those versions of Make which don't have this as the default. + Since many DOS systems don't have `sh' installed (in fact, most + of them don't even have a `/bin' directory), this port takes + such directives with a grain of salt. It will only honor such a + directive if the basename of the shell name (like `sh' in the + above example) can indeed be found in the directory that is + mentioned in the SHELL= line (`/bin' in the above example), or + in the current working directory, or anywhere on the $PATH (in + that order). If the basename doesn't include a filename + extension, Make will look for any known extension that indicates + an executable file (.exe, .com, .bat, .btm, .sh, and even .sed + and .pl). If any such file is found, then $SHELL will be + defined to the exact pathname of that file, and that shell will + hence be used for the rest of processing. But if the named + shell is *not* found, the line which sets it will be effectively + ignored, leaving the value of $SHELL as it was before. Since a + lot of decisions that this port makes depend on the gender of + the shell, I feel it doesn't make any sense to tailor Make's + behavior to a shell which is nowhere to be found. + + Note that the above special handling of "SHELL=" only happens + for Makefiles; if you set $SHELL in the environment or on the + Make command line, you are expected to give the complete + pathname of the shell, including the filename extension. + + The default value of $SHELL is computed as on Unix (see the Make + manual for details), except that if $SHELL is not defined in the + environment, $COMSPEC is used. Also, if an environment variable + named $MAKESHELL is defined, it takes precedence over both + $COMSPEC and $SHELL. Note that, unlike Unix, $SHELL in the + environment *is* used to set the shell (since on MSDOS, it's + unlikely that the interactive shell will not be suitable for + Makefile processing). + + The bottom line is that you can now write Makefiles where some + of the targets require a real (i.e. Unix-like) shell, which will + nevertheless work when such shell is not available (provided, of + course, that the commands which should always work, don't + require such a shell). More important, you can convert Unix + Makefiles to MSDOS and leave the line which sets the shell + intact, so that people who do have Unixy shell could use it for + targets which aren't converted to DOS (like `install' and + `uninstall', for example). + + + 3. Default directories. + + GNU Make knows about standard directories where it searches for + library and include files mentioned in the Makefile. Since + MSDOS machines don't have standard places for these, this port + will search ${DJDIR}/lib and ${DJDIR}/include respectively. + $DJDIR is defined automatically by the DJGPP startup code as the + root of the DJGPP installation tree (unless you've tampered with + the DJGPP.ENV file). This should provide reasonable default + values, unless you moved parts of DJGPP to other directories. + + + 4. Letter-case in filenames. + + If you run Make on Windows 9x, you should be aware of the + letter-case issue. Make is internally case-sensitive, but all + file operations are case-insensitive on Windows 9x, so + e.g. files `FAQ', `faq' and `Faq' all refer to the same file, as + far as Windows is concerned. The underlying DJGPP C library + functions honor the letter-case of the filenames they get from + the OS, except that by default, they down-case 8+3 DOS filenames + which are stored in upper case in the directory and would break + many Makefiles otherwise. (The details of which filenames are + converted to lower case are explained in the DJGPP libc docs, + under the `_preserve_fncase' and `_lfn_gen_short_fname' + functions, but as a thumb rule, any filename that is stored in + upper case in the directory, is a valid DOS 8+3 filename and + doesn't include characters invalid on MSDOS FAT filesystems, + will be automatically down-cased.) User reports that I have + indicate that this default behavior is generally what you'd + expect; however, your input is most welcome. + + In any case, if you hit a situation where you must force Make to + get the 8+3 DOS filenames in upper case, set FNCASE=y in the + environment or in the Makefile. + + + 5. DOS-style pathnames. + + There are a lot of places throughout the program sources which + make implicit assumptions about the pathname syntax. In + particular, the directories are assumed to be separated by `/', + and any pathname which doesn't begin with a `/' is assumed to be + relative to the current directory. This port attempts to + support DOS-style pathnames which might include the drive letter + and use backslashes instead of forward slashes. However, this + support is not complete; I feel that pursuing this support too + far might break some more important features, particularly if + you use a Unix-style shell (where a backslash is a quote + character). I only consider support of backslashes desirable + because some Makefiles invoke non-DJGPP programs which don't + understand forward slashes. A notable example of such programs + is the standard programs which come with MSDOS. Otherwise, you + are advised to stay away from backslashes whenever possible. In + particular, filename globbing won't work on pathnames with + backslashes, because the GNU `glob' library doesn't support them + (backslash is special in filename wildcards, and I didn't want + to break that). + + One feature which *does* work with backslashes is the filename- + related built-in functions such as $(dir), $(notdir), etc. + Drive letters in pathnames are also fully supported. + + + +Bug reports: +----------- + + Bugs that are clearly related to the MSDOS/DJGPP port should be + reported first on the comp.os.msdos.djgpp news group (if you cannot + post to Usenet groups, write to the DJGPP mailing list, + , which is an email gateway into the above news + group). For other bugs, please follow the procedure explained in + the "Bugs" chapter of the Info docs. If you don't have an Info + reader, look up that chapter in the `make.i1' file with any text + browser/editor. + + + Enjoy, + Eli Zaretskii + + +------------------------------------------------------------------------------- +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/README.OS2 b/README.OS2 new file mode 100644 index 0000000..0da6385 --- /dev/null +++ b/README.OS2 @@ -0,0 +1,177 @@ +Port of GNU make to OS/2. + +Features of GNU make that do not work under OS/2: + - remote job execution + - dynamic load balancing + + +Special features of the OS/2 version: + +Due to the fact that some people might want to use sh syntax in +Makefiles while others might want to use OS/2's native shell cmd.exe, +GNU make supports both shell types. The following list defines the order +that is used to determine the shell: + + 1. The shell specified by the environment variable MAKESHELL. + 2. The shell specified by the SHELL variable within a Makefile. Like + Unix, SHELL is NOT taken from the environment. + 3. The shell specified by the COMSPEC environment variable. + 4. The shell specified by the OS2_SHELL environment variable. + 5. If none of the above is defined /bin/sh is used as default. This + happens e.g. in the make testsuite. + +Note: - Points 3 and 4 can be turned off at compile time by adding + -DNO_CMD_DEFAULT to the CPPFLAGS. + - DOS support is not tested for EMX and therefore might not work. + - The UNIXROOT environment variable is supported to find /bin/sh + if it is not on the current drive. + + +COMPILATION OF GNU MAKE FOR OS/2: + +I. ***** SPECIAL OPTIONS ***** + + - At compile time you can turn off that cmd is used as default shell + (but only /bin/sh). Simply set CPPFLAGS="-DNO_CMD_DEFAULT" and make + will not use cmd unless you cause it to do so by setting MAKESHELL to + cmd or by specifying SHELL=cmd in your Makefile. + + - At compile time you can set CPPFLAGS="-DNO_CHDIR2" to turn off that + GNU make prints drive letters. This is necessary if you want to run + the testsuite. + + +II. ***** REQUIREMENTS FOR THE COMPILATION ***** + +A standard Unix like build environment: + + - sh compatible shell (ksh, bash, ash, but tested only with pdksh 5.2.14 + release 2) + If you use pdksh it is recommended to update to 5.2.14 release 2. Older + versions may not work! You can get this version at + http://www.math.ohio-state.edu/~ilya/software/os2/pdksh-5.2.14-bin-2.zip + - GNU file utilities (make sure that install.exe from the file utilities + is in front of your PATH before X:\OS2\INSTALL\INSTALL.EXE. I recommend + also to change the filename to ginstall.exe instead of install.exe + to avoid confusion with X:\OS2\INSTALL\INSTALL.EXE) + - GNU shell utilities + - GNU text utilities + - gawk + - grep + - sed + - GNU make 3.79.1 (special OS/2 patched version) or higher + - perl 5.005 or higher + - GNU texinfo (you can use 3.1 (gnuinfo.zip), but I recommend 4.0) + +If you want to recreate the configuration files (developers only!) +you need also: GNU m4 1.4, autoconf 2.59, automake 1.9.6 (or compatible) + + +III. ***** COMPILATION AND INSTALLATION ***** + + a) ** Developers only - Everyone else should skip this section ** + To recreate the configuration files use: + + export EMXSHELL=ksh + aclocal -I config + automake + autoconf + autoheader + + +b) Installation into x:/usr + + Note: Although it is possible to compile make using "./configure", + "make", "make install" this is not recommended. In particular, + you must ALWAYS use LDFLAGS="-Zstack 0x6000" because the default + stack size is far to small and make will not work properly! + +Recommended environment variables and installation options: + + export ac_executable_extensions=".exe" + export CPPFLAGS="-D__ST_MT_ERRNO__" + export CFLAGS="-O2 -Zomf -Zmt" + export LDFLAGS="-Zcrtdll -Zlinker /exepack:2 -Zlinker /pm:vio -Zstack 0x6000" + export RANLIB="echo" + ./configure --prefix=x:/usr --infodir=x:/usr/share/info --mandir=x:/usr/share/man --without-included-gettext + make AR=emxomfar + make install + +Note: If you use gcc 2.9.x I recommend to set also LIBS="-lgcc" + +Note: You can add -DNO_CMD_DEFAULT and -DNO_CHDIR2 to CPPFLAGS. + See section I. for details. + + +IV. ***** NLS support ***** + +GNU make has NLS (National Language Support), with the following +caveats: + + a) It will only work with GNU gettext, and + b) GNU gettext support is not included in the GNU make package. + +Therefore, if you wish to enable the internationalization features of +GNU make you must install GNU gettext on your system before configuring +GNU make. + +You can choose the languages to be installed. To install support for +English, German and French only enter: + + export LINGUAS="en de fr" + +If you don't specify LINGUAS all languages are installed. + +If you don't want NLS support (English only) use the option +--disable-nls for the configure script. Note if GNU gettext is not +installed then NLS will not be enabled regardless of this flag. + + +V. ***** Running the make test suite ***** + +To run the included make test suite you have to set + + CPPFLAGS="-D__ST_MT_ERRNO__ -DNO_CMD_DEFAULT -DNO_CHDIR2" + +before you compile make. This is due to some restrictions of the +testsuite itself. -DNO_CMD_DEFAULT causes make to use /bin/sh as default +shell in every case. Normally you could simply set MAKESHELL="/bin/sh" +to do this but the testsuite ignores the environment. -DNO_CHDIR2 causes +make not to use drive letters for directory names (i.e. _chdir2() and +_getcwd2() are NOT used). The testsuite interpretes the whole output of +make, especially statements like make[1]: Entering directory +`C:/somewhere/make-3.79.1/tests' where the testsuite does not expect the +drive letter. This would be interpreted as an error even if there is +none. + +To run the testsuite do the following: + + export CPPFLAGS="-D__ST_MT_ERRNO__ -DNO_CMD_DEFAULT -DNO_CHDIR2" + export CFLAGS="-Zomf -O2 -Zmt" + export LDFLAGS="-Zcrtdll -s -Zlinker /exepack:2 -Zlinker /pm:vio -Zstack 0x6000" + export RANLIB="echo" + ./configure --prefix=x:/usr --disable-nls + make AR=emxomfar + make check + +All tests should work fine with the exception of one of the "INCLUDE_DIRS" +tests which will fail if your /usr/include directory is on a drive different +from the make source tree. + + +------------------------------------------------------------------------------- +Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/README.W32 b/README.W32 new file mode 100644 index 0000000..60025d0 --- /dev/null +++ b/README.W32 @@ -0,0 +1,289 @@ +This version of GNU make has been tested on Microsoft Windows 2000/XP/2003. +It has also been used on Windows 95/98/NT, and on OS/2. + +It builds with the MinGW port of GCC (tested with GCC 3.4.2). + +It also builds with MSVC 2.x, 4.x, 5.x, 6.x, and 2003 as well as +with .NET 7.x and .NET 2003. + +The Windows 32-bit port of GNU make is maintained jointly by various +people. It was originally made by Rob Tulloh. + + +Do this first, regardless of the build method you choose: +--------------------------------------------------------- + + 1. At the Windows command prompt run: + + if not exist NMakefile copy NMakefile.template NMakefile + if not exist config.h copy config.h.W32 config.h + + Then edit config.h to your liking (especially the few shell-related + defines near the end, or HAVE_CASE_INSENSITIVE_FS which corresponds + to './configure --enable-case-insensitive-file-system'). + + +Using make_msvc_net2003.vcproj +------------------------------ + + 2. Open make_msvc_net2003.vcproj in MSVS71 or MSVC71 or any compatible IDE, + then build this project as usual. There's also a solution file for + Studio 2003. + + +Building with (MinGW-)GCC using build_w32.bat +--------------------------------------------- + + 2. Open a W32 command prompt for your installed (MinGW-)GCC, setup a + correct PATH and other environment variables for it, then execute ... + + build_w32.bat gcc + + This produces gnumake.exe in the current directory. + + +Building with (MSVC++-)cl using build_w32.bat or NMakefile +---------------------------------------------------------- + + 2. Open a W32 command prompt for your installed (MSVC++-)cl, setup a + correct PATH and other environment variables for it (usually via + executing vcvars32.bat or vsvars32.bat from the cl-installation, + e.g. "%VS71COMNTOOLS%vsvars32.bat"; or using a corresponding start + menue entry from the cl-installation), then execute EITHER ... + + build_w32.bat + + (this produces WinDebug/gnumake.exe and WinRel/gnumake.exe) + + ... OR ... + + nmake /f NMakefile + + (this produces WinDebug/make.exe and WinRel/make.exe). + + +------------------- +-- Notes/Caveats -- +------------------- + +GNU make on Windows 32-bit platforms: + + This version of make is ported natively to Windows32 platforms + (Windows NT 3.51, Windows NT 4.0, Windows 2000, Windows XP, + Windows 95, and Windows 98). It does not rely on any 3rd party + software or add-on packages for building. The only thing + needed is a Windows compiler. Two compilers supported + officially are the MinGW port of GNU GCC, and the various + versions of the Microsoft C compiler. + + Do not confuse this port of GNU make with other Windows32 projects + which provide a GNU make binary. These are separate projects + and are not connected to this port effort. + +GNU make and sh.exe: + + This port prefers if you have a working sh.exe somewhere on + your system. If you don't have sh.exe, the port falls back to + MSDOS mode for launching programs (via a batch file). The + MSDOS mode style execution has not been tested that carefully + though (The author uses GNU bash as sh.exe). + + There are very few true ports of Bourne shell for NT right now. + There is a version of GNU bash available from Cygnus "Cygwin" + porting effort (http://www.cygwin.com/). + Other possibilities are the MKS version of sh.exe, or building + your own with a package like NutCracker (DataFocus) or Portage + (Consensys). Also MinGW includes sh (http://mingw.org/). + +GNU make and brain-dead shells (BATCH_MODE_ONLY_SHELL): + + Some versions of Bourne shell do not behave well when invoked + as 'sh -c' from CreateProcess(). The main problem is they seem + to have a hard time handling quoted strings correctly. This can + be circumvented by writing commands to be executed to a batch + file and then executing the command by calling 'sh file'. + + To work around this difficulty, this version of make supports + a batch mode. When BATCH_MODE_ONLY_SHELL is defined at compile + time, make forces all command lines to be executed via script + files instead of by command line. In this mode you must have a + working sh.exe in order to use parallel builds (-j). + + A native Windows32 system with no Bourne shell will also run + in batch mode. All command lines will be put into batch files + and executed via $(COMSPEC) (%COMSPEC%). However, parallel + builds ARE supported with Windows shells (cmd.exe and + command.com). See the next section about some peculiarities + of parallel builds on Windows. + +Support for parallel builds + + Parallel builds (-jN) are supported in this port, with 2 + limitations: + + - The number of concurrent processes has a hard limit of 64, + due to the way this port implements waiting for its + subprocesses; + + - The job server method (available when Make runs on Posix + platforms) is not supported, which means you must pass an + explicit -jN switch to sub-Make's in a recursive Makefile. + If a sub-Make does not receive an explicit -jN switch, it + will default to -j1, i.e. no parallelism in sub-Make's. + +GNU make and Cygnus GNU Windows32 tools: + + Good news! Make now has native support for Cygwin sh. To enable, + define the HAVE_CYGWIN_SHELL in config.h and rebuild make + from scratch. This version of make tested with B20.1 of Cygwin. + Do not define BATCH_MODE_ONLY_SHELL if you use HAVE_CYGWIN_SHELL. + +GNU make and the MKS shell: + + There is now semi-official support for the MKS shell. To turn this + support on, define HAVE_MKS_SHELL in the config.h.W32 before you + build make. Do not define BATCH_MODE_ONLY_SHELL if you turn + on HAVE_MKS_SHELL. + +GNU make handling of drive letters in pathnames (PATH, vpath, VPATH): + + There is a caveat that should be noted with respect to handling + single character pathnames on Windows systems. When colon is + used in PATH variables, make tries to be smart about knowing when + you are using colon as a separator versus colon as a drive + letter. Unfortunately, something as simple as the string 'x:/' + could be interpreted 2 ways: (x and /) or (x:/). + + Make chooses to interpret a letter plus colon (e.g. x:/) as a + drive letter pathname. If it is necessary to use single + character directories in paths (VPATH, vpath, Path, PATH), the + user must do one of two things: + + a. Use semicolon as the separator to disambiguate colon. For + example use 'x;/' if you want to say 'x' and '/' are + separate components. + + b. Qualify the directory name so that there is more than + one character in the path(s) used. For example, none + of these settings are ambiguous: + + ./x:./y + /some/path/x:/some/path/y + x:/some/path/x:x:/some/path/y + + Please note that you are free to mix colon and semi-colon in the + specification of paths. Make is able to figure out the intended + result and convert the paths internally to the format needed + when interacting with the operating system, providing the path + is not within quotes, e.g. "x:/test/test.c". + + You are encouraged to use colon as the separator character. + This should ease the pain of deciding how to handle various path + problems which exist between platforms. If colon is used on + both Unix and Windows systems, then no ifdef'ing will be + necessary in the makefile source. + +GNU make test suite: + + I verified all functionality with a slightly modified version + of make-test-3.82 (modifications to get test suite to run + on Windows NT). All tests pass in an environment that includes + sh.exe. Tests were performed on both Windows NT and Windows 95. + +Pathnames and white space: + + Unlike Unix, Windows 95/NT systems encourage pathnames which + contain white space (e.g. C:\Program Files\). These sorts of + pathnames are valid on Unix too, but are never encouraged. + There is at least one place in make (VPATH/vpath handling) where + paths containing white space will simply not work. There may be + others too. I chose to not try and port make in such a way so + that these sorts of paths could be handled. I offer these + suggestions as workarounds: + + 1. Use 8.3 notation. i.e. "x:/long~1/", which is actually + "x:\longpathtest". Type "dir /x" to view these filenames + within the cmd.exe shell. + 2. Rename the directory so it does not contain white space. + + If you are unhappy with this choice, this is free software + and you are free to take a crack at making this work. The code + in w32/pathstuff.c and vpath.c would be the places to start. + +Pathnames and Case insensitivity: + + Unlike Unix, Windows 95/NT systems are case insensitive but case + preserving. For example if you tell the file system to create a + file named "Target", it will preserve the case. Subsequent access to + the file with other case permutations will succeed (i.e. opening a + file named "target" or "TARGET" will open the file "Target"). + + By default, GNU make retains its case sensitivity when comparing + target names and existing files or directories. It can be + configured, however, into a case preserving and case insensitive + mode by adding a define for HAVE_CASE_INSENSITIVE_FS to + config.h.W32. + + For example, the following makefile will create a file named + Target in the directory subdir which will subsequently be used + to satisfy the dependency of SUBDIR/DepTarget on SubDir/TARGET. + Without HAVE_CASE_INSENSITIVE_FS configured, the dependency link + will not be made: + + subdir/Target: + touch $@ + + SUBDIR/DepTarget: SubDir/TARGET + cp $^ $@ + + Reliance on this behavior also eliminates the ability of GNU make + to use case in comparison of matching rules. For example, it is + not possible to set up a C++ rule using %.C that is different + than a C rule using %.c. GNU make will consider these to be the + same rule and will issue a warning. + +SAMBA/NTFS/VFAT: + + I have not had any success building the debug version of this + package using SAMBA as my file server. The reason seems to be + related to the way VC++ 4.0 changes the case name of the pdb + filename it is passed on the command line. It seems to change + the name always to to lower case. I contend that the VC++ + compiler should not change the casename of files that are passed + as arguments on the command line. I don't think this was a + problem in MSVC 2.x, but I know it is a problem in MSVC 4.x. + + The package builds fine on VFAT and NTFS filesystems. + + Most all of the development I have done to date has been using + NTFS and long file names. I have not done any considerable work + under VFAT. VFAT users may wish to be aware that this port of + make does respect case sensitivity. + +FAT: + + Version 3.76 added support for FAT filesystems. Make works + around some difficulties with stat'ing of files and caching of + filenames and directories internally. + +Bug reports: + + Please submit bugs via the normal bug reporting mechanism which + is described in the GNU make manual and the base README. + +------------------------------------------------------------------------------- +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/README.customs b/README.customs new file mode 100644 index 0000000..0ad1837 --- /dev/null +++ b/README.customs @@ -0,0 +1,113 @@ + -*-indented-text-*- + +GNU make can utilize the Customs library, distributed with Pmake, to +provide builds distributed across multiple hosts. + +In order to utilize this capability, you must first download and build +the Customs library. It is contained in the Pmake distribution, which +can be obtained at: + + ftp://ftp.icsi.berkeley.edu/pub/ai/stolcke/software/ + +This integration was tested (superficially) with Pmake 2.1.33. + + +BUILDING CUSTOMS +---------------- + +First, build pmake and Customs. You need to build pmake first, because +Customs require pmake to build. Unfortunately, this is not trivial; +please see the pmake and Customs documentation for details. The best +place to look for instructions is in the pmake-2.1.33/INSTALL file. + +Note that the 2.1.33 Pmake distribution comes with a set of patches to +GNU make, distributed in the pmake-2.1.33/etc/gnumake/ directory. These +patches are based on GNU make 3.75 (there are patches for earlier +versions of GNU make, also). The parts of this patchfile which relate +directly to Customs support have already been incorporated into this +version of GNU make, so you should _NOT_ apply the patch file. + +However, there are a few non-Customs specific (as far as I could tell) +changes here which are not incorporated (for example, the modification +to try expanding -lfoo to libfoo.so). If you rely on these changes +you'll need to re-apply them by hand. + +Install the Customs library and header files according to the +documentation. You should also install the man pages (contrary to +comments in the documentation, they weren't installed automatically for +me; I had to cd to the ``pmake-2.1.33/doc'' directory and run ``pmake +install'' there directly). + + +BUILDING GNU MAKE +----------------- + +Once you've installed Customs, you can build GNU make to use it. When +configuring GNU make, merely use the ``--with-customs=DIR'' option. +Provide the directory containing the ``lib'' and ``include/customs'' +subdirectories as DIR. For example, if you installed the customs +library in /usr/local/lib and the headers in /usr/local/include/customs, +then you'd pass ``--with-customs=/usr/local'' as an option to configure. + +Run make (or use build.sh) normally to build GNU make as described in +the INSTALL file. + +See the documentation for Customs for information on starting and +configuring Customs. + + +INVOKING CUSTOMS-IZED GNU MAKE +----------------------------- + +One thing you should be aware of is that the default build environment +for Customs requires root permissions. Practically, this means that GNU +make must be installed setuid root to use Customs. + +If you don't want to do this, you can build Customs such that root +permissions are not necessary. Andreas Stolcke +writes: + + > pmake, gnumake or any other customs client program is not required to + > be suid root if customs was compiled WITHOUT the USE_RESERVED_PORTS + > option in customs/config.h. Make sure the "customs" service in + > /etc/services is defined accordingly (port 8231 instead of 1001). + + > Not using USE_RESERVED_PORTS means that a user with programming + > skills could impersonate another user by writing a fake customs + > client that pretends to be someone other than himself. See the + > discussion in etc/SECURITY. + + +PROBLEMS +-------- + +SunOS 4.1.x: + The customs/sprite.h header file #includes the header + files; this conflicts with GNU make's configuration so you'll get a + compile error if you use GCC (or any other ANSI-capable C compiler). + + I commented out the #include in sprite.h:107: + + #if defined(sun) || defined(ultrix) || defined(hpux) || defined(sgi) + /* #include */ + #else + + YMMV. + + +------------------------------------------------------------------------------- +Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, +2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/SCOPTIONS b/SCOPTIONS new file mode 100644 index 0000000..f89daae --- /dev/null +++ b/SCOPTIONS @@ -0,0 +1,13 @@ +ERRORREXX +OPTIMIZE +NOVERSION +OPTIMIZERTIME +OPTIMIZERALIAS +DEFINE INCLUDEDIR="include:" +DEFINE LIBDIR="lib:" +DEFINE NO_ALLOCA +DEFINE NO_FLOAT +DEFINE NO_ARCHIVES +IGNORE=161 +IGNORE=100 +STARTUP=cres diff --git a/SMakefile b/SMakefile new file mode 100644 index 0000000..2a46032 --- /dev/null +++ b/SMakefile @@ -0,0 +1,389 @@ +# -*-Makefile-*- for building GNU make with smake +# +# NOTE: If you have no 'make' program at all to process this makefile, +# run 'build.sh' instead. +# +# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +# +# Makefile for GNU Make +# + +# Ultrix 2.2 make doesn't expand the value of VPATH. +VPATH = /make-3.82/ +# This must repeat the value, because configure will remove `VPATH = .'. +srcdir = /make-3.82/ + +CC = sc +RM = delete +MAKE = smake + +CFLAGS = +CPPFLAGS = +LDFLAGS = + +# Define these for your system as follows: +# -DNO_ARCHIVES To disable `ar' archive support. +# -DNO_FLOAT To avoid using floating-point numbers. +# -DENUM_BITFIELDS If the compiler isn't GCC but groks enum foo:2. +# Some compilers apparently accept this +# without complaint but produce losing code, +# so beware. +# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline. +# See also `config.h'. +defines = + +# Which flavor of remote job execution support to use. +# The code is found in `remote-$(REMOTE).c'. +REMOTE = stub + +# If you are using the GNU C library, or have the GNU getopt functions in +# your C library, you can comment these out. +GETOPT = getopt.o getopt1.o +GETOPT_SRC = $(srcdir)getopt.c $(srcdir)getopt1.c $(srcdir)getopt.h + +# If you are using the GNU C library, or have the GNU glob functions in +# your C library, you can comment this out. GNU make uses special hooks +# into the glob functions to be more efficient (by using make's directory +# cache for globbing), so you must use the GNU functions even if your +# system's C library has the 1003.2 glob functions already. Also, the glob +# functions in the AIX and HPUX C libraries are said to be buggy. +GLOB = Lib glob/glob.lib + +# If your system doesn't have alloca, or the one provided is bad, define this. +ALLOCA = alloca.o +ALLOCA_SRC = $(srcdir)alloca.c + +# If your system needs extra libraries loaded in, define them here. +# System V probably need -lPW for alloca. HP-UX 7.0's alloca in +# libPW.a is broken on HP9000s300 and HP9000s400 machines. Use +# alloca.c instead on those machines. +LOADLIBES = + +# Any extra object files your system needs. +extras = amiga.o + +# Common prefix for machine-independent installed files. +prefix = +# Common prefix for machine-dependent installed files. +exec_prefix = + +# Directory to install `make' in. +bindir = sc:c +# Directory to find libraries in for `-lXXX'. +libdir = lib: +# Directory to search by default for included makefiles. +includedir = include: +# Directory to install the Info files in. +infodir = doc: +# Directory to install the man page in. +mandir = t: +# Number to put on the man page filename. +manext = 1 +# Prefix to put on installed `make' binary file name. +binprefix = +# Prefix to put on installed `make' man page file name. +manprefix = $(binprefix) + +# Whether or not make needs to be installed setgid. +# The value should be either `true' or `false'. +# On many systems, the getloadavg function (used to implement the `-l' +# switch) will not work unless make is installed setgid kmem. +install_setgid = false +# Install make setgid to this group so it can read /dev/kmem. +group = sys + +# Program to install `make'. +INSTALL_PROGRAM = copy +# Program to install the man page. +INSTALL_DATA = copy +# Generic install program. +INSTALL = copy + +# Program to format Texinfo source into Info files. +MAKEINFO = makeinfo +# Program to format Texinfo source into DVI files. +TEXI2DVI = texi2dvi + +# Programs to make tags files. +ETAGS = etags -w +CTAGS = ctags -w + +objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o \ + rule.o implicit.o default.o variable.o expand.o function.o \ + vpath.o version.o ar.o arscan.o signame.o strcache.o hash.o \ + remote-$(REMOTE).o $(GLOB) $(GETOPT) $(ALLOCA) $(extras) +srcs = $(srcdir)commands.c $(srcdir)job.c $(srcdir)dir.c \ + $(srcdir)file.c $(srcdir)getloadavg.c $(srcdir)misc.c \ + $(srcdir)main.c $(srcdir)read.c $(srcdir)remake.c \ + $(srcdir)rule.c $(srcdir)implicit.c $(srcdir)default.c \ + $(srcdir)variable.c $(srcdir)expand.c $(srcdir)function.c \ + $(srcdir)vpath.c $(srcdir)version.c $(srcdir)hash.c \ + $(srcdir)remote-$(REMOTE).c \ + $(srcdir)ar.c $(srcdir)arscan.c $(srcdir)strcache.c \ + $(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC) \ + $(srcdir)commands.h $(srcdir)dep.h $(srcdir)file.h \ + $(srcdir)job.h $(srcdir)make.h $(srcdir)rule.h \ + $(srcdir)variable.h $(ALLOCA_SRC) $(srcdir)config.h.in + + +.SUFFIXES: +.SUFFIXES: .o .c .h .ps .dvi .info .texinfo + +all: make +info: make.info +dvi: make.dvi +# Some makes apparently use .PHONY as the default goal if it is before `all'. +.PHONY: all check info dvi + +make.info: make.texinfo + $(MAKEINFO) -I$(srcdir) $(srcdir)make.texinfo -o make.info + +make.dvi: make.texinfo + $(TEXI2DVI) $(srcdir)make.texinfo + +make.ps: make.dvi + dvi2ps make.dvi > make.ps + +make: $(objs) glob/glob.lib + $(CC) Link $(LDFLAGS) $(objs) $(LOADLIBES) To make.new + -delete quiet make + rename make.new make + +# -I. is needed to find config.h in the build directory. +.c.o: + $(CC) $(defines) IDir "" IDir $(srcdir)glob \ + $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) + +glob/glob.lib: + execute << + cd glob + smake +< + +tagsrcs = $(srcs) $(srcdir)remote-*.c +TAGS: $(tagsrcs) + $(ETAGS) $(tagsrcs) +tags: $(tagsrcs) + $(CTAGS) $(tagsrcs) + +.PHONY: install installdirs +install: + copy make sc:c + +loadavg: loadavg.c config.h + $(CC) $(defines) -DTEST -I. -I$(srcdir) $(CFLAGS) $(LDFLAGS) \ + loadavg.c $(LOADLIBES) -o $@ + +clean: glob-clean + -$(RM) -f make loadavg *.o core make.dvi + +distclean: clean glob-realclean + -$(RM) -f Makefile config.h config.status build.sh + -$(RM) -f config.log config.cache + -$(RM) -f TAGS tags + -$(RM) -f make.?? make.??s make.log make.toc make.*aux + -$(RM) -f loadavg.c + +realclean: distclean + -$(RM) -f make.info* + +mostlyclean: clean + +.PHONY: glob-clean glob-realclean + +glob-clean glob-realclean: + execute << + cd glob + smake $@ +< + +# --------------- DEPENDENCIES +# + +# .deps/alloca.Po +# dummy + +# .deps/ar.Po +ar.o: ar.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h dep.h \ + +# .deps/arscan.Po +arscan.o: arscan.c make.h config.h \ + getopt.h \ + gettext.h \ + +# .deps/commands.Po +commands.o: commands.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h hash.h variable.h job.h \ + commands.h + +# .deps/default.Po +default.o: default.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h rule.h dep.h \ + job.h \ + commands.h + +# .deps/dir.Po +dir.o: dir.c make.h config.h \ + getopt.h \ + gettext.h \ + hash.h \ + +# .deps/expand.Po +expand.o: expand.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h \ + job.h \ + commands.h variable.h \ + rule.h + +# .deps/file.Po +file.o: file.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h \ + hash.h job.h \ + commands.h variable.h \ + debug.h + +# .deps/function.Po +function.o: function.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h dep.h job.h \ + commands.h debug.h + +# .deps/getloadavg.Po +# dummy + +# .deps/getopt.Po +getopt.o: getopt.c config.h \ + +# .deps/getopt1.Po +getopt1.o: getopt1.c config.h getopt.h \ + +# .deps/hash.Po +hash.o: hash.c make.h config.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/implicit.Po +implicit.o: implicit.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h rule.h dep.h debug.h \ + variable.h job.h \ + commands.h + +# .deps/job.Po +job.o: job.c make.h config.h \ + getopt.h \ + gettext.h \ + job.h \ + debug.h filedef.h hash.h commands.h \ + variable.h + +# .deps/loadavg-getloadavg.Po +# dummy + +# .deps/main.Po +main.o: main.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h hash.h variable.h job.h \ + commands.h rule.h debug.h getopt.h \ + +# .deps/misc.Po +misc.o: misc.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h debug.h + +# .deps/read.Po +read.o: read.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h hash.h job.h \ + commands.h variable.h rule.h debug.h \ + +# .deps/remake.Po +remake.o: remake.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + commands.h dep.h variable.h debug.h \ + +# .deps/remote-cstms.Po +# dummy + +# .deps/remote-stub.Po +remote-stub.o: remote-stub.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h job.h \ + commands.h + +# .deps/rule.Po +rule.o: rule.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h \ + hash.h job.h \ + commands.h variable.h \ + rule.h + +# .deps/signame.Po +signame.o: signame.c make.h config.h \ + getopt.h \ + gettext.h \ + +# .deps/strcache.Po +strcache.o: strcache.c make.h config.h \ + getopt.h \ + gettext.h \ + hash.h + +# .deps/variable.Po +variable.o: variable.c make.h config.h \ + getopt.h \ + gettext.h \ + dep.h filedef.h \ + hash.h job.h \ + commands.h variable.h \ + rule.h + +# .deps/version.Po +version.o: version.c config.h + +# .deps/vmsjobs.Po +# dummy + +# .deps/vpath.Po +vpath.o: vpath.c make.h config.h \ + getopt.h \ + gettext.h \ + filedef.h hash.h variable.h diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..0e56441 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,129 @@ +dnl acinclude.m4 -- Extra macros needed for GNU make. +dnl +dnl Automake will incorporate this into its generated aclocal.m4. +dnl Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, +dnl 2008, 2009, 2010 Free Software Foundation, Inc. +dnl This file is part of GNU Make. +dnl +dnl GNU Make is free software; you can redistribute it and/or modify it under +dnl the terms of the GNU General Public License as published by the Free +dnl Software Foundation; either version 3 of the License, or (at your option) +dnl any later version. +dnl +dnl GNU Make is distributed in the hope that it will be useful, but WITHOUT +dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for. +dnl more details. +dnl +dnl You should have received a copy of the GNU General Public License along +dnl with this program. If not, see . + +dnl --------------------------------------------------------------------------- +dnl Got this from the lynx 2.8 distribution. +dnl by T.E.Dickey +dnl and Jim Spath +dnl and Philippe De Muyter +dnl +dnl Created: 1997/1/28 +dnl Updated: 1997/12/23 +dnl --------------------------------------------------------------------------- +dnl After checking for functions in the default $LIBS, make a further check +dnl for the functions that are netlib-related (these aren't always in the +dnl libc, etc., and have to be handled specially because there are conflicting +dnl and broken implementations. +dnl Common library requirements (in order): +dnl -lresolv -lsocket -lnsl +dnl -lnsl -lsocket +dnl -lsocket +dnl -lbsd +AC_DEFUN([CF_NETLIBS],[ +cf_test_netlibs=no +AC_MSG_CHECKING(for network libraries) +AC_CACHE_VAL(cf_cv_netlibs,[ +AC_MSG_RESULT(working...) +cf_cv_netlibs="" +cf_test_netlibs=yes +AC_CHECK_FUNCS(gethostname,,[ + CF_RECHECK_FUNC(gethostname,nsl,cf_cv_netlibs,[ + CF_RECHECK_FUNC(gethostname,socket,cf_cv_netlibs)])]) +# +# FIXME: sequent needs this library (i.e., -lsocket -linet -lnsl), but +# I don't know the entrypoints - 97/7/22 TD +AC_CHECK_LIB(inet,main,cf_cv_netlibs="-linet $cf_cv_netlibs") +# +if test "$ac_cv_func_lsocket" != no ; then +AC_CHECK_FUNCS(socket,,[ + CF_RECHECK_FUNC(socket,socket,cf_cv_netlibs,[ + CF_RECHECK_FUNC(socket,bsd,cf_cv_netlibs)])]) +fi +# +AC_CHECK_FUNCS(gethostbyname,,[ + CF_RECHECK_FUNC(gethostbyname,nsl,cf_cv_netlibs)]) +]) +LIBS="$LIBS $cf_cv_netlibs" +test $cf_test_netlibs = no && echo "$cf_cv_netlibs" >&AC_FD_MSG +])dnl +dnl --------------------------------------------------------------------------- +dnl Re-check on a function to see if we can pick it up by adding a library. +dnl $1 = function to check +dnl $2 = library to check in +dnl $3 = environment to update (e.g., $LIBS) +dnl $4 = what to do if this fails +dnl +dnl This uses 'unset' if the shell happens to support it, but leaves the +dnl configuration variable set to 'unknown' if not. This is a little better +dnl than the normal autoconf test, which gives misleading results if a test +dnl for the function is made (e.g., with AC_CHECK_FUNC) after this macro is +dnl used (autoconf does not distinguish between a null token and one that is +dnl set to 'no'). +AC_DEFUN([CF_RECHECK_FUNC],[ +AC_CHECK_LIB($2,$1,[ + CF_UPPER(cf_tr_func,$1) + AC_DEFINE_UNQUOTED(HAVE_$cf_tr_func,1,[Define if you have function $1]) + ac_cv_func_$1=yes + $3="-l$2 [$]$3"],[ + ac_cv_func_$1=unknown + unset ac_cv_func_$1 2>/dev/null + $4], + [[$]$3]) +])dnl +dnl --------------------------------------------------------------------------- +dnl Make an uppercase version of a variable +dnl $1=uppercase($2) +AC_DEFUN([CF_UPPER], +[ +changequote(,)dnl +$1=`echo $2 | tr '[a-z]' '[A-Z]'` +changequote([,])dnl +])dnl + + +dnl --------------------------------------------------------------------------- +dnl From Paul Eggert + +AC_DEFUN([AC_STRUCT_ST_MTIM_NSEC], + [AC_CACHE_CHECK([for nanoseconds field of struct stat.st_mtim], + ac_cv_struct_st_mtim_nsec, + [ac_save_CPPFLAGS="$CPPFLAGS" + ac_cv_struct_st_mtim_nsec=no + # tv_nsec -- the usual case + # _tv_nsec -- Solaris 2.6, if + # (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1 + # && !defined __EXTENSIONS__) + # st__tim.tv_nsec -- UnixWare 2.1.2 + for ac_val in tv_nsec _tv_nsec st__tim.tv_nsec; do + CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val" + AC_TRY_COMPILE([#include +#include + ], [struct stat s; s.st_mtim.ST_MTIM_NSEC;], + [ac_cv_struct_st_mtim_nsec=$ac_val; break]) + done + CPPFLAGS="$ac_save_CPPFLAGS" + ]) + + if test $ac_cv_struct_st_mtim_nsec != no; then + AC_DEFINE_UNQUOTED([ST_MTIM_NSEC], [$ac_cv_struct_st_mtim_nsec], + [Define if struct stat contains a nanoseconds field]) + fi + ] +) diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..b3ea5ea --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1025 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, +[m4_warning([this file was generated for autoconf 2.65. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + + +# Copyright (C) 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +AC_DEFUN([AM_WITH_DMALLOC], +[AC_MSG_CHECKING([if malloc debugging is wanted]) +AC_ARG_WITH(dmalloc, +[ --with-dmalloc use dmalloc, as in + http://www.dmalloc.com/dmalloc.tar.gz], +[if test "$withval" = yes; then + AC_MSG_RESULT(yes) + AC_DEFINE(WITH_DMALLOC,1, + [Define if using the dmalloc debugging malloc package]) + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + AC_MSG_RESULT(no) +fi], [AC_MSG_RESULT(no)]) +]) + +AU_DEFUN([fp_WITH_DMALLOC], [AM_WITH_DMALLOC]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([config/dospaths.m4]) +m4_include([config/gettext.m4]) +m4_include([config/iconv.m4]) +m4_include([config/isc-posix.m4]) +m4_include([config/lib-ld.m4]) +m4_include([config/lib-link.m4]) +m4_include([config/lib-prefix.m4]) +m4_include([config/nls.m4]) +m4_include([config/po.m4]) +m4_include([config/progtest.m4]) +m4_include([acinclude.m4]) diff --git a/alloca.c b/alloca.c new file mode 100644 index 0000000..6e009b4 --- /dev/null +++ b/alloca.c @@ -0,0 +1,503 @@ +/* alloca.c -- allocate automatically reclaimed memory + (Mostly) portable public-domain implementation -- D A Gwyn + + This implementation of the PWB library alloca function, + which is used to allocate space off the run-time stack so + that it is automatically reclaimed upon procedure exit, + was inspired by discussions with J. Q. Johnson of Cornell. + J.Otto Tennant contributed the Cray support. + + There are some preprocessor constants that can + be defined when compiling for your specific system, for + improved efficiency; however, the defaults should be okay. + + The general concept of this implementation is to keep + track of all alloca-allocated blocks, and reclaim any + that are found to be deeper in the stack than the current + invocation. This heuristic does not reclaim storage as + soon as it becomes invalid, but it will do so eventually. + + As a special case, alloca(0) reclaims storage without + allocating any. It is a good idea to use alloca(0) in + your main control loop, etc. to force garbage collection. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#ifdef emacs +#include "blockinput.h" +#endif + +/* If compiling with GCC 2, this file's not needed. */ +#if !defined (__GNUC__) || __GNUC__ < 2 + +/* If someone has defined alloca as a macro, + there must be some other way alloca is supposed to work. */ +#ifndef alloca + +#ifdef emacs +#ifdef static +/* actually, only want this if static is defined as "" + -- this is for usg, in which emacs must undefine static + in order to make unexec workable + */ +#ifndef STACK_DIRECTION +you +lose +-- must know STACK_DIRECTION at compile-time +#endif /* STACK_DIRECTION undefined */ +#endif /* static */ +#endif /* emacs */ + +/* If your stack is a linked list of frames, you have to + provide an "address metric" ADDRESS_FUNCTION macro. */ + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) +long i00afunc (); +#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) +#else +#define ADDRESS_FUNCTION(arg) &(arg) +#endif + +#if __STDC__ +typedef void *pointer; +#else +typedef char *pointer; +#endif + +#ifndef NULL +#define NULL 0 +#endif + +/* Different portions of Emacs need to call different versions of + malloc. The Emacs executable needs alloca to call xmalloc, because + ordinary malloc isn't protected from input signals. On the other + hand, the utilities in lib-src need alloca to call malloc; some of + them are very simple, and don't have an xmalloc routine. + + Non-Emacs programs expect this to call use xmalloc. + + Callers below should use malloc. */ + +#ifndef emacs +#define malloc xmalloc +#endif +extern pointer malloc (); + +/* Define STACK_DIRECTION if you know the direction of stack + growth for your system; otherwise it will be automatically + deduced at run-time. + + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ + +#ifndef STACK_DIRECTION +#define STACK_DIRECTION 0 /* Direction unknown. */ +#endif + +#if STACK_DIRECTION != 0 + +#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ + +#else /* STACK_DIRECTION == 0; need run-time code. */ + +static int stack_dir; /* 1 or -1 once known. */ +#define STACK_DIR stack_dir + +static void +find_stack_direction (void) +{ + static char *addr = NULL; /* Address of first `dummy', once known. */ + auto char dummy; /* To get stack address. */ + + if (addr == NULL) + { /* Initial entry. */ + addr = ADDRESS_FUNCTION (dummy); + + find_stack_direction (); /* Recurse once. */ + } + else + { + /* Second entry. */ + if (ADDRESS_FUNCTION (dummy) > addr) + stack_dir = 1; /* Stack grew upward. */ + else + stack_dir = -1; /* Stack grew downward. */ + } +} + +#endif /* STACK_DIRECTION == 0 */ + +/* An "alloca header" is used to: + (a) chain together all alloca'ed blocks; + (b) keep track of stack depth. + + It is very important that sizeof(header) agree with malloc + alignment chunk size. The following default should work okay. */ + +#ifndef ALIGN_SIZE +#define ALIGN_SIZE sizeof(double) +#endif + +typedef union hdr +{ + char align[ALIGN_SIZE]; /* To force sizeof(header). */ + struct + { + union hdr *next; /* For chaining headers. */ + char *deep; /* For stack depth measure. */ + } h; +} header; + +static header *last_alloca_header = NULL; /* -> last alloca header. */ + +/* Return a pointer to at least SIZE bytes of storage, + which will be automatically reclaimed upon exit from + the procedure that called alloca. Originally, this space + was supposed to be taken from the current stack frame of the + caller, but that method cannot be made to work for some + implementations of C, for example under Gould's UTX/32. */ + +pointer +alloca (unsigned size) +{ + auto char probe; /* Probes stack depth: */ + register char *depth = ADDRESS_FUNCTION (probe); + +#if STACK_DIRECTION == 0 + if (STACK_DIR == 0) /* Unknown growth direction. */ + find_stack_direction (); +#endif + + /* Reclaim garbage, defined as all alloca'd storage that + was allocated from deeper in the stack than currently. */ + + { + register header *hp; /* Traverses linked list. */ + +#ifdef emacs + BLOCK_INPUT; +#endif + + for (hp = last_alloca_header; hp != NULL;) + if ((STACK_DIR > 0 && hp->h.deep > depth) + || (STACK_DIR < 0 && hp->h.deep < depth)) + { + register header *np = hp->h.next; + + free ((pointer) hp); /* Collect garbage. */ + + hp = np; /* -> next header. */ + } + else + break; /* Rest are not deeper. */ + + last_alloca_header = hp; /* -> last valid storage. */ + +#ifdef emacs + UNBLOCK_INPUT; +#endif + } + + if (size == 0) + return NULL; /* No allocation required. */ + + /* Allocate combined header + user data storage. */ + + { + register pointer new = malloc (sizeof (header) + size); + /* Address of header. */ + + if (new == 0) + abort(); + + ((header *) new)->h.next = last_alloca_header; + ((header *) new)->h.deep = depth; + + last_alloca_header = (header *) new; + + /* User storage begins just after header. */ + + return (pointer) ((char *) new + sizeof (header)); + } +} + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) + +#ifdef DEBUG_I00AFUNC +#include +#endif + +#ifndef CRAY_STACK +#define CRAY_STACK +#ifndef CRAY2 +/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ +struct stack_control_header + { + long shgrow:32; /* Number of times stack has grown. */ + long shaseg:32; /* Size of increments to stack. */ + long shhwm:32; /* High water mark of stack. */ + long shsize:32; /* Current size of stack (all segments). */ + }; + +/* The stack segment linkage control information occurs at + the high-address end of a stack segment. (The stack + grows from low addresses to high addresses.) The initial + part of the stack segment linkage control information is + 0200 (octal) words. This provides for register storage + for the routine which overflows the stack. */ + +struct stack_segment_linkage + { + long ss[0200]; /* 0200 overflow words. */ + long sssize:32; /* Number of words in this segment. */ + long ssbase:32; /* Offset to stack base. */ + long:32; + long sspseg:32; /* Offset to linkage control of previous + segment of stack. */ + long:32; + long sstcpt:32; /* Pointer to task common address block. */ + long sscsnm; /* Private control structure number for + microtasking. */ + long ssusr1; /* Reserved for user. */ + long ssusr2; /* Reserved for user. */ + long sstpid; /* Process ID for pid based multi-tasking. */ + long ssgvup; /* Pointer to multitasking thread giveup. */ + long sscray[7]; /* Reserved for Cray Research. */ + long ssa0; + long ssa1; + long ssa2; + long ssa3; + long ssa4; + long ssa5; + long ssa6; + long ssa7; + long sss0; + long sss1; + long sss2; + long sss3; + long sss4; + long sss5; + long sss6; + long sss7; + }; + +#else /* CRAY2 */ +/* The following structure defines the vector of words + returned by the STKSTAT library routine. */ +struct stk_stat + { + long now; /* Current total stack size. */ + long maxc; /* Amount of contiguous space which would + be required to satisfy the maximum + stack demand to date. */ + long high_water; /* Stack high-water mark. */ + long overflows; /* Number of stack overflow ($STKOFEN) calls. */ + long hits; /* Number of internal buffer hits. */ + long extends; /* Number of block extensions. */ + long stko_mallocs; /* Block allocations by $STKOFEN. */ + long underflows; /* Number of stack underflow calls ($STKRETN). */ + long stko_free; /* Number of deallocations by $STKRETN. */ + long stkm_free; /* Number of deallocations by $STKMRET. */ + long segments; /* Current number of stack segments. */ + long maxs; /* Maximum number of stack segments so far. */ + long pad_size; /* Stack pad size. */ + long current_address; /* Current stack segment address. */ + long current_size; /* Current stack segment size. This + number is actually corrupted by STKSTAT to + include the fifteen word trailer area. */ + long initial_address; /* Address of initial segment. */ + long initial_size; /* Size of initial segment. */ + }; + +/* The following structure describes the data structure which trails + any stack segment. I think that the description in 'asdef' is + out of date. I only describe the parts that I am sure about. */ + +struct stk_trailer + { + long this_address; /* Address of this block. */ + long this_size; /* Size of this block (does not include + this trailer). */ + long unknown2; + long unknown3; + long link; /* Address of trailer block of previous + segment. */ + long unknown5; + long unknown6; + long unknown7; + long unknown8; + long unknown9; + long unknown10; + long unknown11; + long unknown12; + long unknown13; + long unknown14; + }; + +#endif /* CRAY2 */ +#endif /* not CRAY_STACK */ + +#ifdef CRAY2 +/* Determine a "stack measure" for an arbitrary ADDRESS. + I doubt that "lint" will like this much. */ + +static long +i00afunc (long *address) +{ + struct stk_stat status; + struct stk_trailer *trailer; + long *block, size; + long result = 0; + + /* We want to iterate through all of the segments. The first + step is to get the stack status structure. We could do this + more quickly and more directly, perhaps, by referencing the + $LM00 common block, but I know that this works. */ + + STKSTAT (&status); + + /* Set up the iteration. */ + + trailer = (struct stk_trailer *) (status.current_address + + status.current_size + - 15); + + /* There must be at least one stack segment. Therefore it is + a fatal error if "trailer" is null. */ + + if (trailer == 0) + abort (); + + /* Discard segments that do not contain our argument address. */ + + while (trailer != 0) + { + block = (long *) trailer->this_address; + size = trailer->this_size; + if (block == 0 || size == 0) + abort (); + trailer = (struct stk_trailer *) trailer->link; + if ((block <= address) && (address < (block + size))) + break; + } + + /* Set the result to the offset in this segment and add the sizes + of all predecessor segments. */ + + result = address - block; + + if (trailer == 0) + { + return result; + } + + do + { + if (trailer->this_size <= 0) + abort (); + result += trailer->this_size; + trailer = (struct stk_trailer *) trailer->link; + } + while (trailer != 0); + + /* We are done. Note that if you present a bogus address (one + not in any segment), you will get a different number back, formed + from subtracting the address of the first block. This is probably + not what you want. */ + + return (result); +} + +#else /* not CRAY2 */ +/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. + Determine the number of the cell within the stack, + given the address of the cell. The purpose of this + routine is to linearize, in some sense, stack addresses + for alloca. */ + +static long +i00afunc (long address) +{ + long stkl = 0; + + long size, pseg, this_segment, stack; + long result = 0; + + struct stack_segment_linkage *ssptr; + + /* Register B67 contains the address of the end of the + current stack segment. If you (as a subprogram) store + your registers on the stack and find that you are past + the contents of B67, you have overflowed the segment. + + B67 also points to the stack segment linkage control + area, which is what we are really interested in. */ + + stkl = CRAY_STACKSEG_END (); + ssptr = (struct stack_segment_linkage *) stkl; + + /* If one subtracts 'size' from the end of the segment, + one has the address of the first word of the segment. + + If this is not the first segment, 'pseg' will be + nonzero. */ + + pseg = ssptr->sspseg; + size = ssptr->sssize; + + this_segment = stkl - size; + + /* It is possible that calling this routine itself caused + a stack overflow. Discard stack segments which do not + contain the target address. */ + + while (!(this_segment <= address && address <= stkl)) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); +#endif + if (pseg == 0) + break; + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + this_segment = stkl - size; + } + + result = address - this_segment; + + /* If you subtract pseg from the current end of the stack, + you get the address of the previous stack segment's end. + This seems a little convoluted to me, but I'll bet you save + a cycle somewhere. */ + + while (pseg != 0) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o\n", pseg, size); +#endif + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + result += size; + } + return (result); +} + +#endif /* not CRAY2 */ +#endif /* CRAY */ + +#endif /* no alloca */ +#endif /* not GCC version 2 */ diff --git a/amiga.c b/amiga.c new file mode 100644 index 0000000..6e70f65 --- /dev/null +++ b/amiga.c @@ -0,0 +1,118 @@ +/* Running commands on Amiga +Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "variable.h" +#include "amiga.h" +#include +#include +#include +#include +#include + +static const char Amiga_version[] = "$VER: Make 3.74.3 (12.05.96) \n" + "Amiga Port by A. Digulla (digulla@home.lake.de)"; + +int +MyExecute (char **argv) +{ + char * buffer, * ptr; + char ** aptr; + int len = 0; + int status; + + for (aptr=argv; *aptr; aptr++) + { + len += strlen (*aptr) + 4; + } + + buffer = AllocMem (len, MEMF_ANY); + + if (!buffer) + fatal (NILF, "MyExecute: Cannot allocate space for calling a command"); + + ptr = buffer; + + for (aptr=argv; *aptr; aptr++) + { + if (((*aptr)[0] == ';' && !(*aptr)[1])) + { + *ptr ++ = '"'; + strcpy (ptr, *aptr); + ptr += strlen (ptr); + *ptr ++ = '"'; + } + else if ((*aptr)[0] == '@' && (*aptr)[1] == '@' && !(*aptr)[2]) + { + *ptr ++ = '\n'; + continue; + } + else + { + strcpy (ptr, *aptr); + ptr += strlen (ptr); + } + *ptr ++ = ' '; + *ptr = 0; + } + + ptr[-1] = '\n'; + + status = SystemTags (buffer, + SYS_UserShell, TRUE, + TAG_END); + + FreeMem (buffer, len); + + if (SetSignal(0L,0L) & SIGBREAKF_CTRL_C) + status = 20; + + /* Warnings don't count */ + if (status == 5) + status = 0; + + return status; +} + +char * +wildcard_expansion (char *wc, char *o) +{ +# define PATH_SIZE 1024 + struct AnchorPath * apath; + + if ( (apath = AllocMem (sizeof (struct AnchorPath) + PATH_SIZE, + MEMF_CLEAR)) + ) + { + apath->ap_Strlen = PATH_SIZE; + + if (MatchFirst (wc, apath) == 0) + { + do + { + o = variable_buffer_output (o, apath->ap_Buf, + strlen (apath->ap_Buf)); + o = variable_buffer_output (o, " ",1); + } while (MatchNext (apath) == 0); + } + + MatchEnd (apath); + FreeMem (apath, sizeof (struct AnchorPath) + PATH_SIZE); + } + + return o; +} diff --git a/amiga.h b/amiga.h new file mode 100644 index 0000000..ee2aa32 --- /dev/null +++ b/amiga.h @@ -0,0 +1,19 @@ +/* Definitions for amiga specific things +Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +int MyExecute (char ** argv); +char * wildcard_expansion (char * wc, char * o); diff --git a/ar.c b/ar.c new file mode 100644 index 0000000..95dcbbb --- /dev/null +++ b/ar.c @@ -0,0 +1,287 @@ +/* Interface to `ar' archives for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. + +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +#ifndef NO_ARCHIVES + +#include "filedef.h" +#include "dep.h" +#include + +/* Return nonzero if NAME is an archive-member reference, zero if not. An + archive-member reference is a name like `lib(member)' where member is a + non-empty string. + If a name like `lib((entry))' is used, a fatal error is signaled at + the attempt to use this unsupported feature. */ + +int +ar_name (const char *name) +{ + const char *p = strchr (name, '('); + const char *end; + + if (p == 0 || p == name) + return 0; + + end = p + strlen (p) - 1; + if (*end != ')' || end == p + 1) + return 0; + + if (p[1] == '(' && end[-1] == ')') + fatal (NILF, _("attempt to use unsupported feature: `%s'"), name); + + return 1; +} + + +/* Parse the archive-member reference NAME into the archive and member names. + Creates one allocated string containing both names, pointed to by ARNAME_P. + MEMNAME_P points to the member. */ + +void +ar_parse_name (const char *name, char **arname_p, char **memname_p) +{ + char *p; + + *arname_p = xstrdup (name); + p = strchr (*arname_p, '('); + *(p++) = '\0'; + p[strlen(p) - 1] = '\0'; + *memname_p = p; +} + + +/* This function is called by `ar_scan' to find which member to look at. */ + +/* ARGSUSED */ +static long int +ar_member_date_1 (int desc UNUSED, const char *mem, int truncated, + long int hdrpos UNUSED, long int datapos UNUSED, + long int size UNUSED, long int date, + int uid UNUSED, int gid UNUSED, int mode UNUSED, + const void *name) +{ + return ar_name_equal (name, mem, truncated) ? date : 0; +} + +/* Return the modtime of NAME. */ + +time_t +ar_member_date (const char *name) +{ + char *arname; + char *memname; + long int val; + + ar_parse_name (name, &arname, &memname); + + /* Make sure we know the modtime of the archive itself because we are + likely to be called just before commands to remake a member are run, + and they will change the archive itself. + + But we must be careful not to enter_file the archive itself if it does + not exist, because pattern_search assumes that files found in the data + base exist or can be made. */ + { + struct file *arfile; + arfile = lookup_file (arname); + if (arfile == 0 && file_exists_p (arname)) + arfile = enter_file (strcache_add (arname)); + + if (arfile != 0) + (void) f_mtime (arfile, 0); + } + + val = ar_scan (arname, ar_member_date_1, memname); + + free (arname); + + return (val <= 0 ? (time_t) -1 : (time_t) val); +} + +/* Set the archive-member NAME's modtime to now. */ + +#ifdef VMS +int +ar_touch (const char *name) +{ + error (NILF, _("touch archive member is not available on VMS")); + return -1; +} +#else +int +ar_touch (const char *name) +{ + char *arname, *memname; + int val; + + ar_parse_name (name, &arname, &memname); + + /* Make sure we know the modtime of the archive itself before we + touch the member, since this will change the archive modtime. */ + { + struct file *arfile; + arfile = enter_file (strcache_add (arname)); + f_mtime (arfile, 0); + } + + val = 1; + switch (ar_member_touch (arname, memname)) + { + case -1: + error (NILF, _("touch: Archive `%s' does not exist"), arname); + break; + case -2: + error (NILF, _("touch: `%s' is not a valid archive"), arname); + break; + case -3: + perror_with_name ("touch: ", arname); + break; + case 1: + error (NILF, + _("touch: Member `%s' does not exist in `%s'"), memname, arname); + break; + case 0: + val = 0; + break; + default: + error (NILF, + _("touch: Bad return code from ar_member_touch on `%s'"), name); + } + + free (arname); + + return val; +} +#endif /* !VMS */ + +/* State of an `ar_glob' run, passed to `ar_glob_match'. */ + +struct ar_glob_state + { + const char *arname; + const char *pattern; + unsigned int size; + struct nameseq *chain; + unsigned int n; + }; + +/* This function is called by `ar_scan' to match one archive + element against the pattern in STATE. */ + +static long int +ar_glob_match (int desc UNUSED, const char *mem, int truncated UNUSED, + long int hdrpos UNUSED, long int datapos UNUSED, + long int size UNUSED, long int date UNUSED, int uid UNUSED, + int gid UNUSED, int mode UNUSED, const void *arg) +{ + struct ar_glob_state *state = (struct ar_glob_state *)arg; + + if (fnmatch (state->pattern, mem, FNM_PATHNAME|FNM_PERIOD) == 0) + { + /* We have a match. Add it to the chain. */ + struct nameseq *new = xcalloc (state->size); + new->name = strcache_add (concat (4, state->arname, "(", mem, ")")); + new->next = state->chain; + state->chain = new; + ++state->n; + } + + return 0L; +} + +/* Return nonzero if PATTERN contains any metacharacters. + Metacharacters can be quoted with backslashes if QUOTE is nonzero. */ +static int +glob_pattern_p (const char *pattern, int quote) +{ + const char *p; + int opened = 0; + + for (p = pattern; *p != '\0'; ++p) + switch (*p) + { + case '?': + case '*': + return 1; + + case '\\': + if (quote) + ++p; + break; + + case '[': + opened = 1; + break; + + case ']': + if (opened) + return 1; + break; + } + + return 0; +} + +/* Glob for MEMBER_PATTERN in archive ARNAME. + Return a malloc'd chain of matching elements (or nil if none). */ + +struct nameseq * +ar_glob (const char *arname, const char *member_pattern, unsigned int size) +{ + struct ar_glob_state state; + struct nameseq *n; + const char **names; + unsigned int i; + + if (! glob_pattern_p (member_pattern, 1)) + return 0; + + /* Scan the archive for matches. + ar_glob_match will accumulate them in STATE.chain. */ + state.arname = arname; + state.pattern = member_pattern; + state.size = size; + state.chain = 0; + state.n = 0; + ar_scan (arname, ar_glob_match, &state); + + if (state.chain == 0) + return 0; + + /* Now put the names into a vector for sorting. */ + names = alloca (state.n * sizeof (const char *)); + i = 0; + for (n = state.chain; n != 0; n = n->next) + names[i++] = n->name; + + /* Sort them alphabetically. */ + /* MSVC erroneously warns without a cast here. */ + qsort ((void *)names, i, sizeof (*names), alpha_compare); + + /* Put them back into the chain in the sorted order. */ + i = 0; + for (n = state.chain; n != 0; n = n->next) + n->name = names[i++]; + + return state.chain; +} + +#endif /* Not NO_ARCHIVES. */ diff --git a/arscan.c b/arscan.c new file mode 100644 index 0000000..4ef8375 --- /dev/null +++ b/arscan.c @@ -0,0 +1,867 @@ +/* Library function for scanning an archive file. +Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +#ifdef HAVE_FCNTL_H +#include +#else +#include +#endif + +#ifndef NO_ARCHIVES + +#ifdef VMS +#include +#include +#include +#include +#include +#if __DECC +#include +#include +#endif + +static void *VMS_lib_idx; + +static char *VMS_saved_memname; + +static time_t VMS_member_date; + +static long int (*VMS_function) (); + +static int +VMS_get_member_info (struct dsc$descriptor_s *module, unsigned long *rfa) +{ + int status, i; + long int fnval; + + time_t val; + + static struct dsc$descriptor_s bufdesc = + { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }; + + struct mhddef *mhd; + char filename[128]; + + bufdesc.dsc$a_pointer = filename; + bufdesc.dsc$w_length = sizeof (filename); + + status = lbr$set_module (&VMS_lib_idx, rfa, &bufdesc, + &bufdesc.dsc$w_length, 0); + if (! (status & 1)) + { + error (NILF, _("lbr$set_module() failed to extract module info, status = %d"), + status); + + lbr$close (&VMS_lib_idx); + + return 0; + } + + mhd = (struct mhddef *) filename; + +#ifdef __DECC + /* John Fowler writes this is needed in his environment, + * but that decc$fix_time() isn't documented to work this way. Let me + * know if this causes problems in other VMS environments. + */ + { + /* Modified by M. Gehre at 11-JAN-2008 because old formula is wrong: + * val = decc$fix_time (&mhd->mhd$l_datim) + timezone - daylight*3600; + * a) daylight specifies, if the timezone has daylight saving enabled, not + * if it is active + * b) what we need is the information, if daylight saving was active, if + * the library module was replaced. This information we get using the + * localtime function + */ + + struct tm *tmp; + + /* Conversion from VMS time to C time */ + val = decc$fix_time (&mhd->mhd$l_datim); + + /* + * Conversion from local time (stored in library) to GMT (needed for gmake) + * Note: The tm_gmtoff element is a VMS extension to the ANSI standard. + */ + tmp = localtime (&val); + val -= tmp->tm_gmtoff; + } +#endif + + for (i = 0; i < module->dsc$w_length; i++) + filename[i] = _tolower ((unsigned char)module->dsc$a_pointer[i]); + + filename[i] = '\0'; + + VMS_member_date = (time_t) -1; + + fnval = + (*VMS_function) (-1, filename, 0, 0, 0, 0, val, 0, 0, 0, + VMS_saved_memname); + + if (fnval) + { + VMS_member_date = fnval; + return 0; + } + else + return 1; +} + +/* Takes three arguments ARCHIVE, FUNCTION and ARG. + + Open the archive named ARCHIVE, find its members one by one, + and for each one call FUNCTION with the following arguments: + archive file descriptor for reading the data, + member name, + member name might be truncated flag, + member header position in file, + member data position in file, + member data size, + member date, + member uid, + member gid, + member protection mode, + ARG. + + NOTE: on VMS systems, only name, date, and arg are meaningful! + + The descriptor is poised to read the data of the member + when FUNCTION is called. It does not matter how much + data FUNCTION reads. + + If FUNCTION returns nonzero, we immediately return + what FUNCTION returned. + + Returns -1 if archive does not exist, + Returns -2 if archive has invalid format. + Returns 0 if have scanned successfully. */ + +long int +ar_scan (const char *archive, ar_member_func_t function, const void *arg) +{ + char *p; + + static struct dsc$descriptor_s libdesc = + { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }; + + unsigned long func = LBR$C_READ; + unsigned long type = LBR$C_TYP_UNK; + unsigned long index = 1; + + int status; + + status = lbr$ini_control (&VMS_lib_idx, &func, &type, 0); + + if (! (status & 1)) + { + error (NILF, _("lbr$ini_control() failed with status = %d"), status); + return -2; + } + + /* there is no such descriptor with "const char *dsc$a_pointer" */ + libdesc.dsc$a_pointer = (char *)archive; + libdesc.dsc$w_length = strlen (archive); + + status = lbr$open (&VMS_lib_idx, &libdesc, 0, 0, 0, 0, 0); + + if (! (status & 1)) + { + error (NILF, _("unable to open library `%s' to lookup member `%s'"), + archive, (char *)arg); + return -1; + } + + VMS_saved_memname = (char *)arg; + + /* For comparison, delete .obj from arg name. */ + + p = strrchr (VMS_saved_memname, '.'); + if (p) + *p = '\0'; + + VMS_function = function; + + VMS_member_date = (time_t) -1; + lbr$get_index (&VMS_lib_idx, &index, VMS_get_member_info, 0); + + /* Undo the damage. */ + if (p) + *p = '.'; + + lbr$close (&VMS_lib_idx); + + return VMS_member_date > 0 ? VMS_member_date : 0; +} + +#else /* !VMS */ + +/* SCO Unix's compiler defines both of these. */ +#ifdef M_UNIX +#undef M_XENIX +#endif + +/* On the sun386i and in System V rel 3, ar.h defines two different archive + formats depending upon whether you have defined PORTAR (normal) or PORT5AR + (System V Release 1). There is no default, one or the other must be defined + to have a nonzero value. */ + +#if (!defined (PORTAR) || PORTAR == 0) && (!defined (PORT5AR) || PORT5AR == 0) +#undef PORTAR +#ifdef M_XENIX +/* According to Jim Sievert , for SCO XENIX defining + PORTAR to 1 gets the wrong archive format, and defining it to 0 gets the + right one. */ +#define PORTAR 0 +#else +#define PORTAR 1 +#endif +#endif + +/* On AIX, define these symbols to be sure to get both archive formats. + AIX 4.3 introduced the "big" archive format to support 64-bit object + files, so on AIX 4.3 systems we need to support both the "normal" and + "big" archive formats. An archive's format is indicated in the + "fl_magic" field of the "FL_HDR" structure. For a normal archive, + this field will be the string defined by the AIAMAG symbol. For a + "big" archive, it will be the string defined by the AIAMAGBIG symbol + (at least on AIX it works this way). + + Note: we'll define these symbols regardless of which AIX version + we're compiling on, but this is okay since we'll use the new symbols + only if they're present. */ +#ifdef _AIX +# define __AR_SMALL__ +# define __AR_BIG__ +#endif + +#ifndef WINDOWS32 +# ifndef __BEOS__ +# include +# else + /* BeOS 5 doesn't have but has archives in the same format + * as many other Unices. This was taken from GNU binutils for BeOS. + */ +# define ARMAG "!\n" /* String that begins an archive file. */ +# define SARMAG 8 /* Size of that string. */ +# define ARFMAG "`\n" /* String in ar_fmag at end of each header. */ +struct ar_hdr + { + char ar_name[16]; /* Member file name, sometimes / terminated. */ + char ar_date[12]; /* File date, decimal seconds since Epoch. */ + char ar_uid[6], ar_gid[6]; /* User and group IDs, in ASCII decimal. */ + char ar_mode[8]; /* File mode, in ASCII octal. */ + char ar_size[10]; /* File size, in ASCII decimal. */ + char ar_fmag[2]; /* Always contains ARFMAG. */ + }; +# endif +# define TOCHAR(_m) (_m) +#else +/* These should allow us to read Windows (VC++) libraries (according to Frank + * Libbrecht ) + */ +# include +# include +# include +# define ARMAG IMAGE_ARCHIVE_START +# define SARMAG IMAGE_ARCHIVE_START_SIZE +# define ar_hdr _IMAGE_ARCHIVE_MEMBER_HEADER +# define ar_name Name +# define ar_mode Mode +# define ar_size Size +# define ar_date Date +# define ar_uid UserID +# define ar_gid GroupID +/* In Windows the member names have type BYTE so we must cast them. */ +# define TOCHAR(_m) ((char *)(_m)) +#endif + +/* Cray's apparently defines this. */ +#ifndef AR_HDR_SIZE +# define AR_HDR_SIZE (sizeof (struct ar_hdr)) +#endif + +/* Takes three arguments ARCHIVE, FUNCTION and ARG. + + Open the archive named ARCHIVE, find its members one by one, + and for each one call FUNCTION with the following arguments: + archive file descriptor for reading the data, + member name, + member name might be truncated flag, + member header position in file, + member data position in file, + member data size, + member date, + member uid, + member gid, + member protection mode, + ARG. + + The descriptor is poised to read the data of the member + when FUNCTION is called. It does not matter how much + data FUNCTION reads. + + If FUNCTION returns nonzero, we immediately return + what FUNCTION returned. + + Returns -1 if archive does not exist, + Returns -2 if archive has invalid format. + Returns 0 if have scanned successfully. */ + +long int +ar_scan (const char *archive, ar_member_func_t function, const void *arg) +{ +#ifdef AIAMAG + FL_HDR fl_header; +#ifdef AIAMAGBIG + int big_archive = 0; + FL_HDR_BIG fl_header_big; +#endif +#else + int long_name = 0; +#endif + char *namemap = 0; + int desc = open (archive, O_RDONLY, 0); + if (desc < 0) + return -1; +#ifdef SARMAG + { + char buf[SARMAG]; + register int nread = read (desc, buf, SARMAG); + if (nread != SARMAG || memcmp (buf, ARMAG, SARMAG)) + { + (void) close (desc); + return -2; + } + } +#else +#ifdef AIAMAG + { + register int nread = read (desc, &fl_header, FL_HSZ); + + if (nread != FL_HSZ) + { + (void) close (desc); + return -2; + } +#ifdef AIAMAGBIG + /* If this is a "big" archive, then set the flag and + re-read the header into the "big" structure. */ + if (!memcmp (fl_header.fl_magic, AIAMAGBIG, SAIAMAG)) + { + big_archive = 1; + + /* seek back to beginning of archive */ + if (lseek (desc, 0, 0) < 0) + { + (void) close (desc); + return -2; + } + + /* re-read the header into the "big" structure */ + nread = read (desc, &fl_header_big, FL_HSZ_BIG); + if (nread != FL_HSZ_BIG) + { + (void) close (desc); + return -2; + } + } + else +#endif + /* Check to make sure this is a "normal" archive. */ + if (memcmp (fl_header.fl_magic, AIAMAG, SAIAMAG)) + { + (void) close (desc); + return -2; + } + } +#else + { +#ifndef M_XENIX + int buf; +#else + unsigned short int buf; +#endif + register int nread = read(desc, &buf, sizeof (buf)); + if (nread != sizeof (buf) || buf != ARMAG) + { + (void) close (desc); + return -2; + } + } +#endif +#endif + + /* Now find the members one by one. */ + { +#ifdef SARMAG + register long int member_offset = SARMAG; +#else +#ifdef AIAMAG + long int member_offset; + long int last_member_offset; + +#ifdef AIAMAGBIG + if ( big_archive ) + { + sscanf (fl_header_big.fl_fstmoff, "%20ld", &member_offset); + sscanf (fl_header_big.fl_lstmoff, "%20ld", &last_member_offset); + } + else +#endif + { + sscanf (fl_header.fl_fstmoff, "%12ld", &member_offset); + sscanf (fl_header.fl_lstmoff, "%12ld", &last_member_offset); + } + + if (member_offset == 0) + { + /* Empty archive. */ + close (desc); + return 0; + } +#else +#ifndef M_XENIX + register long int member_offset = sizeof (int); +#else /* Xenix. */ + register long int member_offset = sizeof (unsigned short int); +#endif /* Not Xenix. */ +#endif +#endif + + while (1) + { + register int nread; + struct ar_hdr member_header; +#ifdef AIAMAGBIG + struct ar_hdr_big member_header_big; +#endif +#ifdef AIAMAG + char name[256]; + int name_len; + long int dateval; + int uidval, gidval; + long int data_offset; +#else + char namebuf[sizeof member_header.ar_name + 1]; + char *name; + int is_namemap; /* Nonzero if this entry maps long names. */ +#endif + long int eltsize; + int eltmode; + long int fnval; + + if (lseek (desc, member_offset, 0) < 0) + { + (void) close (desc); + return -2; + } + +#ifdef AIAMAG +#define AR_MEMHDR_SZ(x) (sizeof(x) - sizeof (x._ar_name)) + +#ifdef AIAMAGBIG + if (big_archive) + { + nread = read (desc, &member_header_big, + AR_MEMHDR_SZ(member_header_big) ); + + if (nread != AR_MEMHDR_SZ(member_header_big)) + { + (void) close (desc); + return -2; + } + + sscanf (member_header_big.ar_namlen, "%4d", &name_len); + nread = read (desc, name, name_len); + + if (nread != name_len) + { + (void) close (desc); + return -2; + } + + name[name_len] = 0; + + sscanf (member_header_big.ar_date, "%12ld", &dateval); + sscanf (member_header_big.ar_uid, "%12d", &uidval); + sscanf (member_header_big.ar_gid, "%12d", &gidval); + sscanf (member_header_big.ar_mode, "%12o", &eltmode); + sscanf (member_header_big.ar_size, "%20ld", &eltsize); + + data_offset = (member_offset + AR_MEMHDR_SZ(member_header_big) + + name_len + 2); + } + else +#endif + { + nread = read (desc, &member_header, + AR_MEMHDR_SZ(member_header) ); + + if (nread != AR_MEMHDR_SZ(member_header)) + { + (void) close (desc); + return -2; + } + + sscanf (member_header.ar_namlen, "%4d", &name_len); + nread = read (desc, name, name_len); + + if (nread != name_len) + { + (void) close (desc); + return -2; + } + + name[name_len] = 0; + + sscanf (member_header.ar_date, "%12ld", &dateval); + sscanf (member_header.ar_uid, "%12d", &uidval); + sscanf (member_header.ar_gid, "%12d", &gidval); + sscanf (member_header.ar_mode, "%12o", &eltmode); + sscanf (member_header.ar_size, "%12ld", &eltsize); + + data_offset = (member_offset + AR_MEMHDR_SZ(member_header) + + name_len + 2); + } + data_offset += data_offset % 2; + + fnval = + (*function) (desc, name, 0, + member_offset, data_offset, eltsize, + dateval, uidval, gidval, + eltmode, arg); + +#else /* Not AIAMAG. */ + nread = read (desc, &member_header, AR_HDR_SIZE); + if (nread == 0) + /* No data left means end of file; that is OK. */ + break; + + if (nread != AR_HDR_SIZE +#if defined(ARFMAG) || defined(ARFZMAG) + || ( +# ifdef ARFMAG + memcmp (member_header.ar_fmag, ARFMAG, 2) +# else + 1 +# endif + && +# ifdef ARFZMAG + memcmp (member_header.ar_fmag, ARFZMAG, 2) +# else + 1 +# endif + ) +#endif + ) + { + (void) close (desc); + return -2; + } + + name = namebuf; + memcpy (name, member_header.ar_name, sizeof member_header.ar_name); + { + register char *p = name + sizeof member_header.ar_name; + do + *p = '\0'; + while (p > name && *--p == ' '); + +#ifndef AIAMAG + /* If the member name is "//" or "ARFILENAMES/" this may be + a list of file name mappings. The maximum file name + length supported by the standard archive format is 14 + characters. This member will actually always be the + first or second entry in the archive, but we don't check + that. */ + is_namemap = (!strcmp (name, "//") + || !strcmp (name, "ARFILENAMES/")); +#endif /* Not AIAMAG. */ + /* On some systems, there is a slash after each member name. */ + if (*p == '/') + *p = '\0'; + +#ifndef AIAMAG + /* If the member name starts with a space or a slash, this + is an index into the file name mappings (used by GNU ar). + Otherwise if the member name looks like #1/NUMBER the + real member name appears in the element data (used by + 4.4BSD). */ + if (! is_namemap + && (name[0] == ' ' || name[0] == '/') + && namemap != 0) + { + name = namemap + atoi (name + 1); + long_name = 1; + } + else if (name[0] == '#' + && name[1] == '1' + && name[2] == '/') + { + int namesize = atoi (name + 3); + + name = alloca (namesize + 1); + nread = read (desc, name, namesize); + if (nread != namesize) + { + close (desc); + return -2; + } + name[namesize] = '\0'; + + long_name = 1; + } +#endif /* Not AIAMAG. */ + } + +#ifndef M_XENIX + sscanf (TOCHAR (member_header.ar_mode), "%o", &eltmode); + eltsize = atol (TOCHAR (member_header.ar_size)); +#else /* Xenix. */ + eltmode = (unsigned short int) member_header.ar_mode; + eltsize = member_header.ar_size; +#endif /* Not Xenix. */ + + fnval = + (*function) (desc, name, ! long_name, member_offset, + member_offset + AR_HDR_SIZE, eltsize, +#ifndef M_XENIX + atol (TOCHAR (member_header.ar_date)), + atoi (TOCHAR (member_header.ar_uid)), + atoi (TOCHAR (member_header.ar_gid)), +#else /* Xenix. */ + member_header.ar_date, + member_header.ar_uid, + member_header.ar_gid, +#endif /* Not Xenix. */ + eltmode, arg); + +#endif /* AIAMAG. */ + + if (fnval) + { + (void) close (desc); + return fnval; + } + +#ifdef AIAMAG + if (member_offset == last_member_offset) + /* End of the chain. */ + break; + +#ifdef AIAMAGBIG + if (big_archive) + sscanf (member_header_big.ar_nxtmem, "%20ld", &member_offset); + else +#endif + sscanf (member_header.ar_nxtmem, "%12ld", &member_offset); + + if (lseek (desc, member_offset, 0) != member_offset) + { + (void) close (desc); + return -2; + } +#else + + /* If this member maps archive names, we must read it in. The + name map will always precede any members whose names must + be mapped. */ + if (is_namemap) + { + char *clear; + char *limit; + + namemap = alloca (eltsize); + nread = read (desc, namemap, eltsize); + if (nread != eltsize) + { + (void) close (desc); + return -2; + } + + /* The names are separated by newlines. Some formats have + a trailing slash. Null terminate the strings for + convenience. */ + limit = namemap + eltsize; + for (clear = namemap; clear < limit; clear++) + { + if (*clear == '\n') + { + *clear = '\0'; + if (clear[-1] == '/') + clear[-1] = '\0'; + } + } + + is_namemap = 0; + } + + member_offset += AR_HDR_SIZE + eltsize; + if (member_offset % 2 != 0) + member_offset++; +#endif + } + } + + close (desc); + return 0; +} +#endif /* !VMS */ + +/* Return nonzero iff NAME matches MEM. + If TRUNCATED is nonzero, MEM may be truncated to + sizeof (struct ar_hdr.ar_name) - 1. */ + +int +ar_name_equal (const char *name, const char *mem, int truncated) +{ + const char *p; + + p = strrchr (name, '/'); + if (p != 0) + name = p + 1; + +#ifndef VMS + if (truncated) + { +#ifdef AIAMAG + /* TRUNCATED should never be set on this system. */ + abort (); +#else + struct ar_hdr hdr; +#if !defined (__hpux) && !defined (cray) + return strneq (name, mem, sizeof(hdr.ar_name) - 1); +#else + return strneq (name, mem, sizeof(hdr.ar_name) - 2); +#endif /* !__hpux && !cray */ +#endif /* !AIAMAG */ + } +#endif /* !VMS */ + + return !strcmp (name, mem); +} + +#ifndef VMS +/* ARGSUSED */ +static long int +ar_member_pos (int desc UNUSED, const char *mem, int truncated, + long int hdrpos, long int datapos UNUSED, long int size UNUSED, + long int date UNUSED, int uid UNUSED, int gid UNUSED, + int mode UNUSED, const void *name) +{ + if (!ar_name_equal (name, mem, truncated)) + return 0; + return hdrpos; +} + +/* Set date of member MEMNAME in archive ARNAME to current time. + Returns 0 if successful, + -1 if file ARNAME does not exist, + -2 if not a valid archive, + -3 if other random system call error (including file read-only), + 1 if valid but member MEMNAME does not exist. */ + +int +ar_member_touch (const char *arname, const char *memname) +{ + long int pos = ar_scan (arname, ar_member_pos, memname); + int fd; + struct ar_hdr ar_hdr; + int i; + unsigned int ui; + struct stat statbuf; + + if (pos < 0) + return (int) pos; + if (!pos) + return 1; + + fd = open (arname, O_RDWR, 0666); + if (fd < 0) + return -3; + /* Read in this member's header */ + if (lseek (fd, pos, 0) < 0) + goto lose; + if (AR_HDR_SIZE != read (fd, &ar_hdr, AR_HDR_SIZE)) + goto lose; + /* Write back the header, thus touching the archive file. */ + if (lseek (fd, pos, 0) < 0) + goto lose; + if (AR_HDR_SIZE != write (fd, &ar_hdr, AR_HDR_SIZE)) + goto lose; + /* The file's mtime is the time we we want. */ + EINTRLOOP (i, fstat (fd, &statbuf)); + if (i < 0) + goto lose; +#if defined(ARFMAG) || defined(ARFZMAG) || defined(AIAMAG) || defined(WINDOWS32) + /* Advance member's time to that time */ + for (ui = 0; ui < sizeof ar_hdr.ar_date; ui++) + ar_hdr.ar_date[ui] = ' '; + sprintf (TOCHAR (ar_hdr.ar_date), "%ld", (long int) statbuf.st_mtime); +#ifdef AIAMAG + ar_hdr.ar_date[strlen(ar_hdr.ar_date)] = ' '; +#endif +#else + ar_hdr.ar_date = statbuf.st_mtime; +#endif + /* Write back this member's header */ + if (lseek (fd, pos, 0) < 0) + goto lose; + if (AR_HDR_SIZE != write (fd, &ar_hdr, AR_HDR_SIZE)) + goto lose; + close (fd); + return 0; + + lose: + i = errno; + close (fd); + errno = i; + return -3; +} +#endif + +#ifdef TEST + +long int +describe_member (int desc, const char *name, int truncated, + long int hdrpos, long int datapos, long int size, + long int date, int uid, int gid, int mode, const void *arg) +{ + extern char *ctime (); + + printf (_("Member `%s'%s: %ld bytes at %ld (%ld).\n"), + name, truncated ? _(" (name might be truncated)") : "", + size, hdrpos, datapos); + printf (_(" Date %s"), ctime (&date)); + printf (_(" uid = %d, gid = %d, mode = 0%o.\n"), uid, gid, mode); + + return 0; +} + +int +main (int argc, char **argv) +{ + ar_scan (argv[1], describe_member, NULL); + return 0; +} + +#endif /* TEST. */ +#endif /* NO_ARCHIVES. */ diff --git a/build.sh.in b/build.sh.in new file mode 100755 index 0000000..213df8d --- /dev/null +++ b/build.sh.in @@ -0,0 +1,82 @@ +#!/bin/sh +# Shell script to build GNU Make in the absence of any `make' program. +# @configure_input@ + +# Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +# See Makefile.in for comments describing these variables. + +srcdir='@srcdir@' +CC='@CC@' +CFLAGS='@CFLAGS@' +CPPFLAGS='@CPPFLAGS@' +LDFLAGS='@LDFLAGS@' +ALLOCA='@ALLOCA@' +LOADLIBES='@LIBS@ @LIBINTL@' +eval extras=\'@LIBOBJS@\' +REMOTE='@REMOTE@' +GLOBLIB='@GLOBLIB@' +PATH_SEPARATOR='@PATH_SEPARATOR@' +OBJEXT='@OBJEXT@' +EXEEXT='@EXEEXT@' + +# Common prefix for machine-independent installed files. +prefix='@prefix@' +# Common prefix for machine-dependent installed files. +exec_prefix=`eval echo @exec_prefix@` +# Directory to find libraries in for `-lXXX'. +libdir=${exec_prefix}/lib +# Directory to search by default for included makefiles. +includedir=${prefix}/include + +localedir=${prefix}/share/locale +aliaspath=${localedir}${PATH_SEPARATOR}. + +defines="-DALIASPATH=\"${aliaspath}\" -DLOCALEDIR=\"${localedir}\" -DLIBDIR=\"${libdir}\" -DINCLUDEDIR=\"${includedir}\""' @DEFS@' + +# Exit as soon as any command fails. +set -e + +# These are all the objects we need to link together. +objs="ar.${OBJEXT} arscan.${OBJEXT} commands.${OBJEXT} default.${OBJEXT} dir.${OBJEXT} expand.${OBJEXT} file.${OBJEXT} function.${OBJEXT} getopt.${OBJEXT} getopt1.${OBJEXT} implicit.${OBJEXT} job.${OBJEXT} main.${OBJEXT} misc.${OBJEXT} read.${OBJEXT} remake.${OBJEXT} rule.${OBJEXT} signame.${OBJEXT} strcache.${OBJEXT} variable.${OBJEXT} version.${OBJEXT} vpath.${OBJEXT} hash.${OBJEXT} remote-${REMOTE}.${OBJEXT} ${extras} ${ALLOCA}" + +if [ x"$GLOBLIB" != x ]; then + objs="$objs glob/fnmatch.${OBJEXT} glob/glob.${OBJEXT}" + globinc=-I${srcdir}/glob +fi + +# Compile the source files into those objects. +for file in `echo ${objs} | sed 's/\.'${OBJEXT}'/.c/g'`; do + echo compiling ${file}... + $CC $defines $CPPFLAGS $CFLAGS \ + -c -I. -I${srcdir} ${globinc} ${srcdir}/$file +done + +# The object files were actually all put in the current directory. +# Remove the source directory names from the list. +srcobjs="$objs" +objs= +for obj in $srcobjs; do + objs="$objs `basename $obj`" +done + +# Link all the objects together. +echo linking make... +$CC $CFLAGS $LDFLAGS $objs $LOADLIBES -o makenew${EXEEXT} +echo done +mv -f makenew${EXEEXT} make${EXEEXT} diff --git a/build_w32.bat b/build_w32.bat new file mode 100644 index 0000000..de758b0 --- /dev/null +++ b/build_w32.bat @@ -0,0 +1,203 @@ +@echo off +rem Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +rem 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +rem This file is part of GNU Make. +rem +rem GNU Make is free software; you can redistribute it and/or modify it under +rem the terms of the GNU General Public License as published by the Free +rem Software Foundation; either version 3 of the License, or (at your option) +rem any later version. +rem +rem GNU Make is distributed in the hope that it will be useful, but WITHOUT +rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +rem FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for. +rem more details. +rem +rem You should have received a copy of the GNU General Public License along +rem with this program. If not, see . + +if exist config.h.W32 GoTo NotCVS +sed -n "s/^AC_INIT(\[GNU make\],\[\([^]]\+\)\].*/s,%%VERSION%%,\1,g/p" configure.in > config.h.W32.sed +echo s,%%PACKAGE%%,make,g >> config.h.W32.sed +sed -f config.h.W32.sed config.h.W32.template > config.h.W32 +:NotCVS +if not exist config.h copy config.h.W32 config.h +cd w32\subproc +echo "Creating the subproc library" +%ComSpec% /c build.bat %1 +cd ..\.. + +if exist link.dbg del link.dbg +if exist link.rel del link.rel +echo "Creating GNU Make for Windows 9X/NT/2K/XP" +if "%1" == "gcc" GoTo GCCBuild +set make=gnumake +echo on +if not exist .\WinDebug\nul mkdir .\WinDebug +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D TIVOLI /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c variable.c +echo WinDebug\variable.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c rule.c +echo WinDebug\rule.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c remote-stub.c +echo WinDebug\remote-stub.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c commands.c +echo WinDebug\commands.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c file.c +echo WinDebug\file.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c getloadavg.c +echo WinDebug\getloadavg.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c default.c +echo WinDebug\default.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c signame.c +echo WinDebug\signame.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c expand.c +echo WinDebug\expand.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c dir.c +echo WinDebug\dir.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c main.c +echo WinDebug\main.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c getopt1.c +echo WinDebug\getopt1.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c job.c +echo WinDebug\job.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c read.c +echo WinDebug\read.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c version.c +echo WinDebug\version.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c getopt.c +echo WinDebug\getopt.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c arscan.c +echo WinDebug\arscan.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c hash.c +echo WinDebug\hash.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c strcache.c +echo WinDebug\strcache.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c remake.c +echo WinDebug\remake.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c misc.c +echo WinDebug\misc.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c ar.c +echo WinDebug\ar.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c function.c +echo WinDebug\function.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c vpath.c +echo WinDebug\vpath.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c implicit.c +echo WinDebug\implicit.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\w32\compat\dirent.c +echo WinDebug\dirent.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\glob\glob.c +echo WinDebug\glob.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\glob\fnmatch.c +echo WinDebug\fnmatch.obj >>link.dbg +cl.exe /nologo /MT /W4 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\w32\pathstuff.c +echo WinDebug\pathstuff.obj >>link.dbg +echo off +echo "Linking WinDebug/%make%.exe" +rem link.exe kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib w32\subproc\windebug\subproc.lib /NOLOGO /SUBSYSTEM:console /INCREMENTAL:yes /PDB:.\WinDebug/%make%.pdb /DEBUG /OUT:.\WinDebug/%make%.exe .\WinDebug/variable.obj .\WinDebug/rule.obj .\WinDebug/remote-stub.obj .\WinDebug/commands.obj .\WinDebug/file.obj .\WinDebug/getloadavg.obj .\WinDebug/default.obj .\WinDebug/signame.obj .\WinDebug/expand.obj .\WinDebug/dir.obj .\WinDebug/main.obj .\WinDebug/getopt1.obj .\WinDebug/job.obj .\WinDebug/read.obj .\WinDebug/version.obj .\WinDebug/getopt.obj .\WinDebug/arscan.obj .\WinDebug/remake.obj .\WinDebug/hash.obj .\WinDebug/strcache.obj .\WinDebug/misc.obj .\WinDebug/ar.obj .\WinDebug/function.obj .\WinDebug/vpath.obj .\WinDebug/implicit.obj .\WinDebug/dirent.obj .\WinDebug/glob.obj .\WinDebug/fnmatch.obj .\WinDebug/pathstuff.obj +echo kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib w32\subproc\windebug\subproc.lib >>link.dbg +link.exe /NOLOGO /SUBSYSTEM:console /INCREMENTAL:yes /PDB:.\WinDebug/%make%.pdb /DEBUG /OUT:.\WinDebug/%make%.exe @link.dbg +if not exist .\WinDebug/%make%.exe echo "WinDebug build failed" +if exist .\WinDebug/%make%.exe echo "WinDebug build succeeded!" +if not exist .\WinRel\nul mkdir .\WinRel +echo on +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D TIVOLI /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c variable.c +echo WinRel\variable.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c rule.c +echo WinRel\rule.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c remote-stub.c +echo WinRel\remote-stub.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c commands.c +echo WinRel\commands.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c file.c +echo WinRel\file.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c getloadavg.c +echo WinRel\getloadavg.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c default.c +echo WinRel\default.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c signame.c +echo WinRel\signame.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c expand.c +echo WinRel\expand.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c dir.c +echo WinRel\dir.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c main.c +echo WinRel\main.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c getopt1.c +echo WinRel\getopt1.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c job.c +echo WinRel\job.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c read.c +echo WinRel\read.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c version.c +echo WinRel\version.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c getopt.c +echo WinRel\getopt.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c arscan.c +echo WinRel\arscan.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c remake.c +echo WinRel\remake.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c hash.c +echo WinRel\hash.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c strcache.c +echo WinRel\strcache.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c misc.c +echo WinRel\misc.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c ar.c +echo WinRel\ar.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c function.c +echo WinRel\function.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c vpath.c +echo WinRel\vpath.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c implicit.c +echo WinRel\implicit.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\w32\compat\dirent.c +echo WinRel\dirent.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\glob\glob.c +echo WinRel\glob.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\glob\fnmatch.c +echo WinRel\fnmatch.obj >>link.rel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\w32\pathstuff.c +echo WinRel\pathstuff.obj >>link.rel +echo off +echo "Linking WinRel/%make%.exe" +rem link.exe kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib w32\subproc\winrel\subproc.lib /NOLOGO /SUBSYSTEM:console /INCREMENTAL:no /PDB:.\WinRel/%make%.pdb /OUT:.\WinRel/%make%.exe .\WinRel/variable.obj .\WinRel/rule.obj .\WinRel/remote-stub.obj .\WinRel/commands.obj .\WinRel/file.obj .\WinRel/getloadavg.obj .\WinRel/default.obj .\WinRel/signame.obj .\WinRel/expand.obj .\WinRel/dir.obj .\WinRel/main.obj .\WinRel/getopt1.obj .\WinRel/job.obj .\WinRel/read.obj .\WinRel/version.obj .\WinRel/getopt.obj .\WinRel/arscan.obj .\WinRel/remake.obj .\WinRel/misc.obj .\WinRel/hash.obj .\WinRel/strcache.obj .\WinRel/ar.obj .\WinRel/function.obj .\WinRel/vpath.obj .\WinRel/implicit.obj .\WinRel/dirent.obj .\WinRel/glob.obj .\WinRel/fnmatch.obj .\WinRel/pathstuff.obj +echo kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib w32\subproc\winrel\subproc.lib >>link.rel +link.exe /NOLOGO /SUBSYSTEM:console /INCREMENTAL:no /PDB:.\WinRel/%make%.pdb /OUT:.\WinRel/%make%.exe @link.rel +if not exist .\WinRel/%make%.exe echo "WinRel build failed" +if exist .\WinRel/%make%.exe echo "WinRel build succeeded!" +set make= +GoTo BuildEnd +:GCCBuild +echo on +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c variable.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c rule.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c remote-stub.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c commands.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c file.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c getloadavg.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c default.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c signame.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c expand.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c dir.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c main.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c getopt1.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c job.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c read.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c version.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c getopt.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c arscan.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c remake.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c hash.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c strcache.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c misc.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c ar.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c function.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c vpath.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c implicit.c +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c ./glob/glob.c -o glob.o +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c ./glob/fnmatch.c -o fnmatch.o +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H -c ./w32/pathstuff.c -o pathstuff.o +gcc -mthreads -gdwarf-2 -g3 -o gnumake.exe variable.o rule.o remote-stub.o commands.o file.o getloadavg.o default.o signame.o expand.o dir.o main.o getopt1.o job.o read.o version.o getopt.o arscan.o remake.o misc.o hash.o strcache.o ar.o function.o vpath.o implicit.o glob.o fnmatch.o pathstuff.o w32_misc.o sub_proc.o w32err.o -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 +:BuildEnd +echo on diff --git a/commands.c b/commands.c new file mode 100644 index 0000000..f360bd4 --- /dev/null +++ b/commands.c @@ -0,0 +1,697 @@ +/* Command processing for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "dep.h" +#include "filedef.h" +#include "variable.h" +#include "job.h" +#include "commands.h" +#ifdef WINDOWS32 +#include +#include "w32err.h" +#endif + +#if VMS +# define FILE_LIST_SEPARATOR ',' +#else +# define FILE_LIST_SEPARATOR ' ' +#endif + +int remote_kill (int id, int sig); + +#ifndef HAVE_UNISTD_H +int getpid (); +#endif + + +static unsigned long +dep_hash_1 (const void *key) +{ + const struct dep *d = key; + return_STRING_HASH_1 (dep_name (d)); +} + +static unsigned long +dep_hash_2 (const void *key) +{ + const struct dep *d = key; + return_STRING_HASH_2 (dep_name (d)); +} + +static int +dep_hash_cmp (const void *x, const void *y) +{ + const struct dep *dx = x; + const struct dep *dy = y; + return strcmp (dep_name (dx), dep_name (dy)); +} + +/* Set FILE's automatic variables up. */ + +void +set_file_variables (struct file *file) +{ + struct dep *d; + const char *at, *percent, *star, *less; + +#ifndef NO_ARCHIVES + /* If the target is an archive member `lib(member)', + then $@ is `lib' and $% is `member'. */ + + if (ar_name (file->name)) + { + unsigned int len; + const char *cp; + char *p; + + cp = strchr (file->name, '('); + p = alloca (cp - file->name + 1); + memcpy (p, file->name, cp - file->name); + p[cp - file->name] = '\0'; + at = p; + len = strlen (cp + 1); + p = alloca (len); + memcpy (p, cp + 1, len - 1); + p[len - 1] = '\0'; + percent = p; + } + else +#endif /* NO_ARCHIVES. */ + { + at = file->name; + percent = ""; + } + + /* $* is the stem from an implicit or static pattern rule. */ + if (file->stem == 0) + { + /* In Unix make, $* is set to the target name with + any suffix in the .SUFFIXES list stripped off for + explicit rules. We store this in the `stem' member. */ + const char *name; + unsigned int len; + +#ifndef NO_ARCHIVES + if (ar_name (file->name)) + { + name = strchr (file->name, '(') + 1; + len = strlen (name) - 1; + } + else +#endif + { + name = file->name; + len = strlen (name); + } + + for (d = enter_file (strcache_add (".SUFFIXES"))->deps; d ; d = d->next) + { + unsigned int slen = strlen (dep_name (d)); + if (len > slen && strneq (dep_name (d), name + (len - slen), slen)) + { + file->stem = strcache_add_len (name, len - slen); + break; + } + } + if (d == 0) + file->stem = ""; + } + star = file->stem; + + /* $< is the first not order-only dependency. */ + less = ""; + for (d = file->deps; d != 0; d = d->next) + if (!d->ignore_mtime) + { + if (!d->need_2nd_expansion) + less = dep_name (d); + break; + } + + if (file->cmds == default_file->cmds) + /* This file got its commands from .DEFAULT. + In this case $< is the same as $@. */ + less = at; + +#define DEFINE_VARIABLE(name, len, value) \ + (void) define_variable_for_file (name,len,value,o_automatic,0,file) + + /* Define the variables. */ + + DEFINE_VARIABLE ("<", 1, less); + DEFINE_VARIABLE ("*", 1, star); + DEFINE_VARIABLE ("@", 1, at); + DEFINE_VARIABLE ("%", 1, percent); + + /* Compute the values for $^, $+, $?, and $|. */ + + { + static char *plus_value=0, *bar_value=0, *qmark_value=0; + static unsigned int plus_max=0, bar_max=0, qmark_max=0; + + unsigned int qmark_len, plus_len, bar_len; + char *cp; + char *caret_value; + char *qp; + char *bp; + unsigned int len; + + struct hash_table dep_hash; + void **slot; + + /* Compute first the value for $+, which is supposed to contain + duplicate dependencies as they were listed in the makefile. */ + + plus_len = 0; + bar_len = 0; + for (d = file->deps; d != 0; d = d->next) + { + if (!d->need_2nd_expansion) + { + if (d->ignore_mtime) + bar_len += strlen (dep_name (d)) + 1; + else + plus_len += strlen (dep_name (d)) + 1; + } + } + + if (bar_len == 0) + bar_len++; + + if (plus_len == 0) + plus_len++; + + if (plus_len > plus_max) + plus_value = xrealloc (plus_value, plus_max = plus_len); + + cp = plus_value; + + qmark_len = plus_len + 1; /* Will be this or less. */ + for (d = file->deps; d != 0; d = d->next) + if (! d->ignore_mtime && ! d->need_2nd_expansion) + { + const char *c = dep_name (d); + +#ifndef NO_ARCHIVES + if (ar_name (c)) + { + c = strchr (c, '(') + 1; + len = strlen (c) - 1; + } + else +#endif + len = strlen (c); + + memcpy (cp, c, len); + cp += len; + *cp++ = FILE_LIST_SEPARATOR; + if (! (d->changed || always_make_flag)) + qmark_len -= len + 1; /* Don't space in $? for this one. */ + } + + /* Kill the last space and define the variable. */ + + cp[cp > plus_value ? -1 : 0] = '\0'; + DEFINE_VARIABLE ("+", 1, plus_value); + + /* Compute the values for $^, $?, and $|. */ + + cp = caret_value = plus_value; /* Reuse the buffer; it's big enough. */ + + if (qmark_len > qmark_max) + qmark_value = xrealloc (qmark_value, qmark_max = qmark_len); + qp = qmark_value; + + if (bar_len > bar_max) + bar_value = xrealloc (bar_value, bar_max = bar_len); + bp = bar_value; + + /* Make sure that no dependencies are repeated in $^, $?, and $|. It + would be natural to combine the next two loops but we can't do it + because of a situation where we have two dep entries, the first + is order-only and the second is normal (see below). */ + + hash_init (&dep_hash, 500, dep_hash_1, dep_hash_2, dep_hash_cmp); + + for (d = file->deps; d != 0; d = d->next) + { + if (d->need_2nd_expansion) + continue; + + slot = hash_find_slot (&dep_hash, d); + if (HASH_VACANT (*slot)) + hash_insert_at (&dep_hash, d, slot); + else + { + /* Check if the two prerequisites have different ignore_mtime. + If so then we need to "upgrade" one that is order-only. */ + + struct dep* hd = (struct dep*) *slot; + + if (d->ignore_mtime != hd->ignore_mtime) + d->ignore_mtime = hd->ignore_mtime = 0; + } + } + + for (d = file->deps; d != 0; d = d->next) + { + const char *c; + + if (d->need_2nd_expansion || hash_find_item (&dep_hash, d) != d) + continue; + + c = dep_name (d); +#ifndef NO_ARCHIVES + if (ar_name (c)) + { + c = strchr (c, '(') + 1; + len = strlen (c) - 1; + } + else +#endif + len = strlen (c); + + if (d->ignore_mtime) + { + memcpy (bp, c, len); + bp += len; + *bp++ = FILE_LIST_SEPARATOR; + } + else + { + memcpy (cp, c, len); + cp += len; + *cp++ = FILE_LIST_SEPARATOR; + if (d->changed || always_make_flag) + { + memcpy (qp, c, len); + qp += len; + *qp++ = FILE_LIST_SEPARATOR; + } + } + } + + hash_free (&dep_hash, 0); + + /* Kill the last spaces and define the variables. */ + + cp[cp > caret_value ? -1 : 0] = '\0'; + DEFINE_VARIABLE ("^", 1, caret_value); + + qp[qp > qmark_value ? -1 : 0] = '\0'; + DEFINE_VARIABLE ("?", 1, qmark_value); + + bp[bp > bar_value ? -1 : 0] = '\0'; + DEFINE_VARIABLE ("|", 1, bar_value); + } + +#undef DEFINE_VARIABLE +} + +/* Chop CMDS up into individual command lines if necessary. + Also set the `lines_flags' and `any_recurse' members. */ + +void +chop_commands (struct commands *cmds) +{ + unsigned int nlines, idx; + char **lines; + + /* If we don't have any commands, + or we already parsed them, never mind. */ + + if (!cmds || cmds->command_lines != 0) + return; + + /* Chop CMDS->commands up into lines in CMDS->command_lines. */ + + if (one_shell) + { + int l = strlen (cmds->commands); + + nlines = 1; + lines = xmalloc (nlines * sizeof (char *)); + lines[0] = xstrdup (cmds->commands); + + /* Strip the trailing newline. */ + if (l > 0 && lines[0][l-1] == '\n') + lines[0][l-1] = '\0'; + } + else + { + const char *p; + + nlines = 5; + lines = xmalloc (nlines * sizeof (char *)); + idx = 0; + p = cmds->commands; + while (*p != '\0') + { + const char *end = p; + find_end:; + end = strchr (end, '\n'); + if (end == 0) + end = p + strlen (p); + else if (end > p && end[-1] == '\\') + { + int backslash = 1; + const char *b; + for (b = end - 2; b >= p && *b == '\\'; --b) + backslash = !backslash; + if (backslash) + { + ++end; + goto find_end; + } + } + + if (idx == nlines) + { + nlines += 2; + lines = xrealloc (lines, nlines * sizeof (char *)); + } + lines[idx++] = xstrndup (p, end - p); + p = end; + if (*p != '\0') + ++p; + } + + if (idx != nlines) + { + nlines = idx; + lines = xrealloc (lines, nlines * sizeof (char *)); + } + } + + /* Finally, set the corresponding CMDS->lines_flags elements and the + CMDS->any_recurse flag. */ + + cmds->ncommand_lines = nlines; + cmds->command_lines = lines; + + cmds->any_recurse = 0; + cmds->lines_flags = xmalloc (nlines); + + for (idx = 0; idx < nlines; ++idx) + { + int flags = 0; + const char *p = lines[idx]; + + while (isblank (*p) || *p == '-' || *p == '@' || *p == '+') + switch (*(p++)) + { + case '+': + flags |= COMMANDS_RECURSE; + break; + case '@': + flags |= COMMANDS_SILENT; + break; + case '-': + flags |= COMMANDS_NOERROR; + break; + } + + /* If no explicit '+' was given, look for MAKE variable references. */ + if (!(flags & COMMANDS_RECURSE) + && (strstr (p, "$(MAKE)") != 0 || strstr (p, "${MAKE}") != 0)) + flags |= COMMANDS_RECURSE; + + cmds->lines_flags[idx] = flags; + cmds->any_recurse |= flags & COMMANDS_RECURSE; + } +} + +/* Execute the commands to remake FILE. If they are currently executing, + return or have already finished executing, just return. Otherwise, + fork off a child process to run the first command line in the sequence. */ + +void +execute_file_commands (struct file *file) +{ + const char *p; + + /* Don't go through all the preparations if + the commands are nothing but whitespace. */ + + for (p = file->cmds->commands; *p != '\0'; ++p) + if (!isspace ((unsigned char)*p) && *p != '-' && *p != '@') + break; + if (*p == '\0') + { + /* If there are no commands, assume everything worked. */ + set_command_state (file, cs_running); + file->update_status = 0; + notice_finished_file (file); + return; + } + + /* First set the automatic variables according to this file. */ + + initialize_file_variables (file, 0); + + set_file_variables (file); + + /* Start the commands running. */ + new_job (file); +} + +/* This is set while we are inside fatal_error_signal, + so things can avoid nonreentrant operations. */ + +int handling_fatal_signal = 0; + +/* Handle fatal signals. */ + +RETSIGTYPE +fatal_error_signal (int sig) +{ +#ifdef __MSDOS__ + extern int dos_status, dos_command_running; + + if (dos_command_running) + { + /* That was the child who got the signal, not us. */ + dos_status |= (sig << 8); + return; + } + remove_intermediates (1); + exit (EXIT_FAILURE); +#else /* not __MSDOS__ */ +#ifdef _AMIGA + remove_intermediates (1); + if (sig == SIGINT) + fputs (_("*** Break.\n"), stderr); + + exit (10); +#else /* not Amiga */ +#ifdef WINDOWS32 + extern HANDLE main_thread; + + /* Windows creates a sperate thread for handling Ctrl+C, so we need + to suspend the main thread, or else we will have race conditions + when both threads call reap_children. */ + if (main_thread) + { + DWORD susp_count = SuspendThread (main_thread); + + if (susp_count != 0) + fprintf (stderr, "SuspendThread: suspend count = %ld\n", susp_count); + else if (susp_count == (DWORD)-1) + { + DWORD ierr = GetLastError (); + + fprintf (stderr, "SuspendThread: error %ld: %s\n", + ierr, map_windows32_error_to_string (ierr)); + } + } +#endif + handling_fatal_signal = 1; + + /* Set the handling for this signal to the default. + It is blocked now while we run this handler. */ + signal (sig, SIG_DFL); + + /* A termination signal won't be sent to the entire + process group, but it means we want to kill the children. */ + + if (sig == SIGTERM) + { + struct child *c; + for (c = children; c != 0; c = c->next) + if (!c->remote) + (void) kill (c->pid, SIGTERM); + } + + /* If we got a signal that means the user + wanted to kill make, remove pending targets. */ + + if (sig == SIGTERM || sig == SIGINT +#ifdef SIGHUP + || sig == SIGHUP +#endif +#ifdef SIGQUIT + || sig == SIGQUIT +#endif + ) + { + struct child *c; + + /* Remote children won't automatically get signals sent + to the process group, so we must send them. */ + for (c = children; c != 0; c = c->next) + if (c->remote) + (void) remote_kill (c->pid, sig); + + for (c = children; c != 0; c = c->next) + delete_child_targets (c); + + /* Clean up the children. We don't just use the call below because + we don't want to print the "Waiting for children" message. */ + while (job_slots_used > 0) + reap_children (1, 0); + } + else + /* Wait for our children to die. */ + while (job_slots_used > 0) + reap_children (1, 1); + + /* Delete any non-precious intermediate files that were made. */ + + remove_intermediates (1); + +#ifdef SIGQUIT + if (sig == SIGQUIT) + /* We don't want to send ourselves SIGQUIT, because it will + cause a core dump. Just exit instead. */ + exit (EXIT_FAILURE); +#endif + +#ifdef WINDOWS32 + if (main_thread) + CloseHandle (main_thread); + /* Cannot call W32_kill with a pid (it needs a handle). The exit + status of 130 emulates what happens in Bash. */ + exit (130); +#else + /* Signal the same code; this time it will really be fatal. The signal + will be unblocked when we return and arrive then to kill us. */ + if (kill (getpid (), sig) < 0) + pfatal_with_name ("kill"); +#endif /* not WINDOWS32 */ +#endif /* not Amiga */ +#endif /* not __MSDOS__ */ +} + +/* Delete FILE unless it's precious or not actually a file (phony), + and it has changed on disk since we last stat'd it. */ + +static void +delete_target (struct file *file, const char *on_behalf_of) +{ + struct stat st; + int e; + + if (file->precious || file->phony) + return; + +#ifndef NO_ARCHIVES + if (ar_name (file->name)) + { + time_t file_date = (file->last_mtime == NONEXISTENT_MTIME + ? (time_t) -1 + : (time_t) FILE_TIMESTAMP_S (file->last_mtime)); + if (ar_member_date (file->name) != file_date) + { + if (on_behalf_of) + error (NILF, _("*** [%s] Archive member `%s' may be bogus; not deleted"), + on_behalf_of, file->name); + else + error (NILF, _("*** Archive member `%s' may be bogus; not deleted"), + file->name); + } + return; + } +#endif + + EINTRLOOP (e, stat (file->name, &st)); + if (e == 0 + && S_ISREG (st.st_mode) + && FILE_TIMESTAMP_STAT_MODTIME (file->name, st) != file->last_mtime) + { + if (on_behalf_of) + error (NILF, _("*** [%s] Deleting file `%s'"), on_behalf_of, file->name); + else + error (NILF, _("*** Deleting file `%s'"), file->name); + if (unlink (file->name) < 0 + && errno != ENOENT) /* It disappeared; so what. */ + perror_with_name ("unlink: ", file->name); + } +} + + +/* Delete all non-precious targets of CHILD unless they were already deleted. + Set the flag in CHILD to say they've been deleted. */ + +void +delete_child_targets (struct child *child) +{ + struct dep *d; + + if (child->deleted) + return; + + /* Delete the target file if it changed. */ + delete_target (child->file, NULL); + + /* Also remove any non-precious targets listed in the `also_make' member. */ + for (d = child->file->also_make; d != 0; d = d->next) + delete_target (d->file, child->file->name); + + child->deleted = 1; +} + +/* Print out the commands in CMDS. */ + +void +print_commands (const struct commands *cmds) +{ + const char *s; + + fputs (_("# recipe to execute"), stdout); + + if (cmds->fileinfo.filenm == 0) + puts (_(" (built-in):")); + else + printf (_(" (from `%s', line %lu):\n"), + cmds->fileinfo.filenm, cmds->fileinfo.lineno); + + s = cmds->commands; + while (*s != '\0') + { + const char *end; + + end = strchr (s, '\n'); + if (end == 0) + end = s + strlen (s); + + printf ("%c%.*s\n", cmd_prefix, (int) (end - s), s); + + s = end + (end[0] == '\n'); + } +} diff --git a/commands.h b/commands.h new file mode 100644 index 0000000..24426fa --- /dev/null +++ b/commands.h @@ -0,0 +1,42 @@ +/* Definition of data structures describing shell commands for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +/* Structure that gives the commands to make a file + and information about where these commands came from. */ + +struct commands + { + struct floc fileinfo; /* Where commands were defined. */ + char *commands; /* Commands text. */ + unsigned int ncommand_lines;/* Number of command lines. */ + char **command_lines; /* Commands chopped up into lines. */ + char *lines_flags; /* One set of flag bits for each line. */ + int any_recurse; /* Nonzero if any `lines_recurse' elt has */ + /* the COMMANDS_RECURSE bit set. */ + }; + +/* Bits in `lines_flags'. */ +#define COMMANDS_RECURSE 1 /* Recurses: + or $(MAKE). */ +#define COMMANDS_SILENT 2 /* Silent: @. */ +#define COMMANDS_NOERROR 4 /* No errors: -. */ + +void execute_file_commands (struct file *file); +void print_commands (const struct commands *cmds); +void delete_child_targets (struct child *child); +void chop_commands (struct commands *cmds); +void set_file_variables (struct file *file); diff --git a/config.ami b/config.ami new file mode 100644 index 0000000..6d86c23 --- /dev/null +++ b/config.ami @@ -0,0 +1,344 @@ +/* config.h -- hand-massaged for Amiga -*-C-*- +Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define if using alloca.c. */ +#define C_ALLOCA + +/* Define if the closedir function returns void instead of int. */ +/* #undef CLOSEDIR_VOID */ + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. + This function is required for alloca.c support on those systems. */ +/* #undef CRAY_STACKSEG_END */ + +/* Define for DGUX with . */ +/* #undef DGUX */ + +/* Define if the `getloadavg' function needs to be run setuid or setgid. */ +/* #undef GETLOADAVG_PRIVILEGED */ + +/* Define to `unsigned long' or `unsigned long long' + if doesn't define. */ +#define uintmax_t unsigned long + +/* Define to `int' if doesn't define. */ +#define gid_t int + +/* Define if you have alloca, as a function or macro. */ +/* #undef HAVE_ALLOCA */ + +/* Define if you have and it should be used (not on Ultrix). */ +/* #undef HAVE_ALLOCA_H */ + +/* Define if you don't have vprintf but do have _doprnt. */ +/* #undef HAVE_DOPRNT */ + +/* Define if your system has a working fnmatch function. */ +/* #undef HAVE_FNMATCH */ + +/* Define if your system has its own `getloadavg' function. */ +/* #undef HAVE_GETLOADAVG */ + +/* Define if you have the getmntent function. */ +/* #undef HAVE_GETMNTENT */ + +/* Define if the `long double' type works. */ +/* #undef HAVE_LONG_DOUBLE */ + +/* Define if you support file names longer than 14 characters. */ +#define HAVE_LONG_FILE_NAMES 1 + +/* Define if you have a working `mmap' system call. */ +/* #undef HAVE_MMAP */ + +/* Define if system calls automatically restart after interruption + by a signal. */ +/* #undef HAVE_RESTARTABLE_SYSCALLS */ + +/* Define if your struct stat has st_blksize. */ +/* #undef HAVE_ST_BLKSIZE */ + +/* Define if your struct stat has st_blocks. */ +/* #undef HAVE_ST_BLOCKS */ + +/* Define if you have the strcoll function and it is properly defined. */ +#define HAVE_STRCOLL 1 + +/* Define if your struct stat has st_rdev. */ +#define HAVE_ST_RDEV 1 + +/* Define if you have the strftime function. */ +#define HAVE_STRFTIME 1 + +/* Define if you have that is POSIX.1 compatible. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define if your struct tm has tm_zone. */ +/* #undef HAVE_TM_ZONE */ + +/* Define if you don't have tm_zone but do have the external array + tzname. */ +#define HAVE_TZNAME 1 + +/* Define if you have . */ +#define HAVE_UNISTD_H 1 + +/* Define if utime(file, NULL) sets file's timestamp to the present. */ +/* #undef HAVE_UTIME_NULL */ + +/* Define if you have . */ +/* #undef HAVE_VFORK_H */ + +/* Define if you have the vprintf function. */ +#define HAVE_VPRINTF 1 + +/* Define if you have the wait3 system call. */ +/* #undef HAVE_WAIT3 */ + +/* Define if on MINIX. */ +/* #undef _MINIX */ + +/* Define if your struct nlist has an n_un member. */ +/* #undef NLIST_NAME_UNION */ + +/* Define if you have . */ +/* #undef NLIST_STRUCT */ + +/* Define if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Define to `int' if doesn't define. */ +#define pid_t int + +/* Define if the system does not provide POSIX.1 features except + with this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define if the setvbuf function takes the buffering type as its second + argument and the buffer pointer as the third, as on System V + before release 3. */ +/* #undef SETVBUF_REVERSED */ + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown + */ +#define STACK_DIRECTION -1 + +/* Define if the `S_IS*' macros in do not work properly. */ +/* #undef STAT_MACROS_BROKEN */ + +/* Define if your compiler conforms to the ANSI C standard. */ +#define HAVE_ANSI_COMPILER 1 + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS + +/* Define on System V Release 4. */ +/* #undef SVR4 */ + +/* Define if `sys_siglist' is declared by . */ +/* #undef SYS_SIGLIST_DECLARED */ + +/* Define to `int' if doesn't define. */ +#define uid_t int + +/* Define for Encore UMAX. */ +/* #undef UMAX */ + +/* Define for Encore UMAX 4.3 that has + instead of . */ +/* #undef UMAX4_3 */ + +/* Define vfork as fork if vfork does not work. */ +/* #undef vfork */ + +/* Name of this package (needed by automake) */ +#define PACKAGE "make" + +/* Version of this package (needed by automake) */ +#define VERSION "3.82" + +/* Define to the name of the SCCS `get' command. */ +#define SCCS_GET "get" + +/* Define this if the SCCS `get' command understands the `-G' option. */ +/* #undef SCCS_GET_MINUS_G */ + +/* Define this to enable job server support in GNU make. */ +/* #undef MAKE_JOBSERVER */ + +/* Define to be the nanoseconds member of struct stat's st_mtim, + if it exists. */ +/* #undef ST_MTIM_NSEC */ + +/* Define this if the C library defines the variable `sys_siglist'. */ +/* #undef HAVE_SYS_SIGLIST */ + +/* Define this if the C library defines the variable `_sys_siglist'. */ +/* #undef HAVE__SYS_SIGLIST */ + +/* Define this if you have the `union wait' type in . */ +/* #undef HAVE_UNION_WAIT */ + +/* Define if you have the dup2 function. */ +/* #undef HAVE_DUP2 */ + +/* Define if you have the getcwd function. */ +#define HAVE_GETCWD 1 + +/* Define if you have the getgroups function. */ +/* #undef HAVE_GETGROUPS */ + +/* Define if you have the gethostbyname function. */ +/* #undef HAVE_GETHOSTBYNAME */ + +/* Define if you have the gethostname function. */ +/* #undef HAVE_GETHOSTNAME */ + +/* Define if you have the memmove function. */ +#define HAVE_MEMMOVE 1 + +/* Define if you have the mktemp function. */ +#define HAVE_MKTEMP 1 + +/* Define if you have the psignal function. */ +/* #undef HAVE_PSIGNAL */ + +/* Define if you have the pstat_getdynamic function. */ +/* #undef HAVE_PSTAT_GETDYNAMIC */ + +/* Define if you have the setegid function. */ +/* #undef HAVE_SETEGID */ + +/* Define if you have the seteuid function. */ +/* #undef HAVE_SETEUID */ + +/* Define if you have the setlinebuf function. */ +/* #undef HAVE_SETLINEBUF */ + +/* Define if you have the setregid function. */ +/* #undef HAVE_SETREGID */ + +/* Define if you have the setreuid function. */ +/* #undef HAVE_SETREUID */ + +/* Define if you have the sigsetmask function. */ +/* #undef HAVE_SIGSETMASK */ + +/* Define if you have the socket function. */ +/* #undef HAVE_SOCKET */ + +/* Define to 1 if you have the strcasecmp function. */ +/* #undef HAVE_STRCASECMP */ + +/* Define to 1 if you have the strcmpi function. */ +/* #undef HAVE_STRCMPI */ + +/* Define to 1 if you have the stricmp function. */ +/* #undef HAVE_STRICMP */ + +/* Define if you have the strerror function. */ +#define HAVE_STRERROR 1 + +/* Define if you have the strsignal function. */ +/* #undef HAVE_STRSIGNAL */ + +/* Define if you have the wait3 function. */ +/* #undef HAVE_WAIT3 */ + +/* Define if you have the waitpid function. */ +/* #undef HAVE_WAITPID */ + +/* Define if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_MACH_MACH_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_MEMORY_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_STDLIB_H */ + +/* Define if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_DIR_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_PARAM_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_TIMEB_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define if you have the dgc library (-ldgc). */ +/* #undef HAVE_LIBDGC */ + +/* Define if you have the kstat library (-lkstat). */ +/* #undef HAVE_LIBKSTAT */ + +/* Define if you have the sun library (-lsun). */ +/* #undef HAVE_LIBSUN */ + +/* Define for Case Insensitve behavior */ +#define HAVE_CASE_INSENSITIVE_FS + +/* Build host information. */ +#define MAKE_HOST "Amiga" diff --git a/config.h-vms b/config.h-vms new file mode 100644 index 0000000..a6f19b6 --- /dev/null +++ b/config.h-vms @@ -0,0 +1,429 @@ +/* config.h-vms. Generated by hand by Klaus Kämpf -*-C-*- + +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +/* config.h. Generated automatically by configure. */ +/* config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define to 1 if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to 1 if NLS is requested. */ +/* #undef ENABLE_NLS */ + +/* Define as 1 if you have dcgettext. */ +/* #undef HAVE_DCGETTEXT */ + +/* Define as 1 if you have gettext and don't want to use GNU gettext. */ +/* #undef HAVE_GETTEXT */ + +/* Define to 1 if your locale.h file contains LC_MESSAGES. */ +/* #undef HAVE_LC_MESSAGES */ + +/* Define to the installation directory for locales. */ +#define LOCALEDIR "" + +/* Define as 1 if you have the stpcpy function. */ +/* #undef HAVE_STPCPY */ + +/* Define to 1 if the closedir function returns void instead of int. */ +/* #undef CLOSEDIR_VOID */ + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. + This function is required for alloca.c support on those systems. */ +/* #undef CRAY_STACKSEG_END */ + +/* Define for DGUX with . */ +/* #undef DGUX */ + +/* Define to 1 if the `getloadavg' function needs to be run setuid or setgid. */ +/* #undef GETLOADAVG_PRIVILEGED */ + +/* Define to `unsigned long' or `unsigned long long' + if doesn't define. */ +#define uintmax_t unsigned long + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define to 1 if you have alloca, as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). */ +/* #undef HAVE_ALLOCA_H */ + +/* Define to 1 if you don't have vprintf but do have _doprnt. */ +/* #undef HAVE_DOPRNT */ + +/* Define to 1 if you have the fdopen function. */ +#define HAVE_FDOPEN 1 + +/* Define to 1 if your system has a working fnmatch function. */ +/* #undef HAVE_FNMATCH */ + +/* Define to 1 if your system has its own `getloadavg' function. */ +/* #undef HAVE_GETLOADAVG */ + +/* Define to 1 if you have the getmntent function. */ +/* #undef HAVE_GETMNTENT */ + +/* Define to 1 if the `long double' type works. */ +/* #undef HAVE_LONG_DOUBLE */ + +/* Define to 1 if you support file names longer than 14 characters. */ +#define HAVE_LONG_FILE_NAMES 1 + +/* Define to 1 if you have a working `mmap' system call. */ +/* #undef HAVE_MMAP */ + +/* Define to 1 if system calls automatically restart after interruption + by a signal. */ +/* #undef HAVE_RESTARTABLE_SYSCALLS */ + +/* Define to 1 if your struct stat has st_blksize. */ +/* #undef HAVE_ST_BLKSIZE */ + +/* Define to 1 if your struct stat has st_blocks. */ +/* #undef HAVE_ST_BLOCKS */ + +/* Define to 1 if you have the strcoll function and it is properly defined. */ +/* #undef HAVE_STRCOLL */ + +/* Define to 1 if your struct stat has st_rdev. */ +/* #undef HAVE_ST_RDEV */ + +/* Define to 1 if you have the strftime function. */ +/* #undef HAVE_STRFTIME */ + +/* Define to 1 if you have that is POSIX.1 compatible. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define to 1 if your struct tm has tm_zone. */ +/* #undef HAVE_TM_ZONE */ + +/* Define to 1 if you don't have tm_zone but do have the external array + tzname. */ +/* #undef HAVE_TZNAME */ + +/* Define to 1 if you have . */ +#ifdef __DECC +#define HAVE_UNISTD_H 1 +#endif + +/* Define to 1 if utime(file, NULL) sets file's timestamp to the present. */ +/* #undef HAVE_UTIME_NULL */ + +/* Define to 1 if you have . */ +/* #undef HAVE_VFORK_H */ + +/* Define to 1 if you have the vprintf function. */ +#define HAVE_VPRINTF 1 + +/* Define to 1 if you have the wait3 system call. */ +/* #undef HAVE_WAIT3 */ + +/* Define to 1 if on MINIX. */ +/* #undef _MINIX */ + +/* Define to 1 if your struct nlist has an n_un member. */ +/* #undef NLIST_NAME_UNION */ + +/* Define to 1 if you have . */ +/* #undef NLIST_STRUCT */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Define to `int' if doesn't define. */ +/* I assume types.h is available for all 5.0 cc/cxx compilers */ +#if __DECC_VER < 50090000 +#define pid_t int +#endif + +/* Define to 1 if the system does not provide POSIX.1 features except + with this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define to 1 if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define to 1 if the setvbuf function takes the buffering type as its second + argument and the buffer pointer as the third, as on System V + before release 3. */ +/* #undef SETVBUF_REVERSED */ + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown + */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if the `S_IS*' macros in do not work properly. */ +/* #undef STAT_MACROS_BROKEN */ + +/* Define to 1 if you have the ANSI C header files. */ +/* #undef STDC_HEADERS */ + +/* Define on System V Release 4. */ +/* #undef SVR4 */ + +/* Define to 1 if `sys_siglist' is declared by . */ +/* #undef SYS_SIGLIST_DECLARED */ + +/* Define to `int' if doesn't define. */ +#if __DECC_VER < 50090000 +#define uid_t int +#endif + +/* Define for Encore UMAX. */ +/* #undef UMAX */ + +/* Define for Encore UMAX 4.3 that has + instead of . */ +/* #undef UMAX4_3 */ + +/* Define vfork as fork if vfork does not work. */ +/* #undef vfork */ + +/* Name of this package (needed by automake) */ +#define PACKAGE "make" + +/* Version of this package (needed by automake) */ +#define VERSION "3.82" + +/* Define to the name of the SCCS `get' command. */ +/* #undef SCCS_GET */ + +/* Define this if the SCCS `get' command understands the `-G' option. */ +/* #undef SCCS_GET_MINUS_G */ + +/* Define this to enable job server support in GNU make. */ +/* #undef MAKE_JOBSERVER */ + +/* Define to be the nanoseconds member of struct stat's st_mtim, + if it exists. */ +/* #undef ST_MTIM_NSEC */ + +/* Define to 1 if the C library defines the variable `sys_siglist'. */ +/* #undefine HAVE_SYS_SIGLIST */ + +/* Define to 1 if the C library defines the variable `_sys_siglist'. */ +/* #undef HAVE__SYS_SIGLIST */ + +/* Define to 1 if you have the `union wait' type in . */ +/* #undef HAVE_UNION_WAIT */ + +/* Define to 1 if you have the dup2 function. */ +#define HAVE_DUP2 1 + +/* Define to 1 if you have the getcwd function. */ +#define HAVE_GETCWD 1 + +/* Define to 1 if you have the getgroups function. */ +/* #undef HAVE_GETGROUPS */ + +/* Define to 1 if you have the gethostbyname function. */ +/* #undef HAVE_GETHOSTBYNAME */ + +/* Define to 1 if you have the gethostname function. */ +/* #undef HAVE_GETHOSTNAME */ + +/* Define to 1 if you have the getloadavg function. */ +/* #undef HAVE_GETLOADAVG */ + +/* Define to 1 if you have the memmove function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the mktemp function. */ +#define HAVE_MKTEMP 1 + +/* Define to 1 if you have the psignal function. */ +/* #undef HAVE_PSIGNAL */ + +/* Define to 1 if you have the pstat_getdynamic function. */ +/* #undef HAVE_PSTAT_GETDYNAMIC */ + +/* Define to 1 if you have the setegid function. */ +/* #undef HAVE_SETEGID */ + +/* Define to 1 if you have the seteuid function. */ +/* #undef HAVE_SETEUID */ + +/* Define to 1 if you have the setlinebuf function. */ +/* #undef HAVE_SETLINEBUF */ + +/* Define to 1 if you have the setregid function. */ +/* #undefine HAVE_SETREGID */ + +/* Define to 1 if you have the setreuid function. */ +/* #define HAVE_SETREUID */ + +/* Define to 1 if you have the sigsetmask function. */ +#define HAVE_SIGSETMASK 1 + +/* Define to 1 if you have the socket function. */ +/* #undef HAVE_SOCKET */ + +/* Define to 1 if you have the strcasecmp function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the strcmpi function. */ +/* #undef HAVE_STRCMPI */ + +/* Define to 1 if you have the stricmp function. */ +/* #undef HAVE_STRICMP */ + +/* Define to 1 if you have the strerror function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the strsignal function. */ +/* #undef HAVE_STRSIGNAL */ + +/* Define to 1 if you have the wait3 function. */ +/* #undef HAVE_WAIT3 */ + +/* Define to 1 if you have the waitpid function. */ +/* #undef HAVE_WAITPID */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +#ifdef __DECC +#define HAVE_FCNTL_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACH_MACH_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MEMORY_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if your compiler conforms to the ANSI C standard. */ +#define HAVE_ANSI_COMPILER 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PARAM_H */ + +/* Define to 1 if you have the header file. */ +#ifndef __GNUC__ +#define HAVE_SYS_TIMEB_H 1 +#endif + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define to 1 if you have the dgc library (-ldgc). */ +/* #undef HAVE_LIBDGC */ + +/* Define to 1 if you have the kstat library (-lkstat). */ +/* #undef HAVE_LIBKSTAT * + +/* Define to 1 if you have the sun library (-lsun). */ +/* #undef HAVE_LIBSUN */ + +/* Use high resolution file timestamps if nonzero. */ +#define FILE_TIMESTAMP_HI_RES 0 + +/* Define for case insensitve filenames */ +#define HAVE_CASE_INSENSITIVE_FS 1 + +/* VMS specific, define it if you want to use case sensitive targets */ +/* #undef WANT_CASE_SENSITIVE_TARGETS */ + +/* VMS specific, V7.0 has opendir() and friends, so it's undefined */ +/* If you want to use non-VMS code for opendir() etc. on V7.0 and greater + define the first or both macros AND change the compile command to get the + non-VMS versions linked: (prefix=(all,except=(opendir,... */ +/* #undef HAVE_VMSDIR_H */ +/* #undef _DIRENT_HAVE_D_NAMLEN */ + +/* On older systems without 7.0 backport of CRTL the first one is defined */ +#ifdef __CRTL_VER +# if __CRTL_VER < 70000000 +# define HAVE_VMSDIR_H 1 +# endif +#else +# if __VMS_VER < 70000000 +# define HAVE_VMSDIR_H 1 +# endif +#endif + +#if defined(HAVE_VMSDIR_H) && defined(HAVE_DIRENT_H) +#undef HAVE_DIRENT_H +#endif + +#define HAVE_STDLIB_H 1 +#define INCLUDEDIR "sys$sysroot:[syslib]" +#define LIBDIR "sys$sysroot:[syslib]" + +/* Don't use RTL functions of OpenVMS */ +#ifdef __DECC +#include +#include +#define getopt gnu_getopt +#define optarg gnu_optarg +#define optopt gnu_optopt +#define optind gnu_optind +#define opterr gnu_opterr +#define globfree gnu_globfree +#define glob gnu_glob +#endif + +/* Define if using alloca.c. */ +/* #undef C_ALLOCA */ +/* maybe this should be placed into make.h */ +#if defined(__VAX) && defined(__DECC) +#define alloca(n) __ALLOCA(n) +#endif + +/* Build host information. */ +#define MAKE_HOST "VMS" diff --git a/config.h.W32 b/config.h.W32 new file mode 100644 index 0000000..4ac84f7 --- /dev/null +++ b/config.h.W32 @@ -0,0 +1,522 @@ +/* config.h.W32 -- hand-massaged config.h file for Windows builds -*-C-*- + +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +/* Suppress some Visual C++ warnings. + Maybe after the code cleanup for ISO C we can remove some/all of these. */ +#if _MSC_VER > 1000 +# pragma warning(disable:4100) /* unreferenced formal parameter */ +# pragma warning(disable:4102) /* unreferenced label */ +# pragma warning(disable:4127) /* conditional expression is constant */ +# pragma warning(disable:4131) /* uses old-style declarator */ +# pragma warning(disable:4702) /* unreachable code */ +# define _CRT_SECURE_NO_WARNINGS /* function or variable may be unsafe */ +# define _CRT_NONSTDC_NO_WARNINGS /* functions w/o a leading underscore */ +#endif + +/* Define to 1 if the `closedir' function returns void instead of `int'. */ +/* #undef CLOSEDIR_VOID */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to 1 if using `getloadavg.c'. */ +/*#define C_GETLOADAVG 1*/ + +/* Define to 1 for DGUX with . */ +/* #undef DGUX */ + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +/* #undef ENABLE_NLS */ + +/* Use high resolution file timestamps if nonzero. */ +#define FILE_TIMESTAMP_HI_RES 0 + +/* Define to 1 if the `getloadavg' function needs to be run setuid or setgid. + */ +/* #undef GETLOADAVG_PRIVILEGED */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +/* #undef HAVE_ALLOCA_H */ + +/* Define if your compiler conforms to the ANSI C standard. */ +#define HAVE_ANSI_COMPILER 1 + +/* Define to 1 if you have the `bsd_signal' function. */ +/* #undef HAVE_BSD_SIGNAL */ + +/* Use case insensitive file names */ +/* #undef HAVE_CASE_INSENSITIVE_FS */ + +/* Define if you have the clock_gettime function. */ +/* #undef HAVE_CLOCK_GETTIME */ + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +/* #undef HAVE_DCGETTEXT */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file, and it defines getcwd() + and chdir(). + */ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(__INTERIX) +# define HAVE_DIRECT_H 1 +#endif + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* #undef HAVE_DOPRNT */ + +/* Use platform specific coding */ +#define HAVE_DOS_PATHS 1 + +/* Define to 1 if you have the `dup2' function. */ +#define HAVE_DUP2 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `fdopen' function. */ +/*#define HAVE_FDOPEN 1*/ + +/* Define to 1 if you have the `fork' function. */ +/* #undef HAVE_FORK */ + +/* Define to 1 if you have the `getcwd' function. */ +#define HAVE_GETCWD 1 + +/* Define to 1 if you have the `getgroups' function. */ +/* #undef HAVE_GETGROUPS */ + +/* Define to 1 if you have the `gethostbyname' function. */ +/* #undef HAVE_GETHOSTBYNAME */ + +/* Define to 1 if you have the `gethostname' function. */ +/* #undef HAVE_GETHOSTNAME */ + +/* Define to 1 if you have the `getloadavg' function. */ +/* #undef HAVE_GETLOADAVG */ + +/* Define to 1 if you have the `getrlimit' function. */ +/* #undef HAVE_GETRLIMIT */ + +/* Define if the GNU gettext() function is already present or preinstalled. */ +/* #undef HAVE_GETTEXT */ + +/* Define if you have a standard gettimeofday function */ +/* #undef HAVE_GETTIMEOFDAY */ + +/* Define if you have the iconv() function. */ +/* #undef HAVE_ICONV */ + +/* Define to 1 if you have the header file. */ +/*#define HAVE_INTTYPES_H 1*/ + +/* Define to 1 if you have the `dgc' library (-ldgc). */ +/* #undef HAVE_LIBDGC */ + +/* Define to 1 if you have the `kstat' library (-lkstat). */ +/* #undef HAVE_LIBKSTAT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +/*#define HAVE_LOCALE_H 1*/ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACH_MACH_H */ + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkstemp' function. */ +/* #undef HAVE_MKSTEMP */ + +/* Define to 1 if you have the `mktemp' function. */ +#define HAVE_MKTEMP 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NLIST_H */ + +/* Define to 1 if you have the `pipe' function. */ +/* #undef HAVE_PIPE */ + +/* Define to 1 if you have the `pstat_getdynamic' function. */ +/* #undef HAVE_PSTAT_GETDYNAMIC */ + +/* Define to 1 if you have the `realpath' function. */ +/* #undef HAVE_REALPATH */ + +/* Define if defines the SA_RESTART constant. */ +/* #undef HAVE_SA_RESTART */ + +/* Define to 1 if you have the `setegid' function. */ +/* #undef HAVE_SETEGID */ + +/* Define to 1 if you have the `seteuid' function. */ +/* #undef HAVE_SETEUID */ + +/* Define to 1 if you have the `setlinebuf' function. */ +/* #undef HAVE_SETLINEBUF */ + +/* Define to 1 if you have the `setlocale' function. */ +/*#define HAVE_SETLOCALE 1*/ + +/* Define to 1 if you have the `setregid' function. */ +/* #undef HAVE_SETREGID */ + +/* Define to 1 if you have the `setreuid' function. */ +/* #undef HAVE_SETREUID */ + +/* Define to 1 if you have the `setrlimit' function. */ +/* #undef HAVE_SETRLIMIT */ + +/* Define to 1 if you have the `setvbuf' function. */ +/*#define HAVE_SETVBUF 1 */ + +/* Define to 1 if you have the `sigaction' function. */ +/* #undef HAVE_SIGACTION */ + +/* Define to 1 if you have the `sigsetmask' function. */ +/* #undef HAVE_SIGSETMASK */ + +/* Define to 1 if you have the `socket' function. */ +/* #undef HAVE_SOCKET */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +/*#define HAVE_STDINT_H 1*/ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +/* #undef HAVE_STRCASECMP */ + +/* Define to 1 if you have the `strcmpi' function. */ +/* #undef HAVE_STRCMPI */ + +/* Define to 1 if you have the `stricmp' function. */ +#define HAVE_STRICMP 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +/* #undef HAVE_STRNCASECMP */ + +/* Define to 1 if you have the `strncmpi' function. */ +/* #undef HAVE_STRNCMPI */ + +/* Define to 1 if you have the `strnicmp' function. */ +#define HAVE_STRNICMP 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the `strcoll' function and it is properly defined. + */ +#define HAVE_STRCOLL 1 + +/* Define to 1 if you have the `strdup' function. */ +/* #define HAVE_STRDUP 1*/ + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +/* #define HAVE_STRINGS_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strsignal' function. */ +/* #undef HAVE_STRSIGNAL */ + +/* Define to 1 if `n_un.n_name' is member of `struct nlist'. */ +/* #undef HAVE_STRUCT_NLIST_N_UN_N_NAME */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_PARAM_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_RESOURCE_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_STAT_H 1 */ + +/* Define to 1 if you have the header file. */ +/*#define HAVE_SYS_TIMEB_H 1*/ + +/* Define to 1 if you have the header file. */ +/*#define HAVE_SYS_TIME_H 1*/ + +/* Define to 1 if you have the header file. */ +/*#define HAVE_SYS_TYPES_H 1*/ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define this if you have the \`union wait' type in . */ +/* #undef HAVE_UNION_WAIT */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_UNISTD_H 1*/ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_VARARGS_H */ + +/* Define to 1 if you have the `vfork' function. */ +/* #undef HAVE_VFORK */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_VFORK_H */ + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + + +/* Define to 1 if you have the `wait3' function. */ +/* #undef HAVE_WAIT3 */ + +/* Define to 1 if you have the `waitpid' function. */ +/* #undef HAVE_WAITPID */ + +/* Define to 1 if `fork' works. */ +/* #undef HAVE_WORKING_FORK */ + +/* Define to 1 if `vfork' works. */ +/* #undef HAVE_WORKING_VFORK */ + +/* Build host information. */ +#define MAKE_HOST "Windows32" + +/* Define this to enable job server support in GNU make. */ +/* #undef MAKE_JOBSERVER */ + +/* Define to 1 if your `struct nlist' has an `n_un' member. Obsolete, depend + on `HAVE_STRUCT_NLIST_N_UN_N_NAME */ +/* #undef NLIST_NAME_UNION */ + +/* Define if struct nlist.n_name is a pointer rather than an array. */ +/* #undef NLIST_STRUCT */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of this package (needed by automake) */ +#define PACKAGE "make" + +/* Define to 1 if the C compiler supports function prototypes. */ +#define PROTOTYPES 1 + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE void + +/* Define to the name of the SCCS 'get' command. */ +#define SCCS_GET "echo no sccs get" + +/* Define this if the SCCS 'get' command understands the '-G' option. */ +/* #undef SCCS_GET_MINUS_G */ + +/* Define to 1 if the `setvbuf' function takes the buffering type as its + second argument and the buffer pointer as the third, as on System V before + release 3. */ +/* #undef SETVBUF_REVERSED */ + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if the `S_IS*' macros in do not work properly. */ +/* #undef STAT_MACROS_BROKEN */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if struct stat contains a nanoseconds field */ +/* #undef ST_MTIM_NSEC */ + +/* Define to 1 on System V Release 4. */ +/* #undef SVR4 */ + +/* Define to 1 if you can safely include both and . */ +/* #define TIME_WITH_SYS_TIME 1 */ + +/* Define to 1 for Encore UMAX. */ +/* #undef UMAX */ + +/* Define to 1 for Encore UMAX 4.3 that has instead of + . */ +/* #undef UMAX4_3 */ + +/* Version number of package */ +#define VERSION "3.82" + +/* Define if using the dmalloc debugging malloc package */ +/* #undef WITH_DMALLOC */ + +/* Define to 1 if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* # undef _ALL_SOURCE */ +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to 1 if on MINIX. */ +/* #undef _MINIX */ + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#define _POSIX_SOURCE 1 + +/* Define like PROTOTYPES; this can be used by system headers. */ +/*#define __PROTOTYPES 1*/ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +#include + +/* Define to `int' if doesn't define. */ +#define gid_t int + +/* Define to `int' if does not define. */ +/* GCC 4.x reportedly defines pid_t. */ +#ifndef _PID_T_ +#ifdef _WIN64 +#define pid_t __int64 +#else +#define pid_t int +#endif +#endif + +/* Define to `int' if doesn't define. */ +#define uid_t int + +/* Define uintmax_t if not defined in or . */ +#define uintmax_t unsigned long + +/* Define as `fork' if `vfork' does not work. */ +/*#define vfork fork*/ + +/* Define to `unsigned long' or `unsigned long long' + if doesn't define. */ +#define uintmax_t unsigned long + +/* Define if you support file names longer than 14 characters. */ +#define HAVE_LONG_FILE_NAMES 1 + +/* Define if your struct stat has st_rdev. */ +#undef HAVE_ST_RDEV +#define HAVE_ST_RDEV 1 + +/* Define if you have the strftime function. */ +#undef HAVE_STRFTIME +#define HAVE_STRFTIME 1 + +/* Define if you have that is POSIX.1 compatible. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define if your struct tm has tm_zone. */ +/* #undef HAVE_TM_ZONE */ + +/* Define if you don't have tm_zone but do have the external array + tzname. */ +#undef HAVE_TZNAME +#define HAVE_TZNAME 1 + +/* Define if utime(file, NULL) sets file's timestamp to the present. */ +#undef HAVE_UTIME_NULL +#define HAVE_UTIME_NULL 1 + +/* Define to the installation directory for locales. */ +#define LOCALEDIR "" + +/* + * Refer to README.W32 for info on the following settings + */ + + +/* + * If you have a shell that does not grok 'sh -c quoted-command-line' + * correctly, you need this setting. Please see below for specific + * shell support. + */ +/*#define BATCH_MODE_ONLY_SHELL 1 */ + +/* + * Define if you have the Cygnus "Cygwin" GNU Windows32 tool set. + * Do NOT define BATCH_MODE_ONLY_SHELL if you define HAVE_CYGWIN_SHELL + */ +/*#define HAVE_CYGWIN_SHELL 1 */ + +/* + * Define if you have the MKS tool set or shell. Do NOT define + * BATCH_MODE_ONLY_SHELL if you define HAVE_MKS_SHELL + */ +/*#define HAVE_MKS_SHELL 1 */ + +/* + * Enforce the mutual exclusivity restriction. + */ +#ifdef HAVE_MKS_SHELL +#undef BATCH_MODE_ONLY_SHELL +#endif + +#ifdef HAVE_CYGWIN_SHELL +#undef BATCH_MODE_ONLY_SHELL +#endif diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..da28f93 --- /dev/null +++ b/config.h.in @@ -0,0 +1,462 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if the `closedir' function returns void instead of `int'. */ +#undef CLOSEDIR_VOID + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if using `getloadavg.c'. */ +#undef C_GETLOADAVG + +/* Define to 1 for DGUX with . */ +#undef DGUX + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Use high resolution file timestamps if nonzero. */ +#undef FILE_TIMESTAMP_HI_RES + +/* Define to 1 if the `getloadavg' function needs to be run setuid or setgid. + */ +#undef GETLOADAVG_PRIVILEGED + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if your compiler conforms to the ANSI C standard. */ +#undef HAVE_ANSI_COMPILER + +/* Define to 1 if you have the `atexit' function. */ +#undef HAVE_ATEXIT + +/* Use case insensitive file names */ +#undef HAVE_CASE_INSENSITIVE_FS + +/* Define to 1 if you have the clock_gettime function. */ +#undef HAVE_CLOCK_GETTIME + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the declaration of `bsd_signal', and to 0 if you + don't. */ +#undef HAVE_DECL_BSD_SIGNAL + +/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL_SYS_SIGLIST + +/* Define to 1 if you have the declaration of `_sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL__SYS_SIGLIST + +/* Define to 1 if you have the declaration of `__sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL___SYS_SIGLIST + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#undef HAVE_DOPRNT + +/* Use platform specific coding */ +#undef HAVE_DOS_PATHS + +/* Define to 1 if you have the `dup2' function. */ +#undef HAVE_DUP2 + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `fdopen' function. */ +#undef HAVE_FDOPEN + +/* Define to 1 if you have the `fileno' function. */ +#undef HAVE_FILENO + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `getgroups' function. */ +#undef HAVE_GETGROUPS + +/* Define to 1 if you have the `gethostbyname' function. */ +#undef HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the `gethostname' function. */ +#undef HAVE_GETHOSTNAME + +/* Define to 1 if you have the `getloadavg' function. */ +#undef HAVE_GETLOADAVG + +/* Define to 1 if you have the `getrlimit' function. */ +#undef HAVE_GETRLIMIT + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to 1 if you have a standard gettimeofday function */ +#undef HAVE_GETTIMEOFDAY + +/* Define if you have the iconv() function. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `dgc' library (-ldgc). */ +#undef HAVE_LIBDGC + +/* Define to 1 if you have the `kstat' library (-lkstat). */ +#undef HAVE_LIBKSTAT + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the `lstat' function. */ +#undef HAVE_LSTAT + +/* Define to 1 if you have the header file. */ +#undef HAVE_MACH_MACH_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mkstemp' function. */ +#undef HAVE_MKSTEMP + +/* Define to 1 if you have the `mktemp' function. */ +#undef HAVE_MKTEMP + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NLIST_H + +/* Define to 1 if you have the `pipe' function. */ +#undef HAVE_PIPE + +/* Define to 1 if you have the `pstat_getdynamic' function. */ +#undef HAVE_PSTAT_GETDYNAMIC + +/* Define to 1 if you have the `readlink' function. */ +#undef HAVE_READLINK + +/* Define to 1 if you have the `realpath' function. */ +#undef HAVE_REALPATH + +/* Define to 1 if defines the SA_RESTART constant. */ +#undef HAVE_SA_RESTART + +/* Define to 1 if you have the `setegid' function. */ +#undef HAVE_SETEGID + +/* Define to 1 if you have the `seteuid' function. */ +#undef HAVE_SETEUID + +/* Define to 1 if you have the `setlinebuf' function. */ +#undef HAVE_SETLINEBUF + +/* Define to 1 if you have the `setlocale' function. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if you have the `setregid' function. */ +#undef HAVE_SETREGID + +/* Define to 1 if you have the `setreuid' function. */ +#undef HAVE_SETREUID + +/* Define to 1 if you have the `setrlimit' function. */ +#undef HAVE_SETRLIMIT + +/* Define to 1 if you have the `setvbuf' function. */ +#undef HAVE_SETVBUF + +/* Define to 1 if you have the `sigaction' function. */ +#undef HAVE_SIGACTION + +/* Define to 1 if you have the `sigsetmask' function. */ +#undef HAVE_SIGSETMASK + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDARG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strcmpi' function. */ +#undef HAVE_STRCMPI + +/* Define to 1 if you have the `strcoll' function and it is properly defined. + */ +#undef HAVE_STRCOLL + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the `stricmp' function. */ +#undef HAVE_STRICMP + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the `strncmpi' function. */ +#undef HAVE_STRNCMPI + +/* Define to 1 if you have the `strndup' function. */ +#undef HAVE_STRNDUP + +/* Define to 1 if you have the `strnicmp' function. */ +#undef HAVE_STRNICMP + +/* Define to 1 if you have the `strsignal' function. */ +#undef HAVE_STRSIGNAL + +/* Define to 1 if `n_un.n_name' is a member of `struct nlist'. */ +#undef HAVE_STRUCT_NLIST_N_UN_N_NAME + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMEB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the \`union wait' type in . */ +#undef HAVE_UNION_WAIT + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_VARARGS_H + +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_VFORK_H + +/* Define to 1 if you have the `vprintf' function. */ +#undef HAVE_VPRINTF + +/* Define to 1 if you have the `wait3' function. */ +#undef HAVE_WAIT3 + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* Define to 1 if `fork' works. */ +#undef HAVE_WORKING_FORK + +/* Define to 1 if `vfork' works. */ +#undef HAVE_WORKING_VFORK + +/* Build host information. */ +#undef MAKE_HOST + +/* Define to 1 to enable job server support in GNU make. */ +#undef MAKE_JOBSERVER + +/* Define to 1 to enable symbolic link timestamp checking. */ +#undef MAKE_SYMLINKS + +/* Define to 1 if your `struct nlist' has an `n_un' member. Obsolete, depend + on `HAVE_STRUCT_NLIST_N_UN_N_NAME */ +#undef NLIST_NAME_UNION + +/* Define to 1 if struct nlist.n_name is a pointer rather than an array. */ +#undef NLIST_STRUCT + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to the character that separates directories in PATH. */ +#undef PATH_SEPARATOR_CHAR + +/* Define as the return type of signal handlers (`int' or `void'). */ +#undef RETSIGTYPE + +/* Define to the name of the SCCS 'get' command. */ +#undef SCCS_GET + +/* Define to 1 if the SCCS 'get' command understands the '-G' option. */ +#undef SCCS_GET_MINUS_G + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if the `S_IS*' macros in do not work properly. */ +#undef STAT_MACROS_BROKEN + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if struct stat contains a nanoseconds field */ +#undef ST_MTIM_NSEC + +/* Define to 1 on System V Release 4. */ +#undef SVR4 + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 for Encore UMAX. */ +#undef UMAX + +/* Define to 1 for Encore UMAX 4.3 that has instead of + . */ +#undef UMAX4_3 + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Version number of package */ +#undef VERSION + +/* Use platform specific coding */ +#undef WINDOWS32 + +/* Define if using the dmalloc debugging malloc package */ +#undef WITH_DMALLOC + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `int' if doesn't define. */ +#undef gid_t + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define to `int' if doesn't define. */ +#undef uid_t + +/* Define uintmax_t if not defined in or . */ +#undef uintmax_t + +/* Define as `fork' if `vfork' does not work. */ +#undef vfork diff --git a/config/ChangeLog b/config/ChangeLog new file mode 100644 index 0000000..aed4694 --- /dev/null +++ b/config/ChangeLog @@ -0,0 +1,45 @@ +2006-03-09 Paul Smith + + * dospaths.m4: Add MSYS to the list of targets allowing DOS-style + pathnames. Reported by David Ergo . + +2005-07-01 Paul D. Smith + + * Makefile.am (EXTRA_DIST): Added more M4 files to EXTRA_DIST, so + users can re-run aclocal. + +2003-04-30 Paul D. Smith + + * dospaths.m4: New macro to test for DOS-style pathnames, based on + coreutils 5.0 "dos.m4" by Jim Meyering. + +2002-04-21 gettextize + + * codeset.m4: New file, from gettext-0.11.1. + * gettext.m4: New file, from gettext-0.11.1. + * glibc21.m4: New file, from gettext-0.11.1. + * iconv.m4: New file, from gettext-0.11.1. + * isc-posix.m4: New file, from gettext-0.11.1. + * lcmessage.m4: New file, from gettext-0.11.1. + * lib-ld.m4: New file, from gettext-0.11.1. + * lib-link.m4: New file, from gettext-0.11.1. + * lib-prefix.m4: New file, from gettext-0.11.1. + * progtest.m4: New file, from gettext-0.11.1. + * Makefile.am: New file. + + +Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software +Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/config/Makefile.am b/config/Makefile.am new file mode 100644 index 0000000..203a5ee --- /dev/null +++ b/config/Makefile.am @@ -0,0 +1,24 @@ +# -*-Makefile-*-, or close enough +# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +# Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +EXTRA_DIST = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 isc-posix.m4 nls.m4 \ + intdiv0.m4 inttypes-pri.m4 inttypes.m4 inttypes_h.m4 \ + isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 \ + progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 longlong.m4 \ + dospaths.m4 po.m4 signed.m4 longdouble.m4 wchar_t.m4 \ + wint_t.m4 intmax.m4 printf-posix.m4 xsize.m4 size_max.m4 diff --git a/config/Makefile.in b/config/Makefile.in new file mode 100644 index 0000000..41127d6 --- /dev/null +++ b/config/Makefile.in @@ -0,0 +1,380 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# -*-Makefile-*-, or close enough +# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +# Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = config +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog \ + compile config.guess config.rpath config.sub depcomp \ + install-sh mdate-sh missing mkinstalldirs texinfo.tex +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/isc-posix.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 isc-posix.m4 nls.m4 \ + intdiv0.m4 inttypes-pri.m4 inttypes.m4 inttypes_h.m4 \ + isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 \ + progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 longlong.m4 \ + dospaths.m4 po.m4 signed.m4 longdouble.m4 wchar_t.m4 \ + wint_t.m4 intmax.m4 printf-posix.m4 xsize.m4 size_max.m4 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu config/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu config/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/config/codeset.m4 b/config/codeset.m4 new file mode 100644 index 0000000..59535eb --- /dev/null +++ b/config/codeset.m4 @@ -0,0 +1,23 @@ +# codeset.m4 serial AM1 (gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include ], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +]) diff --git a/config/compile b/config/compile new file mode 100755 index 0000000..c0096a7 --- /dev/null +++ b/config/compile @@ -0,0 +1,143 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2009-10-06.20; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software +# Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand `-c -o'. +Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file `INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/config.guess b/config/config.guess new file mode 100644 index 0000000..115f944 --- /dev/null +++ b/config/config.guess @@ -0,0 +1,1502 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. + +timestamp='2010-04-03' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' HUP INT TERM + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config/config.rpath b/config/config.rpath new file mode 100755 index 0000000..4db13e5 --- /dev/null +++ b/config/config.rpath @@ -0,0 +1,548 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2003 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + mingw* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux*) + case $CC in + icc|ecc) + wl='-Wl,' + ;; + ccc) + wl='-Wl,' + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + sco3.2v5*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = yes; then + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + hardcode_direct=no + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10* | hpux11*) + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + sco3.2v5*) + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4.2uw2*) + hardcode_direct=yes + hardcode_minus_L=no + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + ;; + sysv5*) + hardcode_libdir_flag_spec= + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +libname_spec='lib$name' +case "$host_os" in + aix3*) + ;; + aix4* | aix5*) + ;; + amigaos*) + ;; + beos*) + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + ;; + darwin* | rhapsody*) + shrext=.dylib + ;; + dgux*) + ;; + freebsd1*) + ;; + freebsd*) + ;; + gnu*) + ;; + hpux9* | hpux10* | hpux11*) + case "$host_cpu" in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux*) + ;; + netbsd*) + ;; + newsos6) + ;; + nto-qnx) + ;; + openbsd*) + ;; + os2*) + libname_spec='$name' + shrext=.dll + ;; + osf3* | osf4* | osf5*) + ;; + sco3.2v5*) + ;; + solaris*) + ;; + sunos4*) + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + ;; + sysv4*MP*) + ;; + uts4*) + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile-* | tilegx-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + # This must be matched before tile*. + tilegx*) + basic_machine=tilegx-unknown + os=-linux-gnu + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config/depcomp b/config/depcomp new file mode 100755 index 0000000..df8eea7 --- /dev/null +++ b/config/depcomp @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free +# Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u="sed s,\\\\\\\\,/,g" + depmode=msvisualcpp +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/dospaths.m4 b/config/dospaths.m4 new file mode 100644 index 0000000..da544f8 --- /dev/null +++ b/config/dospaths.m4 @@ -0,0 +1,38 @@ +# Test if the system uses DOS-style pathnames (drive specs and backslashes) +# By Paul Smith . Based on dos.m4 by Jim Meyering. +# +# Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +AC_DEFUN([pds_AC_DOS_PATHS], + [ + AC_CACHE_CHECK([whether system uses MSDOS-style paths], [ac_cv_dos_paths], + [ + AC_COMPILE_IFELSE([ +#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __EMX__ && !defined __MSYS__ && !defined __CYGWIN__ +neither MSDOS nor Windows nor OS2 +#endif +], + [ac_cv_dos_paths=yes], + [ac_cv_dos_paths=no]) + ]) + + if test x"$ac_cv_dos_paths" = xyes; then + AC_DEFINE_UNQUOTED([HAVE_DOS_PATHS], 1, + [Define if the system uses DOS-style pathnames.]) + fi + ]) diff --git a/config/gettext.m4 b/config/gettext.m4 new file mode 100644 index 0000000..a374f03 --- /dev/null +++ b/config/gettext.m4 @@ -0,0 +1,487 @@ +# gettext.m4 serial 28 (gettext-0.13) +dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define(gt_included_intl, ifelse([$1], [external], [no], [yes])) + define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + dnl Set USE_NLS. + AM_NLS + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + gt_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext_libintl=yes + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + AC_MSG_CHECKING([whether to use NLS]) + AC_MSG_RESULT([$USE_NLS]) + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([where the gettext function comes from]) + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + AC_MSG_RESULT([$gt_source]) + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl For backward compatibility. Some Makefiles may be using this. + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + AC_SUBST(INTLOBJS) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. +AC_DEFUN([AM_INTL_SUBDIR], +[ + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([bh_C_SIGNED])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([jm_AC_TYPE_LONG_LONG])dnl + AC_REQUIRE([gt_TYPE_LONGDOUBLE])dnl + AC_REQUIRE([gt_TYPE_WCHAR_T])dnl + AC_REQUIRE([gt_TYPE_WINT_T])dnl + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + AC_REQUIRE([gt_TYPE_INTMAX_T]) + AC_REQUIRE([gt_PRINTF_POSIX]) + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([jm_GLIBC21])dnl + AC_REQUIRE([gt_INTDIV0])dnl + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl + AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl + AC_REQUIRE([gt_INTTYPES_PRI])dnl + AC_REQUIRE([gl_XSIZE])dnl + + AC_CHECK_TYPE([ptrdiff_t], , + [AC_DEFINE([ptrdiff_t], [long], + [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) + ]) + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([asprintf fwprintf getcwd getegid geteuid getgid getuid \ +mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \ +strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \ +__fsetlocking]) + + dnl Use the _snprintf function only if it is declared (because on NetBSD it + dnl is defined as a weak alias of snprintf; we prefer to use the latter). + gt_CHECK_DECL(_snprintf, [#include ]) + gt_CHECK_DECL(_snwprintf, [#include ]) + + dnl Use the *_unlocked functions only if they are declared. + dnl (because some of them were defined without being declared in Solaris + dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built + dnl on Solaris 2.5.1 to run on Solaris 2.6). + dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13. + gt_CHECK_DECL(feof_unlocked, [#include ]) + gt_CHECK_DECL(fgets_unlocked, [#include ]) + gt_CHECK_DECL(getc_unlocked, [#include ]) + + case $gt_cv_func_printf_posix in + *yes) HAVE_POSIX_PRINTF=1 ;; + *) HAVE_POSIX_PRINTF=0 ;; + esac + AC_SUBST([HAVE_POSIX_PRINTF]) + if test "$ac_cv_func_asprintf" = yes; then + HAVE_ASPRINTF=1 + else + HAVE_ASPRINTF=0 + fi + AC_SUBST([HAVE_ASPRINTF]) + if test "$ac_cv_func_snprintf" = yes; then + HAVE_SNPRINTF=1 + else + HAVE_SNPRINTF=0 + fi + AC_SUBST([HAVE_SNPRINTF]) + if test "$ac_cv_func_wprintf" = yes; then + HAVE_WPRINTF=1 + else + HAVE_WPRINTF=0 + fi + AC_SUBST([HAVE_WPRINTF]) + + AM_ICONV + AM_LANGINFO_CODESET + if test $ac_cv_header_locale_h = yes; then + AM_LC_MESSAGES + fi + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi +]) + + +dnl gt_CHECK_DECL(FUNC, INCLUDES) +dnl Check whether a function is declared. +AC_DEFUN([gt_CHECK_DECL], +[ + AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1, + [AC_TRY_COMPILE([$2], [ +#ifndef $1 + char *p = (char *) $1; +#endif +], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)]) + if test $ac_cv_have_decl_$1 = yes; then + gt_value=1 + else + gt_value=0 + fi + AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value], + [Define to 1 if you have the declaration of `$1', and to 0 if you don't.]) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/config/glibc21.m4 b/config/glibc21.m4 new file mode 100644 index 0000000..9c9f3db --- /dev/null +++ b/config/glibc21.m4 @@ -0,0 +1,32 @@ +# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([jm_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) diff --git a/config/iconv.m4 b/config/iconv.m4 new file mode 100644 index 0000000..c5f3579 --- /dev/null +++ b/config/iconv.m4 @@ -0,0 +1,103 @@ +# iconv.m4 serial AM4 (gettext-0.11.3) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/config/install-sh b/config/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/config/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/intdiv0.m4 b/config/intdiv0.m4 new file mode 100644 index 0000000..55dddcf --- /dev/null +++ b/config/intdiv0.m4 @@ -0,0 +1,72 @@ +# intdiv0.m4 serial 1 (gettext-0.11.3) +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([gt_INTDIV0], +[ + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + + AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], + gt_cv_int_divbyzero_sigfpe, + [ + AC_TRY_RUN([ +#include +#include + +static void +#ifdef __cplusplus +sigfpe_handler (int sig) +#else +sigfpe_handler (sig) int sig; +#endif +{ + /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ + exit (sig != SIGFPE); +} + +int x = 1; +int y = 0; +int z; +int nan; + +int main () +{ + signal (SIGFPE, sigfpe_handler); +/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ +#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) + signal (SIGTRAP, sigfpe_handler); +#endif +/* Linux/SPARC yields signal SIGILL. */ +#if defined (__sparc__) && defined (__linux__) + signal (SIGILL, sigfpe_handler); +#endif + + z = x / y; + nan = y / y; + exit (1); +} +], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, + [ + # Guess based on the CPU. + case "$host_cpu" in + alpha* | i[34567]86 | m68k | s390*) + gt_cv_int_divbyzero_sigfpe="guessing yes";; + *) + gt_cv_int_divbyzero_sigfpe="guessing no";; + esac + ]) + ]) + case "$gt_cv_int_divbyzero_sigfpe" in + *yes) value=1;; + *) value=0;; + esac + AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, + [Define if integer division by zero raises signal SIGFPE.]) +]) diff --git a/config/intmax.m4 b/config/intmax.m4 new file mode 100644 index 0000000..dfb08cc --- /dev/null +++ b/config/intmax.m4 @@ -0,0 +1,32 @@ +# intmax.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether the system has the 'intmax_t' type, but don't attempt to +dnl find a replacement if it is lacking. + +AC_DEFUN([gt_TYPE_INTMAX_T], +[ + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, + [AC_TRY_COMPILE([ +#include +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#endif +], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)]) + if test $gt_cv_c_intmax_t = yes; then + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + fi +]) diff --git a/config/inttypes-pri.m4 b/config/inttypes-pri.m4 new file mode 100644 index 0000000..fd007c3 --- /dev/null +++ b/config/inttypes-pri.m4 @@ -0,0 +1,32 @@ +# inttypes-pri.m4 serial 1 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +# Define PRI_MACROS_BROKEN if exists and defines the PRI* +# macros to non-string values. This is the case on AIX 4.3.3. + +AC_DEFUN([gt_INTTYPES_PRI], +[ + AC_REQUIRE([gt_HEADER_INTTYPES_H]) + if test $gt_cv_header_inttypes_h = yes; then + AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], + gt_cv_inttypes_pri_broken, + [ + AC_TRY_COMPILE([#include +#ifdef PRId32 +char *p = PRId32; +#endif +], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) + ]) + fi + if test "$gt_cv_inttypes_pri_broken" = yes; then + AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, + [Define if exists and defines unusable PRI* macros.]) + fi +]) diff --git a/config/inttypes.m4 b/config/inttypes.m4 new file mode 100644 index 0000000..ab370ff --- /dev/null +++ b/config/inttypes.m4 @@ -0,0 +1,27 @@ +# inttypes.m4 serial 1 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H if exists and doesn't clash with +# . + +AC_DEFUN([gt_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h, + [ + AC_TRY_COMPILE( + [#include +#include ], + [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no) + ]) + if test $gt_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, + [Define if exists and doesn't clash with .]) + fi +]) diff --git a/config/inttypes_h.m4 b/config/inttypes_h.m4 new file mode 100644 index 0000000..f342eba --- /dev/null +++ b/config/inttypes_h.m4 @@ -0,0 +1,28 @@ +# inttypes_h.m4 serial 5 (gettext-0.12) +dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_inttypes_h=yes, + jm_ac_cv_header_inttypes_h=no)]) + if test $jm_ac_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/config/isc-posix.m4 b/config/isc-posix.m4 new file mode 100644 index 0000000..1319dd1 --- /dev/null +++ b/config/isc-posix.m4 @@ -0,0 +1,26 @@ +# isc-posix.m4 serial 2 (gettext-0.11.2) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# This file is not needed with autoconf-2.53 and newer. Remove it in 2005. + +# This test replaces the one in autoconf. +# Currently this macro should have the same name as the autoconf macro +# because gettext's gettext.m4 (distributed in the automake package) +# still uses it. Otherwise, the use in gettext.m4 makes autoheader +# give these diagnostics: +# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX +# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX + +undefine([AC_ISC_POSIX]) + +AC_DEFUN([AC_ISC_POSIX], + [ + dnl This test replaces the obsolescent AC_ISC_POSIX kludge. + AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) + ] +) diff --git a/config/lcmessage.m4 b/config/lcmessage.m4 new file mode 100644 index 0000000..ffd4008 --- /dev/null +++ b/config/lcmessage.m4 @@ -0,0 +1,32 @@ +# lcmessage.m4 serial 3 (gettext-0.11.3) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995. + +# Check whether LC_MESSAGES is available in . + +AC_DEFUN([AM_LC_MESSAGES], +[ + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi +]) diff --git a/config/lib-ld.m4 b/config/lib-ld.m4 new file mode 100644 index 0000000..38aeaec --- /dev/null +++ b/config/lib-ld.m4 @@ -0,0 +1,112 @@ +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/config/lib-link.m4 b/config/lib-link.m4 new file mode 100644 index 0000000..eeb200d --- /dev/null +++ b/config/lib-link.m4 @@ -0,0 +1,551 @@ +# lib-link.m4 serial 4 (gettext-0.12) +dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) diff --git a/config/lib-prefix.m4 b/config/lib-prefix.m4 new file mode 100644 index 0000000..8aff5a9 --- /dev/null +++ b/config/lib-prefix.m4 @@ -0,0 +1,155 @@ +# lib-prefix.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) diff --git a/config/longdouble.m4 b/config/longdouble.m4 new file mode 100644 index 0000000..1333d2f --- /dev/null +++ b/config/longdouble.m4 @@ -0,0 +1,30 @@ +# longdouble.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether the compiler supports the 'long double' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_LONGDOUBLE], +[ + AC_CACHE_CHECK([for long double], gt_cv_c_long_double, + [if test "$GCC" = yes; then + gt_cv_c_long_double=yes + else + AC_TRY_COMPILE([ + /* The Stardent Vistra knows sizeof(long double), but does not support it. */ + long double foo = 0.0; + /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ + int array [2*(sizeof(long double) >= sizeof(double)) - 1]; + ], , + gt_cv_c_long_double=yes, gt_cv_c_long_double=no) + fi]) + if test $gt_cv_c_long_double = yes; then + AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.]) + fi +]) diff --git a/config/longlong.m4 b/config/longlong.m4 new file mode 100644 index 0000000..d7d7350 --- /dev/null +++ b/config/longlong.m4 @@ -0,0 +1,25 @@ +# longlong.m4 serial 4 +dnl Copyright (C) 1999-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_LONG_LONG if 'long long' works. + +AC_DEFUN([jm_AC_TYPE_LONG_LONG], +[ + AC_CACHE_CHECK([for long long], ac_cv_type_long_long, + [AC_TRY_LINK([long long ll = 1LL; int i = 63;], + [long long llmax = (long long) -1; + return ll << i | ll >> i | llmax / ll | llmax % ll;], + ac_cv_type_long_long=yes, + ac_cv_type_long_long=no)]) + if test $ac_cv_type_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, + [Define if you have the 'long long' type.]) + fi +]) diff --git a/config/mdate-sh b/config/mdate-sh new file mode 100755 index 0000000..e631b22 --- /dev/null +++ b/config/mdate-sh @@ -0,0 +1,205 @@ +#!/bin/sh +# Get modification time of a file or directory and pretty-print it. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005, 2007, 2009 Free +# Software Foundation, Inc. +# written by Ulrich Drepper , June 1995 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case $1 in + '') + echo "$0: No file. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: mdate-sh [--help] [--version] FILE + +Pretty-print the modification time of FILE. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "mdate-sh $scriptversion" + exit $? + ;; +esac + +# Prevent date giving response in another language. +LANG=C +export LANG +LC_ALL=C +export LC_ALL +LC_TIME=C +export LC_TIME + +# GNU ls changes its time format in response to the TIME_STYLE +# variable. Since we cannot assume `unset' works, revert this +# variable to its documented default. +if test "${TIME_STYLE+set}" = set; then + TIME_STYLE=posix-long-iso + export TIME_STYLE +fi + +save_arg1=$1 + +# Find out how to get the extended ls output of a file or directory. +if ls -L /dev/null 1>/dev/null 2>&1; then + ls_command='ls -L -l -d' +else + ls_command='ls -l -d' +fi +# Avoid user/group names that might have spaces, when possible. +if ls -n /dev/null 1>/dev/null 2>&1; then + ls_command="$ls_command -n" +fi + +# A `ls -l' line looks as follows on OS/2. +# drwxrwx--- 0 Aug 11 2001 foo +# This differs from Unix, which adds ownership information. +# drwxrwx--- 2 root root 4096 Aug 11 2001 foo +# +# To find the date, we split the line on spaces and iterate on words +# until we find a month. This cannot work with files whose owner is a +# user named `Jan', or `Feb', etc. However, it's unlikely that `/' +# will be owned by a user whose name is a month. So we first look at +# the extended ls output of the root directory to decide how many +# words should be skipped to get the date. + +# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. +set x`$ls_command /` + +# Find which argument is the month. +month= +command= +until test $month +do + shift + # Add another shift to the command. + command="$command shift;" + case $1 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; + esac +done + +# Get the extended ls output of the file or directory. +set dummy x`eval "$ls_command \"\$save_arg1\""` + +# Remove all preceding arguments +eval $command + +# Because of the dummy argument above, month is in $2. +# +# On a POSIX system, we should have +# +# $# = 5 +# $1 = file size +# $2 = month +# $3 = day +# $4 = year or time +# $5 = filename +# +# On Darwin 7.7.0 and 7.6.0, we have +# +# $# = 4 +# $1 = day +# $2 = month +# $3 = year or time +# $4 = filename + +# Get the month. +case $2 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; +esac + +case $3 in + ???*) day=$1;; + *) day=$3; shift;; +esac + +# Here we have to deal with the problem that the ls output gives either +# the time of day or the year. +case $3 in + *:*) set `date`; eval year=\$$# + case $2 in + Jan) nummonthtod=1;; + Feb) nummonthtod=2;; + Mar) nummonthtod=3;; + Apr) nummonthtod=4;; + May) nummonthtod=5;; + Jun) nummonthtod=6;; + Jul) nummonthtod=7;; + Aug) nummonthtod=8;; + Sep) nummonthtod=9;; + Oct) nummonthtod=10;; + Nov) nummonthtod=11;; + Dec) nummonthtod=12;; + esac + # For the first six month of the year the time notation can also + # be used for files modified in the last year. + if (expr $nummonth \> $nummonthtod) > /dev/null; + then + year=`expr $year - 1` + fi;; + *) year=$3;; +esac + +# The result. +echo $day $month $year + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/missing b/config/missing new file mode 100755 index 0000000..28055d2 --- /dev/null +++ b/config/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config/mkinstalldirs b/config/mkinstalldirs new file mode 100755 index 0000000..d2d5f21 --- /dev/null +++ b/config/mkinstalldirs @@ -0,0 +1,111 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" 1>&2 + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +case $dirmode in + '') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi + ;; + *) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# End: +# mkinstalldirs ends here diff --git a/config/nls.m4 b/config/nls.m4 new file mode 100644 index 0000000..36bc493 --- /dev/null +++ b/config/nls.m4 @@ -0,0 +1,49 @@ +# nls.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_DEFUN([AM_NLS], +[ + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) +]) + +AC_DEFUN([AM_MKINSTALLDIRS], +[ + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate it. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + case "$ac_aux_dir" in + /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; + *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; + esac + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) +]) diff --git a/config/po.m4 b/config/po.m4 new file mode 100644 index 0000000..e161998 --- /dev/null +++ b/config/po.m4 @@ -0,0 +1,426 @@ +# po.m4 serial 3 (gettext-0.14) +dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +dnl Checks for all prerequisites of the po subdirectory. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AM_NLS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Search for GNU xgettext 0.12 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + AC_MSG_RESULT( + [found $GMSGFMT program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + fi + + AC_OUTPUT_COMMANDS([ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + +dnl Postprocesses a Makefile in a directory containing PO files. +AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], +[ + # When this code is run, in config.status, two variables have already been + # set: + # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, + # - LINGUAS is the value of the environment variable LINGUAS at configure + # time. + +changequote(,)dnl + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + # Find a way to echo strings without interpreting backslash. + if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='echo' + else + if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='printf %s\n' + else + echo_func () { + cat < "$ac_file.tmp" + if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + cat >> "$ac_file.tmp" < /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/_/-/g'` + cat >> "$ac_file.tmp" <> "$ac_file.tmp" < +#include +/* The string "%2$d %1$d", with dollar characters protected from the shell's + dollar expansion (possibly an autoconf bug). */ +static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; +static char buf[100]; +int main () +{ + sprintf (buf, format, 33, 55); + return (strcmp (buf, "55 33") != 0); +}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no, + [ + AC_EGREP_CPP(notposix, [ +#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ + notposix +#endif + ], gt_cv_func_printf_posix="guessing no", + gt_cv_func_printf_posix="guessing yes") + ]) + ]) + case $gt_cv_func_printf_posix in + *yes) + AC_DEFINE(HAVE_POSIX_PRINTF, 1, + [Define if your printf() function supports format strings with positions.]) + ;; + esac +]) diff --git a/config/progtest.m4 b/config/progtest.m4 new file mode 100644 index 0000000..8fe527c --- /dev/null +++ b/config/progtest.m4 @@ -0,0 +1,91 @@ +# progtest.m4 serial 3 (gettext-0.12) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1996. + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[ +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + [[\\/]]* | ?:[[\\/]]*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in ifelse([$5], , $PATH, [$5]); do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/config/signed.m4 b/config/signed.m4 new file mode 100644 index 0000000..dc1f54f --- /dev/null +++ b/config/signed.m4 @@ -0,0 +1,19 @@ +# signed.m4 serial 1 (gettext-0.10.40) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([bh_C_SIGNED], +[ + AC_CACHE_CHECK([for signed], bh_cv_c_signed, + [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)]) + if test $bh_cv_c_signed = no; then + AC_DEFINE(signed, , + [Define to empty if the C compiler doesn't support this keyword.]) + fi +]) diff --git a/config/size_max.m4 b/config/size_max.m4 new file mode 100644 index 0000000..5762fc3 --- /dev/null +++ b/config/size_max.m4 @@ -0,0 +1,61 @@ +# size_max.m4 serial 2 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([gl_SIZE_MAX], +[ + AC_CHECK_HEADERS(stdint.h) + dnl First test whether the system already has SIZE_MAX. + AC_MSG_CHECKING([for SIZE_MAX]) + result= + AC_EGREP_CPP([Found it], [ +#include +#if HAVE_STDINT_H +#include +#endif +#ifdef SIZE_MAX +Found it +#endif +], result=yes) + if test -z "$result"; then + dnl Define it ourselves. Here we assume that the type 'size_t' is not wider + dnl than the type 'unsigned long'. + dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr', + dnl which is guaranteed to work from LONG_MIN to LONG_MAX. + _AC_COMPUTE_INT([~(size_t)0 / 10], res_hi, + [#include ], result=?) + _AC_COMPUTE_INT([~(size_t)0 % 10], res_lo, + [#include ], result=?) + _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint, + [#include ], result=?) + if test "$fits_in_uint" = 1; then + dnl Even though SIZE_MAX fits in an unsigned int, it must be of type + dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. + AC_TRY_COMPILE([#include + extern size_t foo; + extern unsigned long foo; + ], [], fits_in_uint=0) + fi + if test -z "$result"; then + if test "$fits_in_uint" = 1; then + result="$res_hi$res_lo"U + else + result="$res_hi$res_lo"UL + fi + else + dnl Shouldn't happen, but who knows... + result='~(size_t)0' + fi + fi + AC_MSG_RESULT([$result]) + if test "$result" != yes; then + AC_DEFINE_UNQUOTED([SIZE_MAX], [$result], + [Define as the maximum value of type 'size_t', if the system doesn't define it.]) + fi +]) diff --git a/config/stdint_h.m4 b/config/stdint_h.m4 new file mode 100644 index 0000000..32ba7ae --- /dev/null +++ b/config/stdint_h.m4 @@ -0,0 +1,28 @@ +# stdint_h.m4 serial 3 (gettext-0.12) +dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_STDINT_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_stdint_h=yes, + jm_ac_cv_header_stdint_h=no)]) + if test $jm_ac_cv_header_stdint_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/config/texinfo.tex b/config/texinfo.tex new file mode 100644 index 0000000..bab1b33 --- /dev/null +++ b/config/texinfo.tex @@ -0,0 +1,9386 @@ +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2010-06-17.11} +% +% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +% 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +% +% This texinfo.tex file 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 texinfo.tex file 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 . +% +% As a special exception, when this file is read by TeX when processing +% a Texinfo source document, you may use the result without +% restriction. (This has been our intent since Texinfo was invented.) +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or +% ftp://tug.org/tex/texinfo.tex +% (and all CTAN mirrors, see http://www.ctan.org). +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + +\chardef\other=12 + +% We never want plain's \outer definition of \+ in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +% Save some plain tex macros whose names we will redefine. +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv=\equiv +\let\ptexexclam=\! +\let\ptexfootnote=\footnote +\let\ptexgtr=> +\let\ptexhat=^ +\let\ptexi=\i +\let\ptexindent=\indent +\let\ptexinsert=\insert +\let\ptexlbrace=\{ +\let\ptexless=< +\let\ptexnewwrite\newwrite +\let\ptexnoindent=\noindent +\let\ptexplus=+ +\let\ptexraggedright=\raggedright +\let\ptexrbrace=\} +\let\ptexslash=\/ +\let\ptexstar=\* +\let\ptext=\t +\let\ptextop=\top +{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Pre-3.0. +\else + \def\linenumber{l.\the\inputlineno:\space} +\fi + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi + +% Since the category of space is not known, we have to be careful. +\chardef\spacecat = 10 +\def\spaceisspace{\catcode`\ =\spacecat} + +% sometimes characters are active, so we need control sequences. +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dashChar = `\- +\chardef\dotChar = `\. +\chardef\exclamChar= `\! +\chardef\lquoteChar= `\` +\chardef\questChar = `\? +\chardef\rquoteChar= `\' +\chardef\semiChar = `\; +\chardef\underChar = `\_ + +% Ignore a token. +% +\def\gobble#1{} + +% The following is used inside several \edef's. +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} + +% Hyphenation fixes. +\hyphenation{ + Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script + ap-pen-dix bit-map bit-maps + data-base data-bases eshell fall-ing half-way long-est man-u-script + man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm + par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces + spell-ing spell-ings + stand-alone strong-est time-stamp time-stamps which-ever white-space + wide-spread wrap-around +} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt } + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\undefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines16 +}% + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Output a mark which sets \thischapter, \thissection and \thiscolor. +% We dump everything together because we only have one kind of mark. +% This works because we only use \botmark / \topmark, not \firstmark. +% +% A mark contains a subexpression of the \ifcase ... \fi construct. +% \get*marks macros below extract the needed part using \ifcase. +% +% Another complication is to let the user choose whether \thischapter +% (\thissection) refers to the chapter (section) in effect at the top +% of a page, or that at the bottom of a page. The solution is +% described on page 260 of The TeXbook. It involves outputting two +% marks for the sectioning macros, one before the section break, and +% one after. I won't pretend I can describe this better than DEK... +\def\domark{% + \toks0=\expandafter{\lastchapterdefs}% + \toks2=\expandafter{\lastsectiondefs}% + \toks4=\expandafter{\prevchapterdefs}% + \toks6=\expandafter{\prevsectiondefs}% + \toks8=\expandafter{\lastcolordefs}% + \mark{% + \the\toks0 \the\toks2 + \noexpand\or \the\toks4 \the\toks6 + \noexpand\else \the\toks8 + }% +} +% \topmark doesn't work for the very first chapter (after the title +% page or the contents), so we use \firstmark there -- this gets us +% the mark with the chapter defs, unless the user sneaks in, e.g., +% @setcolor (or @url, or @link, etc.) between @contents and the very +% first @chapter. +\def\gettopheadingmarks{% + \ifcase0\topmark\fi + \ifx\thischapter\empty \ifcase0\firstmark\fi \fi +} +\def\getbottomheadingmarks{\ifcase1\botmark\fi} +\def\getcolormarks{\ifcase2\topmark\fi} + +% Avoid "undefined control sequence" errors. +\def\lastchapterdefs{} +\def\lastsectiondefs{} +\def\prevchapterdefs{} +\def\prevsectiondefs{} +\def\lastcolordefs{} + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + % We don't want .vr (or whatever) entries like this: + % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} + % "\acronym" won't work when it's read back in; + % it needs to be + % {\code {{\tt \backslashcurfont }acronym} + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingyyy.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 24pt + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \indexdummies + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1\relax \unvbox#1\relax +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg{\parseargusing{}} +\def\parseargusing#1#2{% + \def\argtorun{#2}% + \begingroup + \obeylines + \spaceisspace + #1% + \parseargline\empty% Insert the \empty token, see \finishparsearg below. +} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + \argremovecomment #1\comment\ArgTerm% + }% +} + +% First remove any @comment, then any @c comment. +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} + +% Each occurrence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., +% @end itemize @c foo +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm +} + +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \argtorun. +% (Similarly, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. +% +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} + +% \parseargdef\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +% +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my +% favourite TeX trick. --kasal, 16nov03 + +\def\parseargdef#1{% + \expandafter \doparseargdef \csname\string#1\endcsname #1% +} +\def\doparseargdef#1#2{% + \def#2{\parsearg#1}% + \def#1##1% +} + +% Several utility definitions with active space: +{ + \obeyspaces + \gdef\obeyedspace{ } + + % Make each space character in the input produce a normal interword + % space in the output. Don't allow a line break at this space, as this + % is used only in environments like @example, where each line of input + % should produce a line of output anyway. + % + \gdef\sepspaces{\obeyspaces\let =\tie} + + % If an index command is used in an @example environment, any spaces + % therein should become regular spaces in the raw index file, not the + % expansion of \tie (\leavevmode \penalty \@M \ ). + \gdef\unsepspaces{\let =\space} +} + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +% Define the framework for environments in texinfo.tex. It's used like this: +% +% \envdef\foo{...} +% \def\Efoo{...} +% +% It's the responsibility of \envdef to insert \begingroup before the +% actual body; @end closes the group after calling \Efoo. \envdef also +% defines \thisenv, so the current environment is known; @end checks +% whether the environment name matches. The \checkenv macro can also be +% used to check whether the current environment is the one expected. +% +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they +% are not treated as environments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At run-time, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} + +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp + \else + \badenverr + \fi +} + +% Environment mismatch, #1 expected: +\def\badenverr{% + \errhelp = \EMsimple + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + out of any environment% + \else + in environment \expandafter\string#1% + \fi +} + +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv +% +\parseargdef\end{% + \if 1\csname iscond.#1\endcsname + \else + % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 + \expandafter\checkenv\csname#1\endcsname + \csname E#1\endcsname + \endgroup + \fi +} + +\newhelp\EMsimple{Press RETURN to continue.} + + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @/ allows a line break. +\let\/=\allowbreak + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=\endofsentencespacefactor\space} + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=\endofsentencespacefactor\space} + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=\endofsentencespacefactor\space} + +% @frenchspacing on|off says whether to put extra space after punctuation. +% +\def\onword{on} +\def\offword{off} +% +\parseargdef\frenchspacing{% + \def\temp{#1}% + \ifx\temp\onword \plainfrenchspacing + \else\ifx\temp\offword \plainnonfrenchspacing + \else + \errhelp = \EMsimple + \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% + \fi\fi +} + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\envdef\group{% + \ifnum\catcode`\^^M=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + \startsavinginserts + % + \setbox\groupbox = \vtop\bgroup + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% The \vtop produces a box with normal height and large depth; thus, TeX puts +% \baselineskip glue before it, and (when the next line of text is done) +% \lineskip glue after it. Thus, space below is not quite equal to space +% above. But it's pretty close. +\def\Egroup{% + % To get correct interline space between the last line of the group + % and the first line afterwards, we have to propagate \prevdepth. + \endgraf % Not \par, as it may have been set to \lisppar. + \global\dimen1 = \prevdepth + \egroup % End the \vtop. + % \dimen0 is the vertical size of the group's box. + \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \box\groupbox + \prevdepth = \dimen1 + \checkinserts +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +% Old definition--didn't work. +%\parseargdef\need{\par % +%% This method tries to make TeX break the page naturally +%% if the depth of the box does not fit. +%{\baselineskip=0pt% +%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak +%\prevdepth=-1000pt +%}} + +\parseargdef\need{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break (and is undocumented). + +\let\br = \par + +% @page forces the start of a new page. +% +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} + +% This defn is used inside nofill environments such as @example. +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. Not documented, written for gawk manual. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). This command +% is not documented, not supported, and doesn't work. +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% @include FILE -- \input text of FILE. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable % we want to expand any @value in FILE. + \turnoffactive % and allow special characters in the expansion + \indexnofonts % Allow `@@' and other weird things in file names. + \edef\temp{\noexpand\input #1 }% + % + % This trickery is to read FILE outside of a group, in case it makes + % definitions, etc. + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other + \catcode`\`=\other + \catcode`\'=\other +} + +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} + +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} + +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\next\centerH + \else + \let\next\centerV + \fi + \next{\hfil \ignorespaces#1\unskip \hfil}% +} +\def\centerH#1{% + {% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break + }% +} +\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} + +% @sp n outputs n lines of vertical space + +\parseargdef\sp{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\begingroup \catcode`\^^M=\other% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\commentxxx} +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} + +\let\c=\comment + +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% NCHARS can also be the word `asis' or `none'. +% We cannot feasibly implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\parseargdef\paragraphindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent = 0pt + \else + \defaultparindent = #1em + \fi + \fi + \parindent = \defaultparindent +} + +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\parseargdef\exampleindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @firstparagraphindent WORD +% If WORD is `none', then suppress indentation of the first paragraph +% after a section heading. If WORD is `insert', then do indent at such +% paragraphs. +% +% The paragraph indentation is suppressed or not by calling +% \suppressfirstparagraphindent, which the sectioning commands do. +% We switch the definition of this back and forth according to WORD. +% By default, we suppress indentation. +% +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} +\def\insertword{insert} +% +\parseargdef\firstparagraphindent{% + \def\temp{#1}% + \ifx\temp\noneword + \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent + \else\ifx\temp\insertword + \let\suppressfirstparagraphindent = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @firstparagraphindent option `\temp'}% + \fi\fi +} + +% Here is how we actually suppress indentation. Redefine \everypar to +% \kern backwards by \parindent, and then reset itself to empty. +% +% We also make \indent itself not actually do anything until the next +% paragraph. +% +\gdef\dosuppressfirstparagraphindent{% + \gdef\indent{% + \restorefirstparagraphindent + \indent + }% + \gdef\noindent{% + \restorefirstparagraphindent + \noindent + }% + \global\everypar = {% + \kern -\parindent + \restorefirstparagraphindent + }% +} + +\gdef\restorefirstparagraphindent{% + \global \let \indent = \ptexindent + \global \let \noindent = \ptexnoindent + \global \everypar = {}% +} + + +% @refill is a no-op. +\let\refill=\relax + +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi % \openindices needs to do some work in any case. + \openindices + \let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + \openin 1 texinfo.cnf + \ifeof 1 \else \input texinfo.cnf \fi + \closein 1 + % + \comment % Ignore the actual filename. +} + +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + + +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 +% can be set). So we test for \relax and 0 as well as \undefined, +% borrowed from ifpdf.sty. +\ifx\pdfoutput\undefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi + +% PDF uses PostScript string constants for the names of xref targets, +% for display in the outlines, and in other places. Thus, we have to +% double any backslashes. Otherwise, a name like "\node" will be +% interpreted as a newline (\n), followed by o, d, e. Not good. +% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html +% (and related messages, the final outcome is that it is up to the TeX +% user to double the backslashes and otherwise make the string valid, so +% that's what we do). + +% double active backslashes. +% +{\catcode`\@=0 \catcode`\\=\active + @gdef@activebackslashdouble{% + @catcode`@\=@active + @let\=@doublebackslash} +} + +% To handle parens, we must adopt a different approach, since parens are +% not active characters. hyperref.dtx (which has the same problem as +% us) handles it with this amazing macro to replace tokens, with minor +% changes for Texinfo. It is included here under the GPL by permission +% from the author, Heiko Oberdiek. +% +% #1 is the tokens to replace. +% #2 is the replacement. +% #3 is the control sequence with the string. +% +\def\HyPsdSubst#1#2#3{% + \def\HyPsdReplace##1#1##2\END{% + ##1% + \ifx\\##2\\% + \else + #2% + \HyReturnAfterFi{% + \HyPsdReplace##2\END + }% + \fi + }% + \xdef#3{\expandafter\HyPsdReplace#3#1\END}% +} +\long\def\HyReturnAfterFi#1\fi{\fi#1} + +% #1 is a control sequence in which to do the replacements. +\def\backslashparens#1{% + \xdef#1{#1}% redefine it as its expansion; the definition is simply + % \lastnode when called from \setref -> \pdfmkdest. + \HyPsdSubst{(}{\realbackslash(}{#1}% + \HyPsdSubst{)}{\realbackslash)}{#1}% +} + +\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images +with PDF output, and none of those formats could be found. (.eps cannot +be supported due to the design of the PDF format; use regular TeX (DVI +output) for that.)} + +\ifpdf + % + % Color manipulation macros based on pdfcolor.tex, + % except using rgb instead of cmyk; the latter is said to render as a + % very dark gray on-screen and a very dark halftone in print, instead + % of actual black. + \def\rgbDarkRed{0.50 0.09 0.12} + \def\rgbBlack{0 0 0} + % + % k sets the color for filling (usual text, etc.); + % K sets the color for stroking (thin rules, e.g., normal _'s). + \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} + % + % Set color, and create a mark which defines \thiscolor accordingly, + % so that \makeheadline knows which color to restore. + \def\setcolor#1{% + \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% + \domark + \pdfsetcolor{#1}% + } + % + \def\maincolor{\rgbBlack} + \pdfsetcolor{\maincolor} + \edef\thiscolor{\maincolor} + \def\lastcolordefs{} + % + \def\makefootline{% + \baselineskip24pt + \line{\pdfsetcolor{\maincolor}\the\footline}% + } + % + \def\makeheadline{% + \vbox to 0pt{% + \vskip-22.5pt + \line{% + \vbox to8.5pt{}% + % Extract \thiscolor definition from the marks. + \getcolormarks + % Typeset the headline with \maincolor, then restore the color. + \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% + }% + \vss + }% + \nointerlineskip + } + % + % + \pdfcatalog{/PageMode /UseOutlines} + % + % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). + \def\dopdfimage#1#2#3{% + \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% + \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% + % + % pdftex (and the PDF format) support .png, .jpg, .pdf (among + % others). Let's try in that order. + \let\pdfimgext=\empty + \begingroup + \openin 1 #1.png \ifeof 1 + \openin 1 #1.jpg \ifeof 1 + \openin 1 #1.jpeg \ifeof 1 + \openin 1 #1.JPG \ifeof 1 + \openin 1 #1.pdf \ifeof 1 + \openin 1 #1.PDF \ifeof 1 + \errhelp = \nopdfimagehelp + \errmessage{Could not find image file #1 for pdf}% + \else \gdef\pdfimgext{PDF}% + \fi + \else \gdef\pdfimgext{pdf}% + \fi + \else \gdef\pdfimgext{JPG}% + \fi + \else \gdef\pdfimgext{jpeg}% + \fi + \else \gdef\pdfimgext{jpg}% + \fi + \else \gdef\pdfimgext{png}% + \fi + \closein 1 + \endgroup + % + % without \immediate, ancient pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifdim \wd0 >0pt width \imagewidth \fi + \ifdim \wd2 >0pt height \imageheight \fi + \ifnum\pdftexversion<13 + #1.\pdfimgext + \else + {#1.\pdfimgext}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + % + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code, and characters + % such as \, aren't expanded when present in a section title. + \indexnofonts + \turnoffactive + \activebackslashdouble + \makevalueexpandable + \def\pdfdestname{#1}% + \backslashparens\pdfdestname + \safewhatsit{\pdfdest name{\pdfdestname} xyz}% + }} + % + % used to mark target names; must be expandable. + \def\pdfmkpgn#1{#1} + % + % by default, use a color that is dark enough to print on paper as + % nearly black, but still distinguishable for online viewing. + \def\urlcolor{\rgbDarkRed} + \def\linkcolor{\rgbDarkRed} + \def\endlink{\setcolor{\maincolor}\pdfendlink} + % + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text, which is what will be displayed in the + % outline by the pdf viewer. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node text, + % which might be empty if this toc entry had no corresponding node. + % #4 is the page number + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worth the trouble, since most documents are normally structured. + \def\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty + \def\pdfoutlinedest{#4}% + \else + % Doubled backslashes in the name. + {\activebackslashdouble \xdef\pdfoutlinedest{#3}% + \backslashparens\pdfoutlinedest}% + \fi + % + % Also double the backslashes in the display string. + {\activebackslashdouble \xdef\pdfoutlinetext{#1}% + \backslashparens\pdfoutlinetext}% + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Thanh's hack / proper braces in bookmarks + \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace + \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace + % + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\partentry##1##2##3##4{}% ignore parts in the outlines + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \def\thissubsecnum{0}% + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \def\thischapnum{0}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \readdatafile{toc}% + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc above. + % + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + % + % xx to do this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Right + % now, I guess we'll just let the pdf reader have its way. + \indexnofonts + \setupdatafile + \catcode`\\=\active \otherbackslash + \input \tocreadfilename + \endgroup + } + % + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \ifx\p\space\else\addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \fi + \nextsp} + \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + % make a live url in pdf output. + \def\pdfurl#1{% + \begingroup + % it seems we really need yet another set of dummies; have not + % tried to figure out what each command should do in the context + % of @url. for now, just make @/ a no-op, that's the only one + % people have actually reported a problem with. + % + \normalturnoffactive + \def\@{@}% + \let\/=\empty + \makevalueexpandable + % do we want to go so far as to use \indexnofonts instead of just + % special-casing \var here? + \def\var##1{##1}% + % + \leavevmode\setcolor{\urlcolor}% + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \setcolor{\linkcolor}#1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + % non-pdf mode + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\setcolor = \gobble + \let\pdfsetcolor = \gobble + \let\pdfmakeoutlines = \relax +\fi % \ifx\pdfoutput + + +\message{fonts,} + +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +% +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Unfortunately, we have to override this for titles and the like, since +% in those cases "rm" is bold. Sigh. +\def\rmisbold{\rm\def\curfontstyle{bf}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} + + +% Default leading. +\newdimen\textleading \textleading = 13.2pt + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +% can get a sort of poor man's double spacing by redefining this. +\def\baselinefactor{1} +% +\def\setleading#1{% + \dimen0 = #1\relax + \normalbaselineskip = \baselinefactor\dimen0 + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% PDF CMaps. See also LaTeX's t1.cmap. +% +% do nothing with this by default. +\expandafter\let\csname cmapOT1\endcsname\gobble +\expandafter\let\csname cmapOT1IT\endcsname\gobble +\expandafter\let\csname cmapOT1TT\endcsname\gobble + +% if we are producing pdf, and we have \pdffontattr, then define cmaps. +% (\pdffontattr was introduced many years ago, but people still run +% older pdftex's; it's easy to conditionalize, so we do.) +\ifpdf \ifx\pdffontattr\undefined \else + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1-0) +%%Title: (TeX-OT1-0 TeX OT1 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1) +/Supplement 0 +>> def +/CMapName /TeX-OT1-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<23> <26> <0023> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +40 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1IT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1IT-0) +%%Title: (TeX-OT1IT-0 TeX OT1IT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1IT) +/Supplement 0 +>> def +/CMapName /TeX-OT1IT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<25> <26> <0025> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +42 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<23> <0023> +<24> <00A3> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1IT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1TT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1TT-0) +%%Title: (TeX-OT1TT-0 TeX OT1TT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1TT) +/Supplement 0 +>> def +/CMapName /TeX-OT1TT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +5 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<21> <26> <0021> +<28> <5F> <0028> +<61> <7E> <0061> +endbfrange +32 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <2191> +<0C> <2193> +<0D> <0027> +<0E> <00A1> +<0F> <00BF> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<20> <2423> +<27> <2019> +<60> <2018> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1TT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +\fi\fi + + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor, #5 is the CMap +% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass +% empty to omit). +\def\setfont#1#2#3#4#5{% + \font#1=\fontprefix#2#3 scaled #4 + \csname cmap#5\endcsname#1% +} +% This is what gets called when #5 of \setfont is empty. +\let\cmap\gobble +% emacs-page end of cmaps + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +% Definitions for a main text size of 11pt. This is the default in +% Texinfo. +% +\def\definetextfontsizexi{% +% Text fonts (11.2pt, magstep1). +\def\textnominalsize{11pt} +\edef\mainmagstep{\magstephalf} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1095} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1}{OT1} +\setfont\deftt\ttshape{10}{\magstep1}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter (and unnumbered) fonts (17.28pt). +\def\chapnominalsize{17pt} +\setfont\chaprm\rmbshape{12}{\magstep2}{OT1} +\setfont\chapit\itbshape{10}{\magstep3}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep3}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} +\setfont\chapsf\sfbshape{17}{1000}{OT1} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3}{OT1} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 +\def\chapecsize{1728} + +% Section fonts (14.4pt). +\def\secnominalsize{14pt} +\setfont\secrm\rmbshape{12}{\magstep1}{OT1} +\setfont\secit\itbshape{10}{\magstep2}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep2}{OT1} +\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\secsf\sfbshape{12}{\magstep1}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2}{OT1} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 +\def\sececsize{1440} + +% Subsection fonts (13.15pt). +\def\ssecnominalsize{13pt} +\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} +\setfont\ssecit\itbshape{10}{1315}{OT1IT} +\setfont\ssecsl\slbshape{10}{1315}{OT1} +\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} +\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315}{OT1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +\def\ssececsize{1200} + +% Reduced fonts for @acro in text (10pt). +\def\reducednominalsize{10pt} +\setfont\reducedrm\rmshape{10}{1000}{OT1} +\setfont\reducedtt\ttshape{10}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{1000}{OT1} +\setfont\reducedit\itshape{10}{1000}{OT1IT} +\setfont\reducedsl\slshape{10}{1000}{OT1} +\setfont\reducedsf\sfshape{10}{1000}{OT1} +\setfont\reducedsc\scshape{10}{1000}{OT1} +\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} +\font\reducedi=cmmi10 +\font\reducedsy=cmsy10 +\def\reducedecsize{1000} + +\textleading = 13.2pt % line spacing for 11pt CM +\textfonts % reset the current fonts +\rm +} % end of 11pt text font size definitions + + +% Definitions to make the main text be 10pt Computer Modern, with +% section, chapter, etc., sizes following suit. This is for the GNU +% Press printing of the Emacs 22 manual. Maybe other manuals in the +% future. Used with @smallbook, which sets the leading to 12pt. +% +\def\definetextfontsizex{% +% Text fonts (10pt). +\def\textnominalsize{10pt} +\edef\mainmagstep{1000} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1000} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstephalf}{OT1} +\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter fonts (14.4pt). +\def\chapnominalsize{14pt} +\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} +\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep2}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} +\let\chapbf\chaprm +\setfont\chapsc\scbshape{10}{\magstep2}{OT1} +\font\chapi=cmmi12 scaled \magstep1 +\font\chapsy=cmsy10 scaled \magstep2 +\def\chapecsize{1440} + +% Section fonts (12pt). +\def\secnominalsize{12pt} +\setfont\secrm\rmbshape{12}{1000}{OT1} +\setfont\secit\itbshape{10}{\magstep1}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep1}{OT1} +\setfont\sectt\ttbshape{12}{1000}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} +\setfont\secsf\sfbshape{12}{1000}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep1}{OT1} +\font\seci=cmmi12 +\font\secsy=cmsy10 scaled \magstep1 +\def\sececsize{1200} + +% Subsection fonts (10pt). +\def\ssecnominalsize{10pt} +\setfont\ssecrm\rmbshape{10}{1000}{OT1} +\setfont\ssecit\itbshape{10}{1000}{OT1IT} +\setfont\ssecsl\slbshape{10}{1000}{OT1} +\setfont\ssectt\ttbshape{10}{1000}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} +\setfont\ssecsf\sfbshape{10}{1000}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1000}{OT1} +\font\sseci=cmmi10 +\font\ssecsy=cmsy10 +\def\ssececsize{1000} + +% Reduced fonts for @acro in text (9pt). +\def\reducednominalsize{9pt} +\setfont\reducedrm\rmshape{9}{1000}{OT1} +\setfont\reducedtt\ttshape{9}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{900}{OT1} +\setfont\reducedit\itshape{9}{1000}{OT1IT} +\setfont\reducedsl\slshape{9}{1000}{OT1} +\setfont\reducedsf\sfshape{9}{1000}{OT1} +\setfont\reducedsc\scshape{10}{900}{OT1} +\setfont\reducedttsl\ttslshape{10}{900}{OT1TT} +\font\reducedi=cmmi9 +\font\reducedsy=cmsy9 +\def\reducedecsize{0900} + +\divide\parskip by 2 % reduce space between paragraphs +\textleading = 12pt % line spacing for 10pt CM +\textfonts % reset the current fonts +\rm +} % end of 10pt text font size definitions + + +% We provide the user-level command +% @fonttextsize 10 +% (or 11) to redefine the text font size. pt is assumed. +% +\def\xiword{11} +\def\xword{10} +\def\xwordpt{10pt} +% +\parseargdef\fonttextsize{% + \def\textsizearg{#1}% + \wlog{doing @fonttextsize \textsizearg}% + % + % Set \globaldefs so that documents can use this inside @tex, since + % makeinfo 4.8 does not support it, but we need it nonetheless. + % + \begingroup \globaldefs=1 + \ifx\textsizearg\xword \definetextfontsizex + \else \ifx\textsizearg\xiword \definetextfontsizexi + \else + \errhelp=\EMsimple + \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} + \fi\fi + \endgroup +} + + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy + \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf + \textfont\ttfam=\tentt \textfont\sffam=\tensf +} + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +% +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used in +% the LaTeX logo and acronyms. +% +% This all needs generalizing, badly. +% +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \let\tenttsl=\textttsl + \def\curfontsize{text}% + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \def\curfontsize{title}% + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{27pt}} +\def\titlefont#1{{\titlefonts\rmisbold #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy + \let\tenttsl=\chapttsl + \def\curfontsize{chap}% + \def\lsize{sec}\def\lllsize{text}% + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy + \let\tenttsl=\secttsl + \def\curfontsize{sec}% + \def\lsize{subsec}\def\lllsize{reduced}% + \resetmathfonts \setleading{16pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy + \let\tenttsl=\ssecttsl + \def\curfontsize{ssec}% + \def\lsize{text}\def\lllsize{small}% + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts +\def\reducedfonts{% + \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl + \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc + \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy + \let\tenttsl=\reducedttsl + \def\curfontsize{reduced}% + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \def\curfontsize{small}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \def\curfontsize{smaller}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000}{OT1} +\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 +\setfont\shortcontsl\slshape{12}{1000}{OT1} +\setfont\shortconttt\ttshape{12}{1000}{OT1TT} + +% Define these just so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% --karl, 24jan03. + +% Set up the default fonts, so we can use them for creating boxes. +% +\definetextfontsizexi + + +\message{markup,} + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will +% define and register \INITMACRO to be called on markup style changes. +% \INITMACRO can check \currentmarkupstyle for the innermost +% style and the set of \ifmarkupSTYLE switches for all styles +% currently in effect. +\newif\ifmarkupvar +\newif\ifmarkupsamp +\newif\ifmarkupkey +%\newif\ifmarkupfile % @file == @samp. +%\newif\ifmarkupoption % @option == @samp. +\newif\ifmarkupcode +\newif\ifmarkupkbd +%\newif\ifmarkupenv % @env == @code. +%\newif\ifmarkupcommand % @command == @code. +\newif\ifmarkuptex % @tex (and part of @math, for now). +\newif\ifmarkupexample +\newif\ifmarkupverb +\newif\ifmarkupverbatim + +\let\currentmarkupstyle\empty + +\def\setupmarkupstyle#1{% + \csname markup#1true\endcsname + \def\currentmarkupstyle{#1}% + \markupstylesetup +} + +\let\markupstylesetup\empty + +\def\defmarkupstylesetup#1{% + \expandafter\def\expandafter\markupstylesetup + \expandafter{\markupstylesetup #1}% + \def#1% +} + +% Markup style setup for left and right quotes. +\defmarkupstylesetup\markupsetuplq{% + \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuplqdefault \else \temp \fi +} + +\defmarkupstylesetup\markupsetuprq{% + \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuprqdefault \else \temp \fi +} + +{ +\catcode`\'=\active +\catcode`\`=\active + +\gdef\markupsetuplqdefault{\let`\lq} +\gdef\markupsetuprqdefault{\let'\rq} + +\gdef\markupsetcodequoteleft{\let`\codequoteleft} +\gdef\markupsetcodequoteright{\let'\codequoteright} + +\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} +} + +\let\markupsetuplqcode \markupsetcodequoteleft +\let\markupsetuprqcode \markupsetcodequoteright +% +\let\markupsetuplqexample \markupsetcodequoteleft +\let\markupsetuprqexample \markupsetcodequoteright +% +\let\markupsetuplqsamp \markupsetcodequoteleft +\let\markupsetuprqsamp \markupsetcodequoteright +% +\let\markupsetuplqverb \markupsetcodequoteleft +\let\markupsetuprqverb \markupsetcodequoteright +% +\let\markupsetuplqverbatim \markupsetcodequoteleft +\let\markupsetuprqverbatim \markupsetcodequoteright + +\let\markupsetuplqkbd \markupsetnoligaturesquoteleft + +% Allow an option to not replace quotes with a regular directed right +% quote/apostrophe (char 0x27), but instead use the undirected quote +% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it +% the default, but it works for pasting with more pdf viewers (at least +% evince), the lilypond developers report. xpdf does work with the +% regular 0x27. +% +\def\codequoteright{% + \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax + \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax + '% + \else \char'15 \fi + \else \char'15 \fi +} +% +% and a similar option for the left quote char vs. a grave accent. +% Modern fonts display ASCII 0x60 as a grave accent, so some people like +% the code environments to do likewise. +% +\def\codequoteleft{% + \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax + \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax + % [Knuth] pp. 380,381,391 + % \relax disables Spanish ligatures ?` and !` of \tt font. + \relax`% + \else \char'22 \fi + \else \char'22 \fi +} + +% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. +\def\noligaturesquoteleft{\relax\lq} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Font commands. + +% #1 is the font command (\sl or \it), #2 is the text to slant. +% If we are in a monospaced environment, however, 1) always use \ttsl, +% and 2) do not add an italic correction. +\def\dosmartslant#1#2{% + \ifusingtt + {\ttsl #2\let\next=\relax}% + {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% + \next +} +\def\smartslanted{\dosmartslant\sl} +\def\smartitalic{\dosmartslant\it} + +% Output an italic correction unless \next (presumed to be the following +% character) is such as not to need one. +\def\smartitaliccorrection{% + \ifx\next,% + \else\ifx\next-% + \else\ifx\next.% + \else\ptexslash + \fi\fi\fi} + +% like \smartslanted except unconditionally uses \ttsl, and no ic. +% @var is set to this for defun arguments. +\def\ttslanted#1{{\ttsl #1}} + +% @cite is like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} + +\let\i=\smartitalic +\let\slanted=\smartslanted +\def\var#1{\smartslanted{#1}} +\let\dfn=\smartslanted +\let\emph=\smartitalic + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @b, explicit bold. Also @strong. +\def\b#1{{\bf #1}} +\let\strong=\b + +% @sansserif, explicit sans. +\def\sansserif#1{{\sf #1}} + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\plainfrenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + \def\endofsentencespacefactor{1000}% for @. and friends + } + \def\plainnonfrenchspacing{% + \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 + \def\endofsentencespacefactor{3000}% for @. and friends + } +\catcode`@=\other +\def\endofsentencespacefactor{3000}% default + +% @t, explicit typewriter. +\def\t#1{% + {\tt \rawbackslash \plainfrenchspacing #1}% + \null +} + +% @samp. +\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} + +% definition of @key that produces a lozenge. Doesn't adjust to text size. +%\setfont\keyrm\rmshape{8}{1000}{OT1} +%\font\keysy=cmsy9 +%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% +% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% +% \vbox{\hrule\kern-0.4pt +% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% +% \kern-0.4pt\hrule}% +% \kern-.06em\raise0.4pt\hbox{\angleright}}}} + +% definition of @key with no lozenge. If the current font is already +% monospace, don't change it; that way, we respect @kbdinputstyle. But +% if it isn't monospace, then use \tt. +% +\def\key#1{{\setupmarkupstyle{key}% + \nohyphenation + \ifmonospace\else\tt\fi + #1}\null} + +% ctrl is no longer a Texinfo command. +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @file, @option are the same as @samp. +\let\file=\samp +\let\option=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \plainfrenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in @code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ + \catcode`\-=\active \catcode`\_=\active + \catcode`\'=\active \catcode`\`=\active + \global\let'=\rq \global\let`=\lq % default definitions + % + \global\def\code{\begingroup + \setupmarkupstyle{code}% + % The following should really be moved into \setupmarkupstyle handlers. + \catcode\dashChar=\active \catcode\underChar=\active + \ifallowcodebreaks + \let-\codedash + \let_\codeunder + \else + \let-\realdash + \let_\realunder + \fi + \codex + } +} + +\def\realdash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} +\def\codex #1{\tclose{#1}\endgroup} + +% An additional complication: the above will allow breaks after, e.g., +% each of the four underscores in __typeof__. This is undesirable in +% some manuals, especially if they don't have long identifiers in +% general. @allowcodebreaks provides a way to control this. +% +\newif\ifallowcodebreaks \allowcodebreakstrue + +\def\keywordtrue{true} +\def\keywordfalse{false} + +\parseargdef\allowcodebreaks{% + \def\txiarg{#1}% + \ifx\txiarg\keywordtrue + \allowcodebreakstrue + \else\ifx\txiarg\keywordfalse + \allowcodebreaksfalse + \else + \errhelp = \EMsimple + \errmessage{Unknown @allowcodebreaks option `\txiarg'}% + \fi\fi +} + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. +\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\parseargdef\kbdinputstyle{% + \def\txiarg{#1}% + \ifx\txiarg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\txiarg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\txiarg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \else + \errhelp = \EMsimple + \errmessage{Unknown @kbdinputstyle option `\txiarg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct'. +\kbdinputstyle distinct + +\def\xkey{\key} +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +\ifx\one\xkey\ifx\threex\three \key{#2}% +\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi +\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} + +% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. +\let\indicateurl=\code +\let\env=\code +\let\command=\code + +% @clicksequence{File @click{} Open ...} +\def\clicksequence#1{\begingroup #1\endgroup} + +% @clickstyle @arrow (by default) +\parseargdef\clickstyle{\def\click{#1}} +\def\click{\arrow} + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. Perhaps eventually put in +% a hypertex \special here. +% +\def\uref#1{\douref #1,,,\finish} +\def\douref#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% @acronym for "FBI", "NATO", and the like. +% We print this one point size smaller, since it's intended for +% all-uppercase. +% +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @abbr for "Comput. J." and the like. +% No font change, but don't do end-of-sentence spacing. +% +\def\abbr#1{\doabbr #1,,\finish} +\def\doabbr#1,#2,#3\finish{% + {\plainfrenchspacing #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode`\_ = \active + \gdef\mathunderscore{% + \catcode`\_=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a math (or tt) \. +% FYI, plain.tex uses \\ as a temporary control sequence (for no +% particular reason), but this is not advertised and we don't care. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + % make the texinfo accent commands work in math mode + \let\"=\ddot + \let\'=\acute + \let\==\bar + \let\^=\hat + \let\`=\grave + \let\u=\breve + \let\v=\check + \let\~=\tilde + \let\dotaccent=\dot + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \catcode`' = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + \let' = \ptexquoteright + } +} + + +\message{glyphs,} +% and logos. + +% @@ prints an @. +\def\@{\char64 } + +% Used to generate quoted braces. Unless we're in typewriter, use +% \ecfont because the CM text fonts do not have braces, and we don't +% want to switch into math. +\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} +\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} +\let\{=\mylbrace +\let\}=\myrbrace +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux/toc files. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \ptexc +\let\dotaccent = \ptexdot +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \ptext +\let\ubaraccent = \ptexb +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi + \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=1000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{% + \ifx\textnominalsize\xwordpt + % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. + % Revert to plain's \scriptsize, which is 7pt. + \count255=\the\fam $\fam\count255 \scriptstyle A$% + \else + % For 11pt, we can use our lllsize. + \selectfonts\lllsize A% + \fi + }% + \vss + }}% + \kern-.15em + \TeX +} + +% Some math mode symbols. +\def\bullet{$\ptexbullet$} +\def\geq{\ifmmode \ge\else $\ge$\fi} +\def\leq{\ifmmode \le\else $\le$\fi} +\def\minus{\ifmmode -\else $-$\fi} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in the cm +% typewriter fonts as three actual period characters; on the other hand, +% in other typewriter fonts three periods are wider than 1.5em. So do +% whichever is larger. +% +\def\dots{% + \leavevmode + \setbox0=\hbox{...}% get width of three periods + \ifdim\wd0 > 1.5em + \dimen0 = \wd0 + \else + \dimen0 = 1.5em + \fi + \hbox to \dimen0{% + \hskip 0pt plus.25fil + .\hskip 0pt plus1fil + .\hskip 0pt plus1fil + .\hskip 0pt plus.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=\endofsentencespacefactor +} + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, they should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} +\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{% + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @pounds{} is a sterling sign, which Knuth put in the CM italic font. +% +\def\pounds{{\it\$}} + +% @euro{} comes from a separate font, depending on the current style. +% We use the free feym* fonts from the eurosym package by Henrik +% Theiling, which support regular, slanted, bold and bold slanted (and +% "outlined" (blackboard board, sort of) versions, which we don't need). +% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. +% +% Although only regular is the truly official Euro symbol, we ignore +% that. The Euro is designed to be slightly taller than the regular +% font height. +% +% feymr - regular +% feymo - slanted +% feybr - bold +% feybo - bold slanted +% +% There is no good (free) typewriter version, to my knowledge. +% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. +% Hmm. +% +% Also doesn't work in math. Do we need to do math with euro symbols? +% Hope not. +% +% +\def\euro{{\eurofont e}} +\def\eurofont{% + % We set the font at each command, rather than predefining it in + % \textfonts and the other font-switching commands, so that + % installations which never need the symbol don't have to have the + % font installed. + % + % There is only one designed size (nominal 10pt), so we always scale + % that to the current nominal size. + % + % By the way, simply using "at 1em" works for cmr10 and the like, but + % does not work for cmbx10 and other extended/shrunken fonts. + % + \def\eurosize{\csname\curfontsize nominalsize\endcsname}% + % + \ifx\curfontstyle\bfstylename + % bold: + \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize + \else + % regular: + \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize + \fi + \thiseurofont +} + +% Glyphs from the EC fonts. We don't use \let for the aliases, because +% sometimes we redefine the original macro, and the alias should reflect +% the redefinition. +% +% Use LaTeX names for the Icelandic letters. +\def\DH{{\ecfont \char"D0}} % Eth +\def\dh{{\ecfont \char"F0}} % eth +\def\TH{{\ecfont \char"DE}} % Thorn +\def\th{{\ecfont \char"FE}} % thorn +% +\def\guillemetleft{{\ecfont \char"13}} +\def\guillemotleft{\guillemetleft} +\def\guillemetright{{\ecfont \char"14}} +\def\guillemotright{\guillemetright} +\def\guilsinglleft{{\ecfont \char"0E}} +\def\guilsinglright{{\ecfont \char"0F}} +\def\quotedblbase{{\ecfont \char"12}} +\def\quotesinglbase{{\ecfont \char"0D}} +% +% This positioning is not perfect (see the ogonek LaTeX package), but +% we have the precomposed glyphs for the most common cases. We put the +% tests to use those glyphs in the single \ogonek macro so we have fewer +% dummy definitions to worry about for index entries, etc. +% +% ogonek is also used with other letters in Lithuanian (IOU), but using +% the precomposed glyphs for those is not so easy since they aren't in +% the same EC font. +\def\ogonek#1{{% + \def\temp{#1}% + \ifx\temp\macrocharA\Aogonek + \else\ifx\temp\macrochara\aogonek + \else\ifx\temp\macrocharE\Eogonek + \else\ifx\temp\macrochare\eogonek + \else + \ecfont \setbox0=\hbox{#1}% + \ifdim\ht0=1ex\accent"0C #1% + \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% + \fi + \fi\fi\fi\fi + }% +} +\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} +\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} +\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} +\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} +% +% Use the ec* fonts (cm-super in outline format) for non-CM glyphs. +\def\ecfont{% + % We can't distinguish serif/sans and italic/slanted, but this + % is used for crude hacks anyway (like adding French and German + % quotes to documents typeset with CM, where we lose kerning), so + % hopefully nobody will notice/care. + \edef\ecsize{\csname\curfontsize ecsize\endcsname}% + \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi + \thisecfont +} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + +% @textdegree - the normal degrees sign. +% +\def\textdegree{$^\circ$} + +% Laurent Siebenmann reports \Orb undefined with: +% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 +% so we'll define it if necessary. +% +\ifx\Orb\undefined +\def\Orb{\mathhexbox20D} +\fi + +% Quotes. +\chardef\quotedblleft="5C +\chardef\quotedblright=`\" +\chardef\quoteleft=`\` +\chardef\quoteright=`\' + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\envdef\titlepage{% + % Open one extra group, as we want to close it in the middle of \Etitlepage. + \begingroup + \parindent=0pt \textfonts + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \let\page = \oldpage + \page + \null + }% +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Macros to be used within @titlepage: + +\let\subtitlerm=\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} + +\parseargdef\title{% + \checkenv\titlepage + \leftline{\titlefonts\rmisbold #1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +% +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\secfonts\rmisbold \leftline{#1}}% + \fi +} + + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make TeX use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + + +\def\evenheading{\parsearg\evenheadingxxx} +\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddheading{\parsearg\oddheadingxxx} +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddfooting{\parsearg\oddfootingxxx} +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -12pt + \global\advance\vsize by -12pt +} + +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} + +% @evenheadingmarks top \thischapter <- chapter at the top of a page +% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page +% +% The same set of arguments for: +% +% @oddheadingmarks +% @evenfootingmarks +% @oddfootingmarks +% @everyheadingmarks +% @everyfootingmarks + +\def\evenheadingmarks{\headingmarks{even}{heading}} +\def\oddheadingmarks{\headingmarks{odd}{heading}} +\def\evenfootingmarks{\headingmarks{even}{footing}} +\def\oddfootingmarks{\headingmarks{odd}{footing}} +\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} + \headingmarks{odd}{heading}{#1} } +\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} + \headingmarks{odd}{footing}{#1} } +% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. +\def\headingmarks#1#2#3 {% + \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname + \global\expandafter\let\csname get#1#2marks\endcsname \temp +} + +\everyheadingmarks bottom +\everyfootingmarks bottom + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\headingsoff{% non-global headings elimination + \evenheadline={\hfil}\evenfootline={\hfil}% + \oddheadline={\hfil}\oddfootline={\hfil}% +} + +\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting +\HEADINGSoff % it's the default + +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} +\let\contentsalignmacro = \chappager + +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\undefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi + +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg{\gdef\thistitle}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table, @ftable, and @vtable define @item, @itemx, etc., with +% these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemindicate{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil\relax + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. However, if + % what follows is an environment such as @example, there will be no + % \parskip glue; then the negative vskip we just inserted would + % cause the example and the item to crash together. So we use this + % bizarre value of 10001 as a signal to \aboveenvbreak to insert + % \parskip glue after all. Section titles are handled this way also. + % + \penalty 10001 + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. + \noindent + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a list environment}} +\def\itemx{\errmessage{@itemx while not in a list environment}} + +% @table, @ftable, @vtable. +\envdef\table{% + \let\itemindex\gobble + \tablecheck{table}% +} +\envdef\ftable{% + \def\itemindex ##1{\doind {fn}{\code{##1}}}% + \tablecheck{ftable}% +} +\envdef\vtable{% + \def\itemindex ##1{\doind {vr}{\code{##1}}}% + \tablecheck{vtable}% +} +\def\tablecheck#1{% + \ifnum \the\catcode`\^^M=\active + \endgroup + \errmessage{This command won't work in this context; perhaps the problem is + that we are \inenvironment\thisenv}% + \def\next{\doignore{#1}}% + \else + \let\next\tablex + \fi + \next +} +\def\tablex#1{% + \def\itemindicate{#1}% + \parsearg\tabley +} +\def\tabley#1{% + {% + \makevalueexpandable + \edef\temp{\noexpand\tablez #1\space\space\space}% + \expandafter + }\temp \endtablez +} +\def\tablez #1 #2 #3 #4\endtablez{% + \aboveenvbreak + \ifnum 0#1>0 \advance \leftskip by #1\mil \fi + \ifnum 0#2>0 \tableindent=#2\mil \fi + \ifnum 0#3>0 \advance \rightskip by #3\mil \fi + \itemmax=\tableindent + \advance \itemmax by -\itemmargin + \advance \leftskip by \tableindent + \exdentamount=\tableindent + \parindent = 0pt + \parskip = \smallskipamount + \ifdim \parskip=0pt \parskip=2pt \fi + \let\item = \internalBitem + \let\itemx = \internalBitemx +} +\def\Etable{\endgraf\afterenvbreak} +\let\Eftable\Etable +\let\Evtable\Etable +\let\Eitemize\Etable +\let\Eenumerate\Etable + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\envdef\itemize{\parsearg\doitemize} + +\def\doitemize#1{% + \aboveenvbreak + \itemmax=\itemindent + \advance\itemmax by -\itemmargin + \advance\leftskip by \itemindent + \exdentamount=\itemindent + \parindent=0pt + \parskip=\smallskipamount + \ifdim\parskip=0pt \parskip=2pt \fi + % + % Try typesetting the item mark that if the document erroneously says + % something like @itemize @samp (intending @table), there's an error + % right away at the @itemize. It's not the best error message in the + % world, but it's better than leaving it to the @item. This means if + % the user wants an empty mark, they have to say @w{} not just @w. + \def\itemcontents{#1}% + \setbox0 = \hbox{\itemcontents}% + % + % @itemize with no arg is equivalent to @itemize @bullet. + \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi + % + \let\item=\itemizeitem +} + +% Definition of @item while inside @itemize and @enumerate. +% +\def\itemizeitem{% + \advance\itemno by 1 % for enumerations + {\let\par=\endgraf \smallbreak}% reasonable place to break + {% + % If the document has an @itemize directly after a section title, a + % \nobreak will be last on the list, and \sectionheading will have + % done a \vskip-\parskip. In that case, we don't want to zero + % parskip, or the item text will crash with the heading. On the + % other hand, when there is normal text preceding the item (as there + % usually is), we do want to zero parskip, or there would be too much + % space. In that case, we won't have a \nobreak before. At least + % that's the theory. + \ifnum\lastpenalty<10000 \parskip=0in \fi + \noindent + \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% + % + \vadjust{\penalty 1200}}% not good to break after first line of item. + \flushcr +} + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a . + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call \doitemize, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \doitemize{#1.}\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + + +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab do not need to be on their own lines, but it will not hurt +% if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +% Macros used to set up halign preamble: +% +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +% #1 is the @columnfraction, usually a decimal number like .5, but might +% be just 1. We just use it, whatever it is. +% +\def\pickupwholefraction#1 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% + \setuptable +} + +\newcount\colcount +\def\setuptable#1{% + \def\firstarg{#1}% + \ifx\firstarg\xendsetuptable + \let\go = \relax + \else + \ifx\firstarg\xcolumnfractions + \global\setpercenttrue + \else + \ifsetpercent + \let\go\pickupwholefraction + \else + \global\advance\colcount by 1 + \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% + \else + \let\go = \setuptable + \fi% + \fi + \go +} + +% multitable-only commands. +% +% @headitem starts a heading row, which we typeset in bold. +% Assignments have to be global since we are inside the implicit group +% of an alignment entry. \everycr resets \everytab so we don't have to +% undo it ourselves. +\def\headitemfont{\b}% for people to use in the template row; not changeable +\def\headitem{% + \checkenv\multitable + \crcr + \global\everytab={\bf}% can't use \headitemfont since the parsing differs + \the\everytab % for the first item +}% +% +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we again encounter the problem the 1sp was intended to solve. +% --karl, nathan@acm.org, 20apr99. +\def\tab{\checkenv\multitable &\the\everytab}% + +% @multitable ... @end multitable definitions: +% +\newtoks\everytab % insert after every tab. +% +\envdef\multitable{% + \vskip\parskip + \startsavinginserts + % + % @item within a multitable starts a normal row. + % We use \def instead of \let so that if one of the multitable entries + % contains an @itemize, we don't choke on the \item (seen as \crcr aka + % \endtemplate) expanding \doitemize. + \def\item{\crcr}% + % + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + % + \everycr = {% + \noalign{% + \global\everytab={}% + \global\colcount=0 % Reset the column counter. + % Check for saved footnotes, etc. + \checkinserts + % Keeps underfull box messages off when table breaks over pages. + %\filbreak + % Maybe so, but it also creates really weird page breaks when the + % table breaks over pages. Wouldn't \vfil be better? Wait until the + % problem manifests itself, so it can be fixed for real --karl. + }% + }% + % + \parsearg\domultitable +} +\def\domultitable#1{% + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. + \halign\bgroup &% + \global\advance\colcount by 1 + \multistrut + \vtop{% + % Use the current \colcount to find the correct column width: + \hsize=\expandafter\csname col\the\colcount\endcsname + % + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt + \ifnum\colcount=1 + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip + \else + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut + }\cr +} +\def\Emultitable{% + \crcr + \egroup % end the \halign + \global\setpercentfalse +} + +\def\setmultitablespacing{% + \def\multistrut{\strut}% just use the standard line spacing + % + % Compute \multitablelinespace (if not defined by user) for use in + % \multitableparskip calculation. We used define \multistrut based on + % this, but (ironically) that caused the spacing to be off. + % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +\fi +%% Test to see if parskip is larger than space between lines of +%% table. If not, do nothing. +%% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi} + + +\message{conditionals,} + +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, +% @ifnotxml always succeed. They currently do nothing; we don't +% attempt to check whether the conditionals are properly nested. But we +% have to remember that they are conditionals, so that @end doesn't +% attempt to close an environment group. +% +\def\makecond#1{% + \expandafter\let\csname #1\endcsname = \relax + \expandafter\let\csname iscond.#1\endcsname = 1 +} +\makecond{iftex} +\makecond{ifnotdocbook} +\makecond{ifnothtml} +\makecond{ifnotinfo} +\makecond{ifnotplaintext} +\makecond{ifnotxml} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\docbook{\doignore{docbook}} +\def\html{\doignore{html}} +\def\ifdocbook{\doignore{ifdocbook}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% Ignore text until a line `@end #1', keeping track of nested conditionals. +% +% A count to remember the depth of nesting. +\newcount\doignorecount + +\def\doignore#1{\begingroup + % Scan in ``verbatim'' mode: + \obeylines + \catcode`\@ = \other + \catcode`\{ = \other + \catcode`\} = \other + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \spaceisspace + % + % Count number of #1's that we've seen. + \doignorecount = 0 + % + % Swallow text until we reach the matching `@end #1'. + \dodoignore{#1}% +} + +{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. + \obeylines % + % + \gdef\dodoignore#1{% + % #1 contains the command name as a string, e.g., `ifinfo'. + % + % Define a command to find the next `@end #1'. + \long\def\doignoretext##1^^M@end #1{% + \doignoretextyyy##1^^M@#1\_STOP_}% + % + % And this command to find another #1 command, at the beginning of a + % line. (Otherwise, we would consider a line `@c @ifset', for + % example, to count as an @ifset for nesting.) + \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% + % + % And now expand that command. + \doignoretext ^^M% + }% +} + +\def\doignoreyyy#1{% + \def\temp{#1}% + \ifx\temp\empty % Nothing found. + \let\next\doignoretextzzz + \else % Found a nested condition, ... + \advance\doignorecount by 1 + \let\next\doignoretextyyy % ..., look for another. + % If we're here, #1 ends with ^^M\ifinfo (for example). + \fi + \next #1% the token \_STOP_ is present just after this macro. +} + +% We have to swallow the remaining "\_STOP_". +% +\def\doignoretextzzz#1{% + \ifnum\doignorecount = 0 % We have just found the outermost @end. + \let\next\enddoignore + \else % Still inside a nested condition. + \advance\doignorecount by -1 + \let\next\doignoretext % Look for the next @end. + \fi + \next +} + +% Finish off ignored text. +{ \obeylines% + % Ignore anything after the last `@end #1'; this matters in verbatim + % environments, where otherwise the newline after an ignored conditional + % would result in a blank line in the output. + \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% +} + + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. +% We rely on the fact that \parsearg sets \catcode`\ =10. +% +\parseargdef\set{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + {% + \makevalueexpandable + \def\temp{#2}% + \edef\next{\gdef\makecsname{SET#1}}% + \ifx\temp\empty + \next{}% + \else + \setzzz#2\endsetzzz + \fi + }% +} +% Remove the trailing space \setxxx inserted. +\def\setzzz#1 \endsetzzz{\next{#1}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\parseargdef\clear{% + {% + \makevalueexpandable + \global\expandafter\let\csname SET#1\endcsname=\relax + }% +} + +% @value{foo} gets the text saved in variable foo. +\def\value{\begingroup\makevalueexpandable\valuexxx} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} +{ + \catcode`\- = \active \catcode`\_ = \active + % + \gdef\makevalueexpandable{% + \let\value = \expandablevalue + % We don't want these characters active, ... + \catcode`\-=\other \catcode`\_=\other + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. + \let-\realdash \let_\normalunderscore + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +\makecond{ifset} +\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} +\def\doifset#1#2{% + {% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname SET#2\endcsname\relax + #1% If not set, redefine \next. + \fi + \expandafter + }\next +} +\def\ifsetfail{\doignore{ifset}} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +% The `\else' inside the `\doifset' parameter is a trick to reuse the +% above code: if the variable is not set, do nothing, if it is set, +% then redefine \next to \ifclearfail. +% +\makecond{ifclear} +\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} +\def\ifclearfail{\doignore{ifclear}} + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory=\comment + +% @defininfoenclose. +\let\definfoenclose=\comment + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within macros and \if's. +\edef\newwrite{\makecsname{ptexnewwrite}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} +} + +% @defindex foo == \newindex{foo} +% +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. +% +\def\defcodeindex{\parsearg\newcodeindex} +% +\def\newcodeindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \relax + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% +\def\indexdummies{% + \escapechar = `\\ % use backslash in output files. + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % + % Need these unexpandable (because we define \tt as a dummy) + % definitions when @{ or @} appear in index entry text. Also, more + % complicated, when \tex is in effect and \{ is a \delimiter again. + % We can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. Perhaps we + % should define @lbrace and @rbrace commands a la @comma. + \def\{{{\tt\char123}}% + \def\}{{\tt\char125}}% + % + % I don't entirely understand this, but when an index entry is + % generated from a macro call, the \endinput which \scanmacro inserts + % causes processing to be prematurely terminated. This is, + % apparently, because \indexsorttmp is fully expanded, and \endinput + % is an expandable command. The redefinition below makes \endinput + % disappear altogether for that purpose -- although logging shows that + % processing continues to some further point. On the other hand, it + % seems \endinput does not hurt in the printed index arg, since that + % is still getting written without apparent harm. + % + % Sample source (mac-idx3.tex, reported by Graham Percival to + % help-texinfo, 22may06): + % @macro funindex {WORD} + % @findex xyz + % @end macro + % ... + % @funindex commtest + % + % The above is not enough to reproduce the bug, but it gives the flavor. + % + % Sample whatsit resulting: + % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} + % + % So: + \let\endinput = \empty + % + % Do the redefinitions. + \commondummies +} + +% For the aux and toc files, @ is the escape character. So we want to +% redefine everything using @ as the escape character (instead of +% \realbackslash, still used for index files). When everything uses @, +% this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % Do the redefinitions. + \commondummies + \otherbackslash +} + +% Called from \indexdummies and \atdummies. +% +\def\commondummies{% + % + % \definedummyword defines \#1 as \string\#1\space, thus effectively + % preventing its expansion. This is used only for control% words, + % not control letters, because the \space would be incorrect for + % control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword ##1{\def##1{\string##1\space}}% + \def\definedummyletter##1{\def##1{\string##1}}% + \let\definedummyaccent\definedummyletter + % + \commondummiesnofonts + % + \definedummyletter\_% + % + % Non-English letters. + \definedummyword\AA + \definedummyword\AE + \definedummyword\DH + \definedummyword\L + \definedummyword\O + \definedummyword\OE + \definedummyword\TH + \definedummyword\aa + \definedummyword\ae + \definedummyword\dh + \definedummyword\exclamdown + \definedummyword\l + \definedummyword\o + \definedummyword\oe + \definedummyword\ordf + \definedummyword\ordm + \definedummyword\questiondown + \definedummyword\ss + \definedummyword\th + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword\bf + \definedummyword\gtr + \definedummyword\hat + \definedummyword\less + \definedummyword\sf + \definedummyword\sl + \definedummyword\tclose + \definedummyword\tt + % + \definedummyword\LaTeX + \definedummyword\TeX + % + % Assorted special characters. + \definedummyword\bullet + \definedummyword\comma + \definedummyword\copyright + \definedummyword\registeredsymbol + \definedummyword\dots + \definedummyword\enddots + \definedummyword\entrybreak + \definedummyword\equiv + \definedummyword\error + \definedummyword\euro + \definedummyword\guillemetleft + \definedummyword\guillemetright + \definedummyword\guilsinglleft + \definedummyword\guilsinglright + \definedummyword\expansion + \definedummyword\minus + \definedummyword\ogonek + \definedummyword\pounds + \definedummyword\point + \definedummyword\print + \definedummyword\quotedblbase + \definedummyword\quotedblleft + \definedummyword\quotedblright + \definedummyword\quoteleft + \definedummyword\quoteright + \definedummyword\quotesinglbase + \definedummyword\result + \definedummyword\textdegree + % + % We want to disable all macros so that they are not expanded by \write. + \macrolist + % + \normalturnoffactive + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable +} + +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% +\def\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter\!% + \definedummyaccent\"% + \definedummyaccent\'% + \definedummyletter\*% + \definedummyaccent\,% + \definedummyletter\.% + \definedummyletter\/% + \definedummyletter\:% + \definedummyaccent\=% + \definedummyletter\?% + \definedummyaccent\^% + \definedummyaccent\`% + \definedummyaccent\~% + \definedummyword\u + \definedummyword\v + \definedummyword\H + \definedummyword\dotaccent + \definedummyword\ogonek + \definedummyword\ringaccent + \definedummyword\tieaccent + \definedummyword\ubaraccent + \definedummyword\udotaccent + \definedummyword\dotless + % + % Texinfo font commands. + \definedummyword\b + \definedummyword\i + \definedummyword\r + \definedummyword\sc + \definedummyword\t + % + % Commands that take arguments. + \definedummyword\acronym + \definedummyword\cite + \definedummyword\code + \definedummyword\command + \definedummyword\dfn + \definedummyword\email + \definedummyword\emph + \definedummyword\env + \definedummyword\file + \definedummyword\kbd + \definedummyword\key + \definedummyword\math + \definedummyword\option + \definedummyword\pxref + \definedummyword\ref + \definedummyword\samp + \definedummyword\strong + \definedummyword\tie + \definedummyword\uref + \definedummyword\url + \definedummyword\var + \definedummyword\verb + \definedummyword\w + \definedummyword\xref +} + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexnofonts{% + % Accent commands should become @asis. + \def\definedummyaccent##1{\let##1\asis}% + % We can just ignore other control letters. + \def\definedummyletter##1{\let##1\empty}% + % Hopefully, all control words can become @asis. + \let\definedummyword\definedummyaccent + % + \commondummiesnofonts + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=\asis + % + \def\ { }% + \def\@{@}% + % how to handle braces? + \def\_{\normalunderscore}% + % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\DH{DZZ}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\TH{ZZZ}% + \def\aa{aa}% + \def\ae{ae}% + \def\dh{dzz}% + \def\exclamdown{!}% + \def\l{l}% + \def\oe{oe}% + \def\ordf{a}% + \def\ordm{o}% + \def\o{o}% + \def\questiondown{?}% + \def\ss{ss}% + \def\th{zzz}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\bullet{bullet}% + \def\comma{,}% + \def\copyright{copyright}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{==}% + \def\error{error}% + \def\euro{euro}% + \def\expansion{==>}% + \def\guillemetleft{<<}% + \def\guillemetright{>>}% + \def\guilsinglleft{<}% + \def\guilsinglright{>}% + \def\minus{-}% + \def\point{.}% + \def\pounds{pounds}% + \def\print{-|}% + \def\quotedblbase{"}% + \def\quotedblleft{"}% + \def\quotedblright{"}% + \def\quoteleft{`}% + \def\quoteright{'}% + \def\quotesinglbase{,}% + \def\registeredsymbol{R}% + \def\result{=>}% + \def\textdegree{o}% + % + \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax + \else \indexlquoteignore \fi + % + % We need to get rid of all macros, leaving only the arguments (if present). + % Of course this is not nearly correct, but it is the best we can do for now. + % makeinfo does not expand macros in the argument to @deffn, which ends up + % writing an index entry, and texindex isn't prepared for an index sort entry + % that starts with \. + % + % Since macro invocations are followed by braces, we can just redefine them + % to take a single TeX argument. The case of a macro invocation that + % goes to end-of-line is not handled. + % + \macrolist +} + +% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us +% ignore left quotes in the sort term. +{\catcode`\`=\active + \gdef\indexlquoteignore{\let`=\empty}} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + % Store the main index entry text (including the third arg). + \toks0 = {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \safewhatsit\dosubindwrite + }% + \fi +} + +% Write the entry in \toks0 to the index file: +% +\def\dosubindwrite{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% + \fi + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\writeto{% + \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% + }% + \temp +} + +% Take care of unwanted page breaks/skips around a whatsit: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write or \pdfdest will make \lastskip zero. The result is that +% sequences like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +\newskip\whatsitskip +\newcount\whatsitpenalty +% +% ..., ready, GO: +% +\def\safewhatsit#1{% +\ifhmode + #1% +\else + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \whatsitskip = \lastskip + \edef\lastskipmacro{\the\lastskip}% + \whatsitpenalty = \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\whatsitskip glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\whatsitskip + \fi + % + #1% + % + \ifx\lastskipmacro\zeroskipmacro + % If \lastskip was zero, perhaps the last item was a penalty, and + % perhaps it was >=10000, e.g., a \nobreak. In that case, we want + % to re-insert the same penalty (values >10000 are used for various + % signals); since we just inserted a non-discardable item, any + % following glue (such as a \parskip) would be a breakpoint. For example: + % + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\whatsitskip + \fi +\fi +} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\parseargdef\printindex{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \plainfrenchspacing + \everypar = {}% don't want the \kern\-parindent from indentation suppression. + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + \putwordIndexNonexistent + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\backslashcurfont}% + \catcode`\\ = 0 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \nobreak + \vskip 0pt plus 3\baselineskip + \penalty 0 + \vskip 0pt plus -3\baselineskip + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus .5\baselineskip + \leftline{\secbf #1}% + % Do our best not to break after the initial. + \nobreak + \vskip .33\baselineskip plus .1\baselineskip +}} + +% \entry typesets a paragraph consisting of the text (#1), dot leaders, and +% then page number (#2) flushed to the right margin. It is used for index +% and table of contents entries. The paragraph is indented by \leftskip. +% +% A straightforward implementation would start like this: +% \def\entry#1#2{... +% But this freezes the catcodes in the argument, and can cause problems to +% @code, which sets - active. This problem was fixed by a kludge--- +% ``-'' was active throughout whole index, but this isn't really right. +% The right solution is to prevent \entry from swallowing the whole text. +% --kasal, 21nov03 +\def\entry{% + \begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent = 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus1pt + % + % When reading the text of entry, convert explicit line breaks + % from @* into spaces. The user might give these in long section + % titles, for instance. + \def\*{\unskip\space\ignorespaces}% + \def\entrybreak{\hfil\break}% + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp = +} +\def\entrybreak{\unskip\space\ignorespaces}% +\def\doentry{% + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. +} +\def\finishentry#1{% + % #1 is the page number. + % + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \setbox\boxA = \hbox{#1}% + \ifdim\wd\boxA = 0pt + \ % + \else + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#1.% + \ \the\toksA + \else + \ #1% + \fi + \fi + \par + \endgroup +} + +% Like plain.tex's \dotfill, except uses up at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done with double columns. +\def\enddoublecolumns{% + % The following penalty ensures that the page builder is exercised + % _before_ we change the output routine. This is necessary in the + % following situation: + % + % The last section of the index consists only of a single entry. + % Before this section, \pagetotal is less than \pagegoal, so no + % break occurs before the last section starts. However, the last + % section, consisting of \initial and the single \entry, does not + % fit on the page and has to be broken off. Without the following + % penalty the page builder will not be exercised until \eject + % below, and by that time we'll already have changed the output + % routine to the \balancecolumns version, so the next-to-last + % double-column page will be processed with \balancecolumns, which + % is wrong: The two columns will go to the main vertical list, with + % the broken-off section in the recent contributions. As soon as + % the output routine finishes, TeX starts reconsidering the page + % break. The two columns and the broken-off section both fit on the + % page, because the two columns now take up only half of the page + % goal. When TeX sees \eject from below which follows the final + % section, it invokes the new output routine that we've set after + % \balancecolumns below; \onepageout will try to fit the two columns + % and the final section into the vbox of \pageheight (see + % \pagebody), causing an overfull box. + % + % Note that glue won't work here, because glue does not exercise the + % page builder, unlike penalties (see The TeXbook, pp. 280-281). + \penalty0 + % + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +% Let's start with @part. +\outer\parseargdef\part{\partzzz{#1}} +\def\partzzz#1{% + \chapoddpage + \null + \vskip.3\vsize % move it down on the page a bit + \begingroup + \noindent \titlefonts\rmisbold #1\par % the text + \let\lastnode=\empty % no node to associate with + \writetocentry{part}{#1}{}% but put it in the toc + \headingsoff % no headline or footline on the part page + \chapoddpage + \endgroup +} + +% \unnumberedno is an oxymoron. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno = 10000 +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +% +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines these (using marks) as the number+name, number +% and name of the chapter. Page headings and footings can use +% these. @section does likewise. +\def\thischapter{} +\def\thischapternum{} +\def\thischaptername{} +\def\thissection{} +\def\thissectionnum{} +\def\thissectionname{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% we only have subsub. +\chardef\maxseclevel = 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achieve this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unnlevel = \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel = 0 + \else + \ifnum \absseclevel > 3 + \absseclevel = 3 + \fi + \fi + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unnlevel + \chardef\unnlevel = \absseclevel + \fi + \else + % Check for appendix sections: + \ifnum \absseclevel = 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unnlevel + \def\headtype{U}% + \else + \chardef\unnlevel = 3 + \fi + \fi + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi + \else + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi + \fi + \suppressfirstparagraphindent +} + +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} + +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +% +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix = \empty +% +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + % \putwordChapter can contain complex things in translations. + \toks0=\expandafter{\putwordChapter}% + \message{\the\toks0 \space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz +% +\def\appendixzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + % \putwordAppendix can contain complex things in translations. + \toks0=\expandafter{\putwordAppendix}% + \message{\the\toks0 \space \appendixletter}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +\def\unnumberedzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix = \empty + \resetallfloatnos + % + % This used to be simply \message{#1}, but TeX fully expands the + % argument to \message. Therefore, if #1 contained @-commands, TeX + % expanded them. For example, in `@unnumbered The @cite{Book}', TeX + % expanded @cite (which turns out to cause errors because \cite is meant + % to be executed, not expanded). + % + % Anyway, we don't want the fully-expanded definition of @cite to appear + % as a result of the \message, we just want `@cite' itself. We use + % \the to achieve this: TeX expands \the only once, + % simply yielding the contents of . (We also do this for + % the toc entries.) + \toks0 = {#1}% + \message{(\the\toks0)}% + % + \chapmacro{#1}{Ynothing}{\the\unnumberedno}% + % + \global\let\section = \unnumberedsec + \global\let\subsection = \unnumberedsubsec + \global\let\subsubsection = \unnumberedsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\parseargdef\centerchap{% + % Well, we could do the following in a group, but that would break + % an assumption that \chapmacro is called at the outermost level. + % Thus we are safer this way: --kasal, 24feb04 + \let\centerparametersmaybe = \centerparameters + \unnmhead0{#1}% + \let\centerparametersmaybe = \relax +} + +% @top is like @unnumbered. +\let\top\unnumbered + +% Sections. +\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz +\def\seczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% +} + +\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz +\def\appendixsectionzzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% +} +\let\appendixsec\appendixsection + +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% +} + +% Subsections. +\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz +\def\appendixsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% +} + +% Subsubsections. +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynumbered}% + {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz +\def\appendixsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\let\section = \numberedsec +\let\subsection = \numberedsubsec +\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +% NOTE on use of \vbox for chapter headings, section headings, and such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + +\def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +} + +\def\chapheading{\chapbreak \parsearg\chapheadingzzz} +\def\chapheadingzzz#1{% + {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\ptexraggedright + \rmisbold #1\hfill}}% + \bigskip \par\penalty 200\relax + \suppressfirstparagraphindent +} + +% @heading, @subheading, @subsubheading. +\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +% Because \domark is called before \chapoddpage, the filler page will +% get the headings for the next chapter, which is wrong. But we don't +% care -- we just disable all headings on the filler page. +\def\chapoddpage{% + \chappager + \ifodd\pageno \else + \begingroup + \headingsoff + \null + \chappager + \endgroup + \fi +} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{% +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +% Chapter opening. +% +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +% +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yomitfromtockeyword{Yomitfromtoc} +\def\Yappendixkeyword{Yappendix} +% +\def\chapmacro#1#2#3{% + % Insert the first mark before the heading break (see notes for \domark). + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% + \gdef\thissection{}}% + % + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{\thischaptername}}% + \else\ifx\temptype\Yomitfromtockeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{}}% + \else\ifx\temptype\Yappendixkeyword + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\appendixletter}% + % \noexpand\putwordAppendix avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} + \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \else + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\the\chapno}% + % \noexpand\putwordChapter avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordChapter{} + \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \fi\fi\fi + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert the chapter heading break. + \pchapsepmacro + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \domark + % + {% + \chapfonts \rmisbold + % + % Have to define \lastsection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\lastsection{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \nobreak % Avoid page breaks at the interline glue. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright + \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt +} + + +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +% +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% +\def\unnchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\ptexraggedright + \rmisbold #1\hfill}}\bigskip \par\nobreak +} +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} +\def\centerchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt + \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak +} +\def\CHAPFopen{% + \global\let\chapmacro=\chfopen + \global\let\centerchapmacro=\centerchfopen} + + +% Section titles. These macros combine the section number parts and +% call the generic \sectionheading to do the printing. +% +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip{-1000}} + +% Subsection titles. +\newskip\subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} + +% Subsubsection titles. +\def\subsubsecheadingskip{\subsecheadingskip} +\def\subsubsecheadingbreak{\subsecheadingbreak} + + +% Print any size, any type, section title. +% +% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is +% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the +% section number. +% +\def\seckeyword{sec} +% +\def\sectionheading#1#2#3#4{% + {% + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rmisbold + % + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + % Insert first mark before the heading break (see notes for \domark). + \let\prevsectiondefs=\lastsectiondefs + \ifx\temptype\Ynothingkeyword + \ifx\sectionlevel\seckeyword + \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% + \gdef\thissection{\thissectionname}}% + \fi + \else\ifx\temptype\Yomitfromtockeyword + % Don't redefine \thissection. + \else\ifx\temptype\Yappendixkeyword + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \else + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \fi\fi\fi + % + % Go into vertical mode. Usually we'll already be there, but we + % don't want the following whatsit to end up in a preceding paragraph + % if the document didn't happen to have a blank line. + \par + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevsectiondefs=\lastsectiondefs + \domark + % + % Only insert the space after the number if we have a section number. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\lastsection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \lastsection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\lastsection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\lastsection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chapmacro. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (= pdf destination for pdftex). + % Again, see comments in \chapmacro. + \donoderef{#3}% + % + % Interline glue will be inserted when the vbox is completed. + % That glue will be a valid breakpoint for the page, since it'll be + % preceded by a whatsit (usually from the \donoderef, or from the + % \writetocentry if there was no node). We don't want to allow that + % break, since then the whatsits could end up on page n while the + % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. + \nobreak + % + % Output the actual section heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright + \hangindent=\wd0 % zero if no section number + \unhbox0 #1}% + }% + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) + \vskip-\parskip + % + % This is purely so the last item on the list is a known \penalty > + % 10000. This is so \startdefun can avoid allowing breakpoints after + % section headings. Otherwise, it would insert a valid breakpoint between: + % + % @section sec-whatever + % @deffn def-whatever + \penalty 10001 +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. +% +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +% +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + {\atdummies + \edef\temp{% + \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% + \temp + }% + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \fi +} + + +% These characters do not print properly in the Computer Modern roman +% fonts, so we must take special care. This is more or less redundant +% with the Texinfo input format setup at the end of this file. +% +\def\activecatcodes{% + \catcode`\"=\active + \catcode`\$=\active + \catcode`\<=\active + \catcode`\>=\active + \catcode`\\=\active + \catcode`\^=\active + \catcode`\_=\active + \catcode`\|=\active + \catcode`\~=\active +} + + +% Read the toc file, which is essentially Texinfo input. +\def\readtocfile{% + \setupdatafile + \activecatcodes + \input \tocreadfilename +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Prepare to read what we've written to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + +% redefined for the two-volume lispref. We always output on +% \jobname.toc even if this is redefined. +% +\def\tocreadfilename{\jobname.toc} + +% Normal (long) toc. +% +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\partentry = \shortpartentry + \let\numchapentry = \shortchapentry + \let\appentry = \shortchapentry + \let\unnchapentry = \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry = \numsecentry + \let\unnsecentry = \numsecentry + \let\numsubsecentry = \numsecentry + \let\appsubsecentry = \numsecentry + \let\unnsubsecentry = \numsecentry + \let\numsubsubsecentry = \numsecentry + \let\appsubsubsecentry = \numsecentry + \let\unnsubsubsecentry = \numsecentry + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + % + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Parts, in the main contents. Replace the part number, which doesn't +% exist, with an empty box. Let's hope all the numbers have the same width. +% Also ignore the page number, which is conventionally not printed. +\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} +\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} +% +% Parts, in the short toc. +\def\shortpartentry#1#2#3#4{% + \penalty-300 + \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip + \shortchapentry{{\bf #1}}{\numeralbox}{}{}% +} + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% +} + +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +% +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 = \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} + +% Unnumbered chapters. +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} + +% Sections. +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} +\let\appsecentry=\numsecentry +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} + +% Subsections. +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} +\let\appsubsecentry=\numsubsecentry +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} + +% And subsubsections. +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} +\let\appsubsubsecentry=\numsubsubsecentry +\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} + +% This parameter controls the indentation of the various levels. +% Same as \defaultparindent. +\newdimen\tocindent \tocindent = 15pt + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we want it to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno\bgroup#2\egroup}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +% We use the same \entry macro as for the index entries. +\let\tocentry = \entry + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\def\subsecentryfonts{\textfonts} +\def\subsubsecentryfonts{\textfonts} + + +\message{environments,} +% @foo ... @end foo. + +% @tex ... @end tex escapes into raw TeX temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain @ character. + +\envdef\tex{% + \setupmarkupstyle{tex}% + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie + \catcode `\%=14 + \catcode `\+=\other + \catcode `\"=\other + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other + \catcode`\`=\other + \catcode`\'=\other + \escapechar=`\\ + % + % ' is active in math mode (mathcode"8000). So reset it, and all our + % other math active characters (just in case), to plain's definitions. + \mathactive + % + \let\b=\ptexb + \let\bullet=\ptexbullet + \let\c=\ptexc + \let\,=\ptexcomma + \let\.=\ptexdot + \let\dots=\ptexdots + \let\equiv=\ptexequiv + \let\!=\ptexexclam + \let\i=\ptexi + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \let\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\/=\ptexslash + \let\*=\ptexstar + \let\t=\ptext + \expandafter \let\csname top\endcsname=\ptextop % outer + \let\frenchspacing=\plainfrenchspacing + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz and + % \sectionheading, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty<10000 \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will +% also clear it, so that its embedded environments do the narrowing again. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt % we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing = t% + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=\cartinner + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip + \comment % For explanation, see the end of \def\group. +} +\def\Ecartouche{% + \ifhmode\par\fi + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup + \checkinserts +} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\newdimen\nonfillparindent +\def\nonfillstart{% + \aboveenvbreak + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + % Turn off paragraph indentation but redefine \indent to emulate + % the normal \indent. + \nonfillparindent=\parindent + \parindent = 0pt + \let\indent\nonfillindent + % + \emergencystretch = 0pt % don't try to avoid overfull boxes + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \let\exdent=\nofillexdent +} + +\begingroup +\obeyspaces +% We want to swallow spaces (but not other tokens) after the fake +% @indent in our nonfill-environments, where spaces are normally +% active and set to @tie, resulting in them not being ignored after +% @indent. +\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% +\gdef\nonfillindentcheck{% +\ifx\temp % +\expandafter\nonfillindentgobble% +\else% +\leavevmode\nonfillindentbox% +\fi% +}% +\endgroup +\def\nonfillindentgobble#1{\nonfillindent} +\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} + +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + % end paragraph for sake of leading, in case document has no blank + % line. This is redundant with what happens in \aboveenvbreak, but + % we need to do it before changing the fonts, and it's inconvenient + % to change the fonts afterward. + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} + +% We often define two environments, @foo and @smallfoo. +% Let's do it in one command. #1 is the env name, #2 the definition. +\def\makedispenvdef#1#2{% + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak +} + +% Define two environment synonyms (#1 and #2) for an environment. +\def\maketwodispenvdef#1#2#3{% + \makedispenvdef{#1}{#3}% + \makedispenvdef{#2}{#3}% +} +% +% @lisp: indented, narrowed, typewriter font; +% @example: same as @lisp. +% +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +% +\maketwodispenvdef{lisp}{example}{% + \nonfillstart + \tt\setupmarkupstyle{example}% + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} +% @display/@smalldisplay: same as @lisp except keep current font. +% +\makedispenvdef{display}{% + \nonfillstart + \gobble +} + +% @format/@smallformat: same as @display except don't narrow margins. +% +\makedispenvdef{format}{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} + +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} +\let\Eflushleft = \afterenvbreak + +% @flushright. +% +\envdef\flushright{% + \let\nonarrowing = t% + \nonfillstart + \advance\leftskip by 0pt plus 1fill\relax + \gobble +} +\let\Eflushright = \afterenvbreak + + +% @raggedright does more-or-less normal line breaking but no right +% justification. From plain.tex. +\envdef\raggedright{% + \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax +} +\let\Eraggedright\par + +\envdef\raggedleft{% + \parindent=0pt \leftskip0pt plus2em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedleft\par + +\envdef\raggedcenter{% + \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedcenter\par + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. +% +\makedispenvdef{quotation}{\quotationstart} +% +\def\quotationstart{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \parsearg\quotationlabel +} + +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +% +\def\Equotation{% + \par + \ifx\quotationauthor\undefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=0pt \afterenvbreak}% +} +\def\Esmallquotation{\Equotation} + +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% + % Don't do the quotes -- if we do, @set txicodequoteundirected and + % @set txicodequotebacktick will not have effect on @verb and + % @verbatim, and ?` and !` ligatures won't get disabled. + %\do\`\do\'% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=\other}\dospecials} +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \setupmarkupstyle{verb}% + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion. +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +% We typeset each line of the verbatim in an \hbox, so we can handle +% tabs. The \global is in case the verbatim line starts with an accent, +% or some other command that starts with a begin-group. Otherwise, the +% entire \verbbox would disappear at the corresponding end-group, before +% it is typeset. Meanwhile, we can't have nested verbatim commands +% (can we?), so the \global won't be overwriting itself. +\newbox\verbbox +\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} +% +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab + \divide\dimen\verbbox by\tabw + \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw + \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw + \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox + }% + } +\endgroup + +% start the verbatim environment. +\def\setupverbatim{% + \let\nonarrowing = t% + \nonfillstart + \tt % easiest (and conventionally used) font for verbatim + % The \leavevmode here is for blank lines. Otherwise, we would + % never \starttabox and the \egroup would end verbatim mode. + \def\par{\leavevmode\egroup\box\verbbox\endgraf}% + \tabexpand + \setupmarkupstyle{verbatim}% + % Respect line breaks, + % print special symbols as themselves, and + % make each space count. + % Must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#1'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +% +\begingroup + \catcode`\ =\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% + % We really want {...\end verbatim} in the body of the macro, but + % without the active space; thus we have to use \xdef and \gobble. +\endgroup +% +\envdef\verbatim{% + \setupverbatim\doverbatim +} +\let\Everbatim = \afterenvbreak + + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} +% +\def\doverbatiminclude#1{% + {% + \makevalueexpandable + \setupverbatim + \indexnofonts % Allow `@@' and other weird things in file names. + \input #1 + \afterenvbreak + }% +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very desirable. +% +\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} +\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} +% +\def\insertcopying{% + \begingroup + \parindent = 0pt % paragraph indentation looks wrong on title page + \scanexp\copyingtext + \endgroup +} + + +\message{defuns,} +% @defun etc. + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deflastargmargin \deflastargmargin=18pt +\newcount\defunpenalty + +% Start the processing of @deffn: +\def\startdefun{% + \ifnum\lastpenalty<10000 + \medbreak + \defunpenalty=10003 % Will keep this @deffn together with the + % following @def command, see below. + \else + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we need to allow a + % break somewhere. Check specifically for penalty 10002, inserted + % by \printdefunline, instead of 10000, since the sectioning + % commands also insert a nobreak penalty, and we don't want to allow + % a break between a section heading and a defun. + % + % As a minor refinement, we avoid "club" headers by signalling + % with penalty of 10003 after the very first @deffn in the + % sequence (see above), and penalty of 10002 after any following + % @def command. + \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi + % + % Similarly, after a section heading, do not allow a break. + % But do insert the glue. + \medskip % preceded by discardable penalty, so not a breakpoint + \fi + % + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent +} + +\def\dodefunx#1{% + % First, check whether we are in the right environment: + \checkenv#1% + % + % As above, allow line break if we have multiple x headers in a row. + % It's not a great place, though. + \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi + % + % And now, it's time to reuse the body of the original defun: + \expandafter\gobbledefun#1% +} +\def\gobbledefun#1\startdefun{} + +% \printdefunline \deffnheader{text} +% +\def\printdefunline#1#2{% + \begingroup + % call \deffnheader: + #1#2 \endheader + % common ending: + \interlinepenalty = 10000 + \advance\rightskip by 0pt plus 1fil\relax + \endgraf + \nobreak\vskip -\parskip + \penalty\defunpenalty % signal to \startdefun and \dodefunx + % Some of the @defun-type tags do not enable magic parentheses, + % rendering the following check redundant. But we don't optimize. + \checkparencounts + \endgroup +} + +\def\Edefun{\endgraf\medbreak} + +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remaining is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname = \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp +} + +% \domakedefun \deffn \deffnx \deffnheader +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} + +%%% Untyped functions: + +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% +} + +%%% Typed functions: + +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} + +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Typed variables: + +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} + +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \deftypecvgeneral {subind}category type var args +% +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Untyped variables: + +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } + +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } + +%%% Type: +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% +} + +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} + +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +% +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + % Get the values of \leftskip and \rightskip as they were outside the @def... + \advance\leftskip by -\defbodyindent + % + % How we'll format the type name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} + % + % Figure out line sizes for the paragraph shape. + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % The continuations: + \dimen2=\hsize \advance\dimen2 by -\defargsindent + % (plain.tex says that \dimen1 should be used only as global.) + \parshape 2 0in \dimen0 \defargsindent \dimen2 + % + % Put the type name to the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \exdentamount=\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% return value type + \ifx\temp\empty\else \tclose{\temp} \fi + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. +} + +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +% +\def\defunargs#1{% + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. Let's try @var for that. + \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% + #1% + \sl\hyphenchar\font=45 +} + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\[=\active \catcode`\]=\active + \catcode`\&=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +{ + \activeparens + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& + + \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + \gdef\magicamp{\let&=\amprm} +} + +\newcount\parencount + +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} + +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} + +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} + +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 +} + +\def\checkparencounts{% + \ifnum\parencount=0 \else \badparencount \fi + \ifnum\brackcount=0 \else \badbrackcount \fi +} +% these should not use \errmessage; the glibc manual, at least, actually +% has such constructs (when documenting function pointers). +\def\badparencount{% + \message{Warning: unbalanced parentheses in @def...}% + \global\parencount=0 +} +\def\badbrackcount{% + \message{Warning: unbalanced square brackets in @def...}% + \global\brackcount=0 +} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\undefined + \newwrite\macscribble + \def\scantokens#1{% + \toks0={#1}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \input \jobname.tmp + } +\fi + +\def\scanmacro#1{% + \begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % Undo catcode changes of \startcontents and \doprintindex + % When called from @insertcopying or (short)caption, we need active + % backslash to get it printed correctly. Previously, we had + % \catcode`\\=\other instead. We'll see whether a problem appears + % with macro expansion. --kasal, 19aug04 + \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ + % ... and \example + \spaceisspace + % + % Append \endinput to make sure that TeX does not see the ending newline. + % I've verified that it is necessary both for e-TeX and for ordinary TeX + % --kasal, 29nov03 + \scantokens{#1\endinput}% + \endgroup +} + +\def\scanexp#1{% + \edef\temp{\noexpand\scanmacro{#1}}% + \temp +} + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? + +% List of all defined macros in the form +% \definedummyword\macro1\definedummyword\macro2... +% Currently is also contains all @aliases; the list can be split +% if there is a need. +\def\macrolist{} + +% Add the macro to \macrolist +\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} +\def\addtomacrolistxxx#1{% + \toks0 = \expandafter{\macrolist\definedummyword#1}% + \xdef\macrolist{\the\toks0}% +} + +% Utility routines. +% This does \let #1 = #2, with \csnames; that is, +% \let \csname#1\endcsname = \csname#2\endcsname +% (except of course we have to play expansion games). +% +\def\cslet#1#2{% + \expandafter\let + \csname#1\expandafter\endcsname + \csname#2\endcsname +} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \ +% to recognize macro arguments; this is the job of \mbodybackslash. +% +% Non-ASCII encodings make 8-bit characters active, so un-activate +% them to avoid their expansion. Must do this non-globally, to +% confine the change to the current group. +% +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. +% +\def\scanctxt{% used as subroutine + \catcode`\"=\other + \catcode`\+=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\@=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\~=\other + \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi +} + +\def\scanargctxt{% used for copying and captions, not macros. + \scanctxt + \catcode`\\=\other + \catcode`\^^M=\other +} + +\def\macrobodyctxt{% used for @macro definitions + \scanctxt + \catcode`\{=\other + \catcode`\}=\other + \catcode`\^^M=\other + \usembodybackslash +} + +\def\macroargctxt{% used when scanning invocations + \scanctxt + \catcode`\\=0 +} +% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" +% for the single characters \ { }. Thus, we end up with the "commands" +% that would be written @\ @{ @} in a Texinfo document. +% +% We already have @{ and @}. For @\, we define it here, and only for +% this purpose, to produce a typewriter backslash (so, the @\ that we +% define for @math can't be used with @macro calls): +% +\def\\{\normalbackslash}% +% +% We would like to do this for \, too, since that is what makeinfo does. +% But it is not possible, because Texinfo already has a command @, for a +% cedilla accent. Documents must use @comma{} instead. +% +% \anythingelse will almost certainly be an error of some kind. + + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. +% +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\margbackslash#1{\char`\#1 } + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0 + \else + \expandafter\parsemargdef \argl;% + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + \addtomacrolist{\the\macname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\definedummyword\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx #1\relax + % remove this + \else + \noexpand\definedummyword \noexpand#1% + \fi +} + +% This makes use of the obscure feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname#1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.blah for each blah +% in the params list to be ##N where N is the position in that list. +% That gets used by \mbodybackslash (above). +% +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. + +\def\parsemargdef#1;{% + \paramno=0\def\paramlist{}% + \let\hash\relax + \let\xeatspaces\relax + \parsemargdefxxx#1,;,% +} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1 + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) +% +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% + +% This defines the macro itself. There are six cases: recursive and +% nonrecursive macros of zero, one, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +% +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \fi + \fi} + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg). +% +\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \macnamexxx} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Make them active and then expand them all to nothing. +% +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{% + {% + \expandafter\let\obeyedspace=\empty + \addtomacrolist{#1}% + \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% + }% + \next +} + + +\message{cross references,} + +\newwrite\auxfile +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +% +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=\node +\let\lastnode=\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +% +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \lastsection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +% +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +% +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \atdummies % preserve commands, but don't expand them + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 = \expandafter{\lastsection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout + }% + \fi +} + +% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is +% the node name, #2 the name of the Info cross-reference, #3 the printed +% node name, #4 the name of the Info file, #5 the name of the printed +% manual. All but the node name can be omitted. +% +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + \def\printedmanual{\ignorespaces #5}% + \def\printedrefname{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual\unskip}% + \setbox0=\hbox{\printedrefname\unskip}% + \ifdim \wd0 = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax + % Use the node name inside the square brackets. + \def\printedrefname{\ignorespaces #1}% + \else + % Use the actual chapter/section title appear inside + % the square brackets. Use the real section title if we have it. + \ifdim \wd1 > 0pt + % It is in another manual, so we don't have it. + \def\printedrefname{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printedrefname{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printedrefname{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % Make link in pdf output. + \ifpdf + {\indexnofonts + \turnoffactive + % This expands tokens, so do it after making catcode changes, so _ + % etc. don't get their TeX definitions. + \getfilename{#4}% + % + % See comments at \activebackslashdouble. + {\activebackslashdouble \xdef\pdfxrefdest{#1}% + \backslashparens\pdfxrefdest}% + % + \leavevmode + \startlink attr{/Border [0 0 0]}% + \ifnum\filenamelength>0 + goto file{\the\filename.pdf} name{\pdfxrefdest}% + \else + goto name{\pdfmkpgn{\pdfxrefdest}}% + \fi + }% + \setcolor{\linkcolor}% + \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \iffloat\Xthisreftitle + % If the user specified the print name (third arg) to the ref, + % print it instead of our usual "Figure 1.2". + \ifdim\wd0 = 0pt + \refx{#1-snt}{}% + \else + \printedrefname + \fi + % + % if the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME". + \ifdim \wd1 > 0pt + \space \putwordin{} \cite{\printedmanual}% + \fi + \else + % node/anchor (non-float) references. + % + % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not + % insert empty discretionaries after hyphens, which means that it will + % not find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, this + % is a loss. Therefore, we give the text of the node name again, so it + % is as if TeX is seeing it for the first time. + \ifdim \wd1 > 0pt + \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% + \else + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % output the `[mynode]' via a macro so it can be overridden. + \xrefprintnodename\printedrefname + % + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + \fi + \fi + \endlink +\endgroup} + +% This macro is called from \xrefX for the `[nodename]' part of xref +% output. It's a separate macro only so it can be changed more easily, +% since square brackets don't work well in some documents. Particularly +% one that Bob is working on :). +% +\def\xrefprintnodename#1{[#1]} + +% Things referred to by \setref. +% +\def\Ynothing{} +\def\Yomitfromtoc{} +\def\Ynumbered{% + \ifnum\secno=0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} +\def\Yappendix{% + \ifnum\secno=0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. +% +\def\refx#1#2{% + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname XR#1\endcsname + }% + \ifx\thisrefX\relax + % If not defined, say something at least. + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \fi + \else + % It's defined, so just use it. + \thisrefX + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + {% The node name might contain 8-bit characters, which in our current + % implementation are changed to commands like @'e. Don't let these + % mess up the control sequence name. + \indexnofonts + \turnoffactive + \xdef\safexrefname{#1}% + }% + % + \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR\safexrefname\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + % + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 = {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 = \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 + {\safexrefname}}% + \fi +} + +% Read the last existing aux file, if any. No error if none exists. +% +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readdatafile{aux}% + \global\havexrefstrue + \fi + \closein 1 +} + +\def\setupdatafile{% + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=\other + % + % Make the characters 128-255 be printing characters. + {% + \count1=128 + \def\loop{% + \catcode\count1=\other + \advance\count1 by 1 + \ifnum \count1<256 \loop \fi + }% + }% + % + % @ is our escape character in .aux files, and we need braces. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\@=0 +} + +\def\readdatafile#1{% +\begingroup + \setupdatafile + \input\jobname.#1 +\endgroup} + + +\message{insertions,} +% including footnotes. + +\newcount \footnoteno + +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for info output only. +\let\footnotestyle=\comment + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \dofootnote +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset (and anything else that uses +% \parseargline) fails inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\gdef\dofootnote{% + \insert\footins\bgroup + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \hsize=\pagewidth + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent = \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar = {\hang}% + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + \futurelet\next\fo@t +} +}%end \catcode `\@=11 + +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarly, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. + +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \nobreak\medskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \fi + % + % Leave vertical mode so that indentation from an enclosing + % environment such as @quotation is respected. On the other hand, if + % it's at the top level, we don't want the normal paragraph indentation. + \noindent + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode \medskip \fi % space after the standalone image +\endgroup} + + +% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, +% etc. We don't actually implement floating yet, we always include the +% float "here". But it seemed the best name for the future. +% +\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} + +% There may be a space before second and/or third parameter; delete it. +\def\eatcommaspace#1, {#1,} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +% +% #2 is the optional xref label. Also must be present for the float to +% be referable. +% +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, bottom). +% +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=\empty + \let\thisshortcaption=\empty + % + % don't lose footnotes inside @float. + % + % BEWARE: when the floats start float, we have to issue warning whenever an + % insert appears inside a float which could possibly float. --kasal, 26may04 + % + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. + % + \ifx\floattype\empty + \let\safefloattype=\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + % + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 + % + {% + % This magic value for \lastsection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + % + \edef\lastsection{\floatmagic=\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident = \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline = \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi + % + % caption text. + \appendtomacro\captionline{\scanexp\thiscaption}% + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + % + % Space below caption. + \vskip\parskip + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else nothing. + {% + \atdummies + % + % since we read the caption text in the macro world, where ^^M + % is turned into a normal character, we have to scan it back, so + % we don't write the literal three characters "^^M" into the aux file. + \scanexp{% + \xdef\noexpand\gtemp{% + \ifx\thisshortcaption\empty + \thiscaption + \else + \thisshortcaption + \fi + }% + }% + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident + \ifx\gtemp\empty \else : \gtemp \fi}}% + }% + \fi + \egroup % end of \vtop + % + % place the captured inserts + % + % BEWARE: when the floats start floating, we have to issue warning + % whenever an insert appears inside a float which could possibly + % float. --kasal, 26may04 + % + \checkinserts +} + +% Append the tokens #2 to the definition of macro #1, not expanding either. +% +\def\appendtomacro#1#2{% + \expandafter\def\expandafter#1\expandafter{#1#2}% +} + +% @caption, @shortcaption +% +\def\caption{\docaption\thiscaption} +\def\shortcaption{\docaption\thisshortcaption} +\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} +\def\defcaption#1#2{\egroup \def#1{#2}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +% +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \lastsection value which we \setref above. +% +\def\iffloat#1{\expandafter\doiffloat#1==\finish} +% +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +% +\def\doiffloat#1=#2=#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} + +% @listoffloats FLOATTYPE - print a list of floats like a table of contents. +% +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=\tocindent % indent these entries like a toc + \let\do=\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} + +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +% +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +% +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA = \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} + + +\message{localization,} + +% For single-language documents, @documentlanguage is usually given very +% early, just after @documentencoding. Single argument is the language +% (de) or locale (de_DE) abbreviation. +% +{ + \catcode`\_ = \active + \globaldefs=1 +\parseargdef\documentlanguage{\begingroup + \let_=\normalunderscore % normal _ character for filenames + \tex % read txi-??.tex file in plain TeX. + % Read the file by the name they passed if it exists. + \openin 1 txi-#1.tex + \ifeof 1 + \documentlanguagetrywithoutunderscore{#1_\finish}% + \else + \globaldefs = 1 % everything in the txi-LL files needs to persist + \input txi-#1.tex + \fi + \closein 1 + \endgroup % end raw TeX +\endgroup} +% +% If they passed de_DE, and txi-de_DE.tex doesn't exist, +% try txi-de.tex. +% +\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \globaldefs = 1 % everything in the txi-LL files needs to persist + \input txi-#1.tex + \fi + \closein 1 +} +}% end of special _ catcode +% +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? Putting it in the current +directory should work if nowhere else does.} + +% This macro is called from txi-??.tex files; the first argument is the +% \language name to set (without the "\lang@" prefix), the second and +% third args are \{left,right}hyphenmin. +% +% The language names to pass are determined when the format is built. +% See the etex.log file created at that time, e.g., +% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. +% +% With TeX Live 2008, etex now includes hyphenation patterns for all +% available languages. This means we can support hyphenation in +% Texinfo, at least to some extent. (This still doesn't solve the +% accented characters problem.) +% +\catcode`@=11 +\def\txisetlanguage#1#2#3{% + % do not set the language if the name is undefined in the current TeX. + \expandafter\ifx\csname lang@#1\endcsname \relax + \message{no patterns for #1}% + \else + \global\language = \csname lang@#1\endcsname + \fi + % but there is no harm in adjusting the hyphenmin values regardless. + \global\lefthyphenmin = #2\relax + \global\righthyphenmin = #3\relax +} + +% Helpers for encodings. +% Set the catcode of characters 128 through 255 to the specified number. +% +\def\setnonasciicharscatcode#1{% + \count255=128 + \loop\ifnum\count255<256 + \global\catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +\def\setnonasciicharscatcodenonglobal#1{% + \count255=128 + \loop\ifnum\count255<256 + \catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +% @documentencoding sets the definition of non-ASCII characters +% according to the specified encoding. +% +\parseargdef\documentencoding{% + % Encoding being declared for the document. + \def\declaredencoding{\csname #1.enc\endcsname}% + % + % Supported encodings: names converted to tokens in order to be able + % to compare them with \ifx. + \def\ascii{\csname US-ASCII.enc\endcsname}% + \def\latnine{\csname ISO-8859-15.enc\endcsname}% + \def\latone{\csname ISO-8859-1.enc\endcsname}% + \def\lattwo{\csname ISO-8859-2.enc\endcsname}% + \def\utfeight{\csname UTF-8.enc\endcsname}% + % + \ifx \declaredencoding \ascii + \asciichardefs + % + \else \ifx \declaredencoding \lattwo + \setnonasciicharscatcode\active + \lattwochardefs + % + \else \ifx \declaredencoding \latone + \setnonasciicharscatcode\active + \latonechardefs + % + \else \ifx \declaredencoding \latnine + \setnonasciicharscatcode\active + \latninechardefs + % + \else \ifx \declaredencoding \utfeight + \setnonasciicharscatcode\active + \utfeightchardefs + % + \else + \message{Unknown document encoding #1, ignoring.}% + % + \fi % utfeight + \fi % latnine + \fi % latone + \fi % lattwo + \fi % ascii +} + +% A message to be logged when using a character that isn't available +% the default font encoding (OT1). +% +\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} + +% Take account of \c (plain) vs. \, (Texinfo) difference. +\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} + +% First, make active non-ASCII characters in order for them to be +% correctly categorized when TeX reads the replacement text of +% macros containing the character definitions. +\setnonasciicharscatcode\active +% +% Latin1 (ISO-8859-1) character definitions. +\def\latonechardefs{% + \gdef^^a0{~} + \gdef^^a1{\exclamdown} + \gdef^^a2{\missingcharmsg{CENT SIGN}} + \gdef^^a3{{\pounds}} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\missingcharmsg{YEN SIGN}} + \gdef^^a6{\missingcharmsg{BROKEN BAR}} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\copyright} + \gdef^^aa{\ordf} + \gdef^^ab{\guillemetleft} + \gdef^^ac{$\lnot$} + \gdef^^ad{\-} + \gdef^^ae{\registeredsymbol} + \gdef^^af{\={}} + % + \gdef^^b0{\textdegree} + \gdef^^b1{$\pm$} + \gdef^^b2{$^2$} + \gdef^^b3{$^3$} + \gdef^^b4{\'{}} + \gdef^^b5{$\mu$} + \gdef^^b6{\P} + % + \gdef^^b7{$^.$} + \gdef^^b8{\cedilla\ } + \gdef^^b9{$^1$} + \gdef^^ba{\ordm} + % + \gdef^^bb{\guilletright} + \gdef^^bc{$1\over4$} + \gdef^^bd{$1\over2$} + \gdef^^be{$3\over4$} + \gdef^^bf{\questiondown} + % + \gdef^^c0{\`A} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\~A} + \gdef^^c4{\"A} + \gdef^^c5{\ringaccent A} + \gdef^^c6{\AE} + \gdef^^c7{\cedilla C} + \gdef^^c8{\`E} + \gdef^^c9{\'E} + \gdef^^ca{\^E} + \gdef^^cb{\"E} + \gdef^^cc{\`I} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\"I} + % + \gdef^^d0{\DH} + \gdef^^d1{\~N} + \gdef^^d2{\`O} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\~O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\O} + \gdef^^d9{\`U} + \gdef^^da{\'U} + \gdef^^db{\^U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\TH} + \gdef^^df{\ss} + % + \gdef^^e0{\`a} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\~a} + \gdef^^e4{\"a} + \gdef^^e5{\ringaccent a} + \gdef^^e6{\ae} + \gdef^^e7{\cedilla c} + \gdef^^e8{\`e} + \gdef^^e9{\'e} + \gdef^^ea{\^e} + \gdef^^eb{\"e} + \gdef^^ec{\`{\dotless i}} + \gdef^^ed{\'{\dotless i}} + \gdef^^ee{\^{\dotless i}} + \gdef^^ef{\"{\dotless i}} + % + \gdef^^f0{\dh} + \gdef^^f1{\~n} + \gdef^^f2{\`o} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\~o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\o} + \gdef^^f9{\`u} + \gdef^^fa{\'u} + \gdef^^fb{\^u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\th} + \gdef^^ff{\"y} +} + +% Latin9 (ISO-8859-15) encoding character definitions. +\def\latninechardefs{% + % Encoding is almost identical to Latin1. + \latonechardefs + % + \gdef^^a4{\euro} + \gdef^^a6{\v S} + \gdef^^a8{\v s} + \gdef^^b4{\v Z} + \gdef^^b8{\v z} + \gdef^^bc{\OE} + \gdef^^bd{\oe} + \gdef^^be{\"Y} +} + +% Latin2 (ISO-8859-2) character definitions. +\def\lattwochardefs{% + \gdef^^a0{~} + \gdef^^a1{\ogonek{A}} + \gdef^^a2{\u{}} + \gdef^^a3{\L} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\v L} + \gdef^^a6{\'S} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\v S} + \gdef^^aa{\cedilla S} + \gdef^^ab{\v T} + \gdef^^ac{\'Z} + \gdef^^ad{\-} + \gdef^^ae{\v Z} + \gdef^^af{\dotaccent Z} + % + \gdef^^b0{\textdegree} + \gdef^^b1{\ogonek{a}} + \gdef^^b2{\ogonek{ }} + \gdef^^b3{\l} + \gdef^^b4{\'{}} + \gdef^^b5{\v l} + \gdef^^b6{\'s} + \gdef^^b7{\v{}} + \gdef^^b8{\cedilla\ } + \gdef^^b9{\v s} + \gdef^^ba{\cedilla s} + \gdef^^bb{\v t} + \gdef^^bc{\'z} + \gdef^^bd{\H{}} + \gdef^^be{\v z} + \gdef^^bf{\dotaccent z} + % + \gdef^^c0{\'R} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\u A} + \gdef^^c4{\"A} + \gdef^^c5{\'L} + \gdef^^c6{\'C} + \gdef^^c7{\cedilla C} + \gdef^^c8{\v C} + \gdef^^c9{\'E} + \gdef^^ca{\ogonek{E}} + \gdef^^cb{\"E} + \gdef^^cc{\v E} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\v D} + % + \gdef^^d0{\DH} + \gdef^^d1{\'N} + \gdef^^d2{\v N} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\H O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\v R} + \gdef^^d9{\ringaccent U} + \gdef^^da{\'U} + \gdef^^db{\H U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\cedilla T} + \gdef^^df{\ss} + % + \gdef^^e0{\'r} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\u a} + \gdef^^e4{\"a} + \gdef^^e5{\'l} + \gdef^^e6{\'c} + \gdef^^e7{\cedilla c} + \gdef^^e8{\v c} + \gdef^^e9{\'e} + \gdef^^ea{\ogonek{e}} + \gdef^^eb{\"e} + \gdef^^ec{\v e} + \gdef^^ed{\'\i} + \gdef^^ee{\^\i} + \gdef^^ef{\v d} + % + \gdef^^f0{\dh} + \gdef^^f1{\'n} + \gdef^^f2{\v n} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\H o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\v r} + \gdef^^f9{\ringaccent u} + \gdef^^fa{\'u} + \gdef^^fb{\H u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\cedilla t} + \gdef^^ff{\dotaccent{}} +} + +% UTF-8 character definitions. +% +% This code to support UTF-8 is based on LaTeX's utf8.def, with some +% changes for Texinfo conventions. It is included here under the GPL by +% permission from Frank Mittelbach and the LaTeX team. +% +\newcount\countUTFx +\newcount\countUTFy +\newcount\countUTFz + +\gdef\UTFviiiTwoOctets#1#2{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\endcsname} +% +\gdef\UTFviiiThreeOctets#1#2#3{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} +% +\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} + +\gdef\UTFviiiDefined#1{% + \ifx #1\relax + \message{\linenumber Unicode char \string #1 not defined for Texinfo}% + \else + \expandafter #1% + \fi +} + +\begingroup + \catcode`\~13 + \catcode`\"12 + + \def\UTFviiiLoop{% + \global\catcode\countUTFx\active + \uccode`\~\countUTFx + \uppercase\expandafter{\UTFviiiTmp}% + \advance\countUTFx by 1 + \ifnum\countUTFx < \countUTFy + \expandafter\UTFviiiLoop + \fi} + + \countUTFx = "C2 + \countUTFy = "E0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiTwoOctets\string~}} + \UTFviiiLoop + + \countUTFx = "E0 + \countUTFy = "F0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiThreeOctets\string~}} + \UTFviiiLoop + + \countUTFx = "F0 + \countUTFy = "F4 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiFourOctets\string~}} + \UTFviiiLoop +\endgroup + +\begingroup + \catcode`\"=12 + \catcode`\<=12 + \catcode`\.=12 + \catcode`\,=12 + \catcode`\;=12 + \catcode`\!=12 + \catcode`\~=13 + + \gdef\DeclareUnicodeCharacter#1#2{% + \countUTFz = "#1\relax + \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% + \begingroup + \parseXMLCharref + \def\UTFviiiTwoOctets##1##2{% + \csname u8:##1\string ##2\endcsname}% + \def\UTFviiiThreeOctets##1##2##3{% + \csname u8:##1\string ##2\string ##3\endcsname}% + \def\UTFviiiFourOctets##1##2##3##4{% + \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \gdef\UTFviiiTmp{#2}% + \endgroup} + + \gdef\parseXMLCharref{% + \ifnum\countUTFz < "A0\relax + \errhelp = \EMsimple + \errmessage{Cannot define Unicode char value < 00A0}% + \else\ifnum\countUTFz < "800\relax + \parseUTFviiiA,% + \parseUTFviiiB C\UTFviiiTwoOctets.,% + \else\ifnum\countUTFz < "10000\relax + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% + \else + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiA!% + \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% + \fi\fi\fi + } + + \gdef\parseUTFviiiA#1{% + \countUTFx = \countUTFz + \divide\countUTFz by 64 + \countUTFy = \countUTFz + \multiply\countUTFz by 64 + \advance\countUTFx by -\countUTFz + \advance\countUTFx by 128 + \uccode `#1\countUTFx + \countUTFz = \countUTFy} + + \gdef\parseUTFviiiB#1#2#3#4{% + \advance\countUTFz by "#10\relax + \uccode `#3\countUTFz + \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} +\endgroup + +\def\utfeightchardefs{% + \DeclareUnicodeCharacter{00A0}{\tie} + \DeclareUnicodeCharacter{00A1}{\exclamdown} + \DeclareUnicodeCharacter{00A3}{\pounds} + \DeclareUnicodeCharacter{00A8}{\"{ }} + \DeclareUnicodeCharacter{00A9}{\copyright} + \DeclareUnicodeCharacter{00AA}{\ordf} + \DeclareUnicodeCharacter{00AB}{\guillemetleft} + \DeclareUnicodeCharacter{00AD}{\-} + \DeclareUnicodeCharacter{00AE}{\registeredsymbol} + \DeclareUnicodeCharacter{00AF}{\={ }} + + \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} + \DeclareUnicodeCharacter{00B4}{\'{ }} + \DeclareUnicodeCharacter{00B8}{\cedilla{ }} + \DeclareUnicodeCharacter{00BA}{\ordm} + \DeclareUnicodeCharacter{00BB}{\guillemetright} + \DeclareUnicodeCharacter{00BF}{\questiondown} + + \DeclareUnicodeCharacter{00C0}{\`A} + \DeclareUnicodeCharacter{00C1}{\'A} + \DeclareUnicodeCharacter{00C2}{\^A} + \DeclareUnicodeCharacter{00C3}{\~A} + \DeclareUnicodeCharacter{00C4}{\"A} + \DeclareUnicodeCharacter{00C5}{\AA} + \DeclareUnicodeCharacter{00C6}{\AE} + \DeclareUnicodeCharacter{00C7}{\cedilla{C}} + \DeclareUnicodeCharacter{00C8}{\`E} + \DeclareUnicodeCharacter{00C9}{\'E} + \DeclareUnicodeCharacter{00CA}{\^E} + \DeclareUnicodeCharacter{00CB}{\"E} + \DeclareUnicodeCharacter{00CC}{\`I} + \DeclareUnicodeCharacter{00CD}{\'I} + \DeclareUnicodeCharacter{00CE}{\^I} + \DeclareUnicodeCharacter{00CF}{\"I} + + \DeclareUnicodeCharacter{00D0}{\DH} + \DeclareUnicodeCharacter{00D1}{\~N} + \DeclareUnicodeCharacter{00D2}{\`O} + \DeclareUnicodeCharacter{00D3}{\'O} + \DeclareUnicodeCharacter{00D4}{\^O} + \DeclareUnicodeCharacter{00D5}{\~O} + \DeclareUnicodeCharacter{00D6}{\"O} + \DeclareUnicodeCharacter{00D8}{\O} + \DeclareUnicodeCharacter{00D9}{\`U} + \DeclareUnicodeCharacter{00DA}{\'U} + \DeclareUnicodeCharacter{00DB}{\^U} + \DeclareUnicodeCharacter{00DC}{\"U} + \DeclareUnicodeCharacter{00DD}{\'Y} + \DeclareUnicodeCharacter{00DE}{\TH} + \DeclareUnicodeCharacter{00DF}{\ss} + + \DeclareUnicodeCharacter{00E0}{\`a} + \DeclareUnicodeCharacter{00E1}{\'a} + \DeclareUnicodeCharacter{00E2}{\^a} + \DeclareUnicodeCharacter{00E3}{\~a} + \DeclareUnicodeCharacter{00E4}{\"a} + \DeclareUnicodeCharacter{00E5}{\aa} + \DeclareUnicodeCharacter{00E6}{\ae} + \DeclareUnicodeCharacter{00E7}{\cedilla{c}} + \DeclareUnicodeCharacter{00E8}{\`e} + \DeclareUnicodeCharacter{00E9}{\'e} + \DeclareUnicodeCharacter{00EA}{\^e} + \DeclareUnicodeCharacter{00EB}{\"e} + \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} + \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} + \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} + \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} + + \DeclareUnicodeCharacter{00F0}{\dh} + \DeclareUnicodeCharacter{00F1}{\~n} + \DeclareUnicodeCharacter{00F2}{\`o} + \DeclareUnicodeCharacter{00F3}{\'o} + \DeclareUnicodeCharacter{00F4}{\^o} + \DeclareUnicodeCharacter{00F5}{\~o} + \DeclareUnicodeCharacter{00F6}{\"o} + \DeclareUnicodeCharacter{00F8}{\o} + \DeclareUnicodeCharacter{00F9}{\`u} + \DeclareUnicodeCharacter{00FA}{\'u} + \DeclareUnicodeCharacter{00FB}{\^u} + \DeclareUnicodeCharacter{00FC}{\"u} + \DeclareUnicodeCharacter{00FD}{\'y} + \DeclareUnicodeCharacter{00FE}{\th} + \DeclareUnicodeCharacter{00FF}{\"y} + + \DeclareUnicodeCharacter{0100}{\=A} + \DeclareUnicodeCharacter{0101}{\=a} + \DeclareUnicodeCharacter{0102}{\u{A}} + \DeclareUnicodeCharacter{0103}{\u{a}} + \DeclareUnicodeCharacter{0104}{\ogonek{A}} + \DeclareUnicodeCharacter{0105}{\ogonek{a}} + \DeclareUnicodeCharacter{0106}{\'C} + \DeclareUnicodeCharacter{0107}{\'c} + \DeclareUnicodeCharacter{0108}{\^C} + \DeclareUnicodeCharacter{0109}{\^c} + \DeclareUnicodeCharacter{0118}{\ogonek{E}} + \DeclareUnicodeCharacter{0119}{\ogonek{e}} + \DeclareUnicodeCharacter{010A}{\dotaccent{C}} + \DeclareUnicodeCharacter{010B}{\dotaccent{c}} + \DeclareUnicodeCharacter{010C}{\v{C}} + \DeclareUnicodeCharacter{010D}{\v{c}} + \DeclareUnicodeCharacter{010E}{\v{D}} + + \DeclareUnicodeCharacter{0112}{\=E} + \DeclareUnicodeCharacter{0113}{\=e} + \DeclareUnicodeCharacter{0114}{\u{E}} + \DeclareUnicodeCharacter{0115}{\u{e}} + \DeclareUnicodeCharacter{0116}{\dotaccent{E}} + \DeclareUnicodeCharacter{0117}{\dotaccent{e}} + \DeclareUnicodeCharacter{011A}{\v{E}} + \DeclareUnicodeCharacter{011B}{\v{e}} + \DeclareUnicodeCharacter{011C}{\^G} + \DeclareUnicodeCharacter{011D}{\^g} + \DeclareUnicodeCharacter{011E}{\u{G}} + \DeclareUnicodeCharacter{011F}{\u{g}} + + \DeclareUnicodeCharacter{0120}{\dotaccent{G}} + \DeclareUnicodeCharacter{0121}{\dotaccent{g}} + \DeclareUnicodeCharacter{0124}{\^H} + \DeclareUnicodeCharacter{0125}{\^h} + \DeclareUnicodeCharacter{0128}{\~I} + \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} + \DeclareUnicodeCharacter{012A}{\=I} + \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} + \DeclareUnicodeCharacter{012C}{\u{I}} + \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} + + \DeclareUnicodeCharacter{0130}{\dotaccent{I}} + \DeclareUnicodeCharacter{0131}{\dotless{i}} + \DeclareUnicodeCharacter{0132}{IJ} + \DeclareUnicodeCharacter{0133}{ij} + \DeclareUnicodeCharacter{0134}{\^J} + \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} + \DeclareUnicodeCharacter{0139}{\'L} + \DeclareUnicodeCharacter{013A}{\'l} + + \DeclareUnicodeCharacter{0141}{\L} + \DeclareUnicodeCharacter{0142}{\l} + \DeclareUnicodeCharacter{0143}{\'N} + \DeclareUnicodeCharacter{0144}{\'n} + \DeclareUnicodeCharacter{0147}{\v{N}} + \DeclareUnicodeCharacter{0148}{\v{n}} + \DeclareUnicodeCharacter{014C}{\=O} + \DeclareUnicodeCharacter{014D}{\=o} + \DeclareUnicodeCharacter{014E}{\u{O}} + \DeclareUnicodeCharacter{014F}{\u{o}} + + \DeclareUnicodeCharacter{0150}{\H{O}} + \DeclareUnicodeCharacter{0151}{\H{o}} + \DeclareUnicodeCharacter{0152}{\OE} + \DeclareUnicodeCharacter{0153}{\oe} + \DeclareUnicodeCharacter{0154}{\'R} + \DeclareUnicodeCharacter{0155}{\'r} + \DeclareUnicodeCharacter{0158}{\v{R}} + \DeclareUnicodeCharacter{0159}{\v{r}} + \DeclareUnicodeCharacter{015A}{\'S} + \DeclareUnicodeCharacter{015B}{\'s} + \DeclareUnicodeCharacter{015C}{\^S} + \DeclareUnicodeCharacter{015D}{\^s} + \DeclareUnicodeCharacter{015E}{\cedilla{S}} + \DeclareUnicodeCharacter{015F}{\cedilla{s}} + + \DeclareUnicodeCharacter{0160}{\v{S}} + \DeclareUnicodeCharacter{0161}{\v{s}} + \DeclareUnicodeCharacter{0162}{\cedilla{t}} + \DeclareUnicodeCharacter{0163}{\cedilla{T}} + \DeclareUnicodeCharacter{0164}{\v{T}} + + \DeclareUnicodeCharacter{0168}{\~U} + \DeclareUnicodeCharacter{0169}{\~u} + \DeclareUnicodeCharacter{016A}{\=U} + \DeclareUnicodeCharacter{016B}{\=u} + \DeclareUnicodeCharacter{016C}{\u{U}} + \DeclareUnicodeCharacter{016D}{\u{u}} + \DeclareUnicodeCharacter{016E}{\ringaccent{U}} + \DeclareUnicodeCharacter{016F}{\ringaccent{u}} + + \DeclareUnicodeCharacter{0170}{\H{U}} + \DeclareUnicodeCharacter{0171}{\H{u}} + \DeclareUnicodeCharacter{0174}{\^W} + \DeclareUnicodeCharacter{0175}{\^w} + \DeclareUnicodeCharacter{0176}{\^Y} + \DeclareUnicodeCharacter{0177}{\^y} + \DeclareUnicodeCharacter{0178}{\"Y} + \DeclareUnicodeCharacter{0179}{\'Z} + \DeclareUnicodeCharacter{017A}{\'z} + \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} + \DeclareUnicodeCharacter{017C}{\dotaccent{z}} + \DeclareUnicodeCharacter{017D}{\v{Z}} + \DeclareUnicodeCharacter{017E}{\v{z}} + + \DeclareUnicodeCharacter{01C4}{D\v{Z}} + \DeclareUnicodeCharacter{01C5}{D\v{z}} + \DeclareUnicodeCharacter{01C6}{d\v{z}} + \DeclareUnicodeCharacter{01C7}{LJ} + \DeclareUnicodeCharacter{01C8}{Lj} + \DeclareUnicodeCharacter{01C9}{lj} + \DeclareUnicodeCharacter{01CA}{NJ} + \DeclareUnicodeCharacter{01CB}{Nj} + \DeclareUnicodeCharacter{01CC}{nj} + \DeclareUnicodeCharacter{01CD}{\v{A}} + \DeclareUnicodeCharacter{01CE}{\v{a}} + \DeclareUnicodeCharacter{01CF}{\v{I}} + + \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} + \DeclareUnicodeCharacter{01D1}{\v{O}} + \DeclareUnicodeCharacter{01D2}{\v{o}} + \DeclareUnicodeCharacter{01D3}{\v{U}} + \DeclareUnicodeCharacter{01D4}{\v{u}} + + \DeclareUnicodeCharacter{01E2}{\={\AE}} + \DeclareUnicodeCharacter{01E3}{\={\ae}} + \DeclareUnicodeCharacter{01E6}{\v{G}} + \DeclareUnicodeCharacter{01E7}{\v{g}} + \DeclareUnicodeCharacter{01E8}{\v{K}} + \DeclareUnicodeCharacter{01E9}{\v{k}} + + \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} + \DeclareUnicodeCharacter{01F1}{DZ} + \DeclareUnicodeCharacter{01F2}{Dz} + \DeclareUnicodeCharacter{01F3}{dz} + \DeclareUnicodeCharacter{01F4}{\'G} + \DeclareUnicodeCharacter{01F5}{\'g} + \DeclareUnicodeCharacter{01F8}{\`N} + \DeclareUnicodeCharacter{01F9}{\`n} + \DeclareUnicodeCharacter{01FC}{\'{\AE}} + \DeclareUnicodeCharacter{01FD}{\'{\ae}} + \DeclareUnicodeCharacter{01FE}{\'{\O}} + \DeclareUnicodeCharacter{01FF}{\'{\o}} + + \DeclareUnicodeCharacter{021E}{\v{H}} + \DeclareUnicodeCharacter{021F}{\v{h}} + + \DeclareUnicodeCharacter{0226}{\dotaccent{A}} + \DeclareUnicodeCharacter{0227}{\dotaccent{a}} + \DeclareUnicodeCharacter{0228}{\cedilla{E}} + \DeclareUnicodeCharacter{0229}{\cedilla{e}} + \DeclareUnicodeCharacter{022E}{\dotaccent{O}} + \DeclareUnicodeCharacter{022F}{\dotaccent{o}} + + \DeclareUnicodeCharacter{0232}{\=Y} + \DeclareUnicodeCharacter{0233}{\=y} + \DeclareUnicodeCharacter{0237}{\dotless{j}} + + \DeclareUnicodeCharacter{02DB}{\ogonek{ }} + + \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} + \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} + \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} + \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} + \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} + \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} + \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} + \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} + \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} + \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} + \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} + \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} + + \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} + \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} + + \DeclareUnicodeCharacter{1E20}{\=G} + \DeclareUnicodeCharacter{1E21}{\=g} + \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} + \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} + \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} + \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} + \DeclareUnicodeCharacter{1E26}{\"H} + \DeclareUnicodeCharacter{1E27}{\"h} + + \DeclareUnicodeCharacter{1E30}{\'K} + \DeclareUnicodeCharacter{1E31}{\'k} + \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} + \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} + \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} + \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} + \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} + \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} + \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} + \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} + \DeclareUnicodeCharacter{1E3E}{\'M} + \DeclareUnicodeCharacter{1E3F}{\'m} + + \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} + \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} + \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} + \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} + \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} + \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} + \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} + \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} + \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} + \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} + + \DeclareUnicodeCharacter{1E54}{\'P} + \DeclareUnicodeCharacter{1E55}{\'p} + \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} + \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} + \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} + \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} + \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} + \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} + \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} + \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} + + \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} + \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} + \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} + \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} + \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} + \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} + \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} + \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} + \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} + \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} + + \DeclareUnicodeCharacter{1E7C}{\~V} + \DeclareUnicodeCharacter{1E7D}{\~v} + \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} + \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} + + \DeclareUnicodeCharacter{1E80}{\`W} + \DeclareUnicodeCharacter{1E81}{\`w} + \DeclareUnicodeCharacter{1E82}{\'W} + \DeclareUnicodeCharacter{1E83}{\'w} + \DeclareUnicodeCharacter{1E84}{\"W} + \DeclareUnicodeCharacter{1E85}{\"w} + \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} + \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} + \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} + \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} + \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} + \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} + \DeclareUnicodeCharacter{1E8C}{\"X} + \DeclareUnicodeCharacter{1E8D}{\"x} + \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} + \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} + + \DeclareUnicodeCharacter{1E90}{\^Z} + \DeclareUnicodeCharacter{1E91}{\^z} + \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} + \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} + \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} + \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} + \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} + \DeclareUnicodeCharacter{1E97}{\"t} + \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} + \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} + + \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} + \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} + + \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} + \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} + \DeclareUnicodeCharacter{1EBC}{\~E} + \DeclareUnicodeCharacter{1EBD}{\~e} + + \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} + \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} + \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} + \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} + + \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} + \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} + + \DeclareUnicodeCharacter{1EF2}{\`Y} + \DeclareUnicodeCharacter{1EF3}{\`y} + \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} + + \DeclareUnicodeCharacter{1EF8}{\~Y} + \DeclareUnicodeCharacter{1EF9}{\~y} + + \DeclareUnicodeCharacter{2013}{--} + \DeclareUnicodeCharacter{2014}{---} + \DeclareUnicodeCharacter{2018}{\quoteleft} + \DeclareUnicodeCharacter{2019}{\quoteright} + \DeclareUnicodeCharacter{201A}{\quotesinglbase} + \DeclareUnicodeCharacter{201C}{\quotedblleft} + \DeclareUnicodeCharacter{201D}{\quotedblright} + \DeclareUnicodeCharacter{201E}{\quotedblbase} + \DeclareUnicodeCharacter{2022}{\bullet} + \DeclareUnicodeCharacter{2026}{\dots} + \DeclareUnicodeCharacter{2039}{\guilsinglleft} + \DeclareUnicodeCharacter{203A}{\guilsinglright} + \DeclareUnicodeCharacter{20AC}{\euro} + + \DeclareUnicodeCharacter{2192}{\expansion} + \DeclareUnicodeCharacter{21D2}{\result} + + \DeclareUnicodeCharacter{2212}{\minus} + \DeclareUnicodeCharacter{2217}{\point} + \DeclareUnicodeCharacter{2261}{\equiv} +}% end of \utfeightchardefs + + +% US-ASCII character definitions. +\def\asciichardefs{% nothing need be done + \relax +} + +% Make non-ASCII characters printable again for compatibility with +% existing Texinfo documents that may use them, even without declaring a +% document encoding. +% +\setnonasciicharscatcode \other + + +\message{formatting,} + +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be very finicky about underfull hboxes, either. +\hbadness = 6666 + +% Following George Bush, get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; +% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; +% 7) physical page height; 8) physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \hsize + % + \normaloffset = #4\relax + \bindingoffset = #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + % if we don't reset these, they will remain at "1 true in" of + % whatever layout pdftex was dumped with. + \pdfhorigin = 1 true in + \pdfvorigin = 1 true in + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{607.2pt}{6in}% that's 46 lines + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.25 trim size. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {-.2in}{0in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @smallerbook to reset parameters for 6x9 trim size. +% (Just testing, parameters still in flux.) +\def\smallerbook{{\globaldefs = 1 + \parskip = 1.5pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.4in}{4.8in}% + {-.2in}{-.4in}% + {0pt}{14pt}% + {9in}{6in}% + % + \lispnarrowing = 0.25in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .4cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{673.2pt}{160mm}% that's 51 lines + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1\relax + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +% DEL is a comment character, in case @c does not suffice. +\catcode`\^^? = 14 + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\catcode`\$=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} +\def\normaldollar{$}%$ font-lock fix + +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt\char126}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +\let\realunder=_ +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\catcode`\|=\active +\def|{{\tt\char124}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +\catcode`\$=\active +\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +% Used sometimes to turn off (effectively) the active characters even after +% parsing them. +\def\turnoffactive{% + \normalturnoffactive + \otherbackslash +} + +\catcode`\@=0 + +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=`\\ +\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work + +% \realbackslash is an actual character `\' with catcode other, and +% \doublebackslash is two of them (for the pdf outlines). +{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} + +% In texinfo, backslash is an active character; it prints the backslash +% in fixed width font. +\catcode`\\=\active +@def@normalbackslash{{@tt@backslashcurfont}} +% On startup, @fixbackslash assigns: +% @let \ = @normalbackslash + +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. +@gdef@rawbackslash{@let\=@backslashcurfont} +@gdef@otherbackslash{@let\=@realbackslash} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. +% +@def@normalturnoffactive{% + @let\=@normalbackslash + @let"=@normaldoublequote + @let~=@normaltilde + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let<=@normalless + @let>=@normalgreater + @let+=@normalplus + @let$=@normaldollar %$ font-lock fix + @markupsetuplqdefault + @markupsetuprqdefault + @unsepspaces +} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\' in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also turn back on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These look ok in all fonts, so just make them not special. +@catcode`@& = @other +@catcode`@# = @other +@catcode`@% = @other + +@c Finally, make ` and ' active, so that txicodequoteundirected and +@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we +@c don't make ` and ' active, @code will not get them as active chars. +@c Do this last of all since we use ` in the previous @catcode assignments. +@catcode`@'=@active +@catcode`@`=@active +@markupsetuplqdefault +@markupsetuprqdefault + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: + +@c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore diff --git a/config/uintmax_t.m4 b/config/uintmax_t.m4 new file mode 100644 index 0000000..b5f28d4 --- /dev/null +++ b/config/uintmax_t.m4 @@ -0,0 +1,32 @@ +# uintmax_t.m4 serial 7 (gettext-0.12) +dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define uintmax_t to 'unsigned long' or 'unsigned long long' +# if it is not already defined in or . + +AC_DEFUN([jm_AC_TYPE_UINTMAX_T], +[ + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then + AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) + test $ac_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, + [Define to unsigned long or unsigned long long + if and don't define.]) + else + AC_DEFINE(HAVE_UINTMAX_T, 1, + [Define if you have the 'uintmax_t' type in or .]) + fi +]) diff --git a/config/ulonglong.m4 b/config/ulonglong.m4 new file mode 100644 index 0000000..1da8b80 --- /dev/null +++ b/config/ulonglong.m4 @@ -0,0 +1,25 @@ +# ulonglong.m4 serial 3 +dnl Copyright (C) 1999-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works. + +AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], +[ + AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, + [AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;], + [unsigned long long ullmax = (unsigned long long) -1; + return ull << i | ull >> i | ullmax / ull | ullmax % ull;], + ac_cv_type_unsigned_long_long=yes, + ac_cv_type_unsigned_long_long=no)]) + if test $ac_cv_type_unsigned_long_long = yes; then + AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, + [Define if you have the 'unsigned long long' type.]) + fi +]) diff --git a/config/wchar_t.m4 b/config/wchar_t.m4 new file mode 100644 index 0000000..d8fd1ec --- /dev/null +++ b/config/wchar_t.m4 @@ -0,0 +1,22 @@ +# wchar_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether has the 'wchar_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WCHAR_T], +[ + AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, + [AC_TRY_COMPILE([#include + wchar_t foo = (wchar_t)'\0';], , + gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) + if test $gt_cv_c_wchar_t = yes; then + AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) + fi +]) diff --git a/config/wint_t.m4 b/config/wint_t.m4 new file mode 100644 index 0000000..3d8d215 --- /dev/null +++ b/config/wint_t.m4 @@ -0,0 +1,22 @@ +# wint_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether has the 'wint_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WINT_T], +[ + AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, + [AC_TRY_COMPILE([#include + wint_t foo = (wchar_t)'\0';], , + gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) + if test $gt_cv_c_wint_t = yes; then + AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) + fi +]) diff --git a/config/xsize.m4 b/config/xsize.m4 new file mode 100644 index 0000000..9b7cf9b --- /dev/null +++ b/config/xsize.m4 @@ -0,0 +1,14 @@ +# xsize.m4 serial 2 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_XSIZE], +[ + dnl Prerequisites of lib/xsize.h. + AC_REQUIRE([gl_SIZE_MAX]) + AC_CHECK_HEADERS(stdint.h) +]) diff --git a/configh.dos b/configh.dos new file mode 100644 index 0000000..ee840f4 --- /dev/null +++ b/configh.dos @@ -0,0 +1,121 @@ +/* configh.dos -- hand-massaged config.h file for MS-DOS builds -*-C-*- + +Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, +2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +/* Include this header to make __DJGPP_MINOR__ available because DJGPP ports + of GCC 4.3.0 and later no longer do it automatically. */ +#include + +/* Many things are defined already by a system header. */ +#include + +#if __DJGPP__ > 2 || __DJGPP_MINOR__ > 1 + +/* Define to 1 if `sys_siglist' is declared by or . */ +# define SYS_SIGLIST_DECLARED 1 + +/* Define to 1 if the C library defines the variable `_sys_siglist'. */ +# define HAVE_DECL_SYS_SIGLIST 1 + +#else + +/* Define NSIG. */ +# define NSIG SIGMAX + +#endif + +/* Use high resolution file timestamps if nonzero. */ +#define FILE_TIMESTAMP_HI_RES 0 + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have the fdopen function. */ +#define HAVE_FDOPEN 1 + +/* Define to 1 if you have the `getgroups' function. */ +#define HAVE_GETGROUPS 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the mkstemp function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have the `mktemp' function. */ +#define HAVE_MKTEMP 1 + +/* Define to 1 if you have the `setlinebuf' function. */ +#define HAVE_SETLINEBUF 1 + +/* Define to 1 if you have the `setvbuf' function. */ +#define HAVE_SETVBUF 1 + +#define SCCS_GET "get" + +/* Define to `unsigned long' or `unsigned long long' + if doesn't define. */ +#define uintmax_t unsigned long long + +/* Define the type of the first arg to select(). */ +#define fd_set_size_t int + +/* Define to 1 if you have the select function. */ +#define HAVE_SELECT 1 + +/* Define to 1 if your compiler conforms to the ANSI C standard. */ +#define HAVE_ANSI_COMPILER 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the vprintf library function. */ +#undef HAVE_VPRINTF +#define HAVE_VPRINTF 1 + +/* Define to 1 if you have the stricmp function. */ +#define HAVE_STRICMP 1 + +/* Name of the package */ +#define PACKAGE "make" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "bug-make@gnu.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "GNU make" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "GNU make 3.82" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "make" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.82" + +/* Define to 1 if the C compiler supports function prototypes. */ +#define PROTOTYPES 1 + +/* Version number of package */ +#define VERSION "3.82" + +/* Build host information. */ +#define MAKE_HOST "i386-pc-msdosdjgpp" + +/* Grok DOS paths (drive specs and backslash path element separators) */ +#define HAVE_DOS_PATHS diff --git a/configure b/configure new file mode 100755 index 0000000..130f4f8 --- /dev/null +++ b/configure @@ -0,0 +1,10917 @@ +#! /bin/sh +# From configure.in Id: configure.in,v 1.156 2010/07/28 05:39:50 psmith Exp . +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.65 for GNU make 3.82. +# +# Report bugs to . +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and bug-make@gnu.org +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='GNU make' +PACKAGE_TARNAME='make' +PACKAGE_VERSION='3.82' +PACKAGE_STRING='GNU make 3.82' +PACKAGE_BUGREPORT='bug-make@gnu.org' +PACKAGE_URL='http://www.gnu.org/software/make/' + +ac_unique_file="vpath.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +WINDOWSENV_FALSE +WINDOWSENV_TRUE +MAKE_HOST +USE_LOCAL_GLOB_FALSE +USE_LOCAL_GLOB_TRUE +GLOBLIB +GLOBINC +USE_CUSTOMS_FALSE +USE_CUSTOMS_TRUE +REMOTE +GETLOADAVG_LIBS +KMEM_GROUP +NEED_SETGID +LIBOBJS +ALLOCA +POSUB +LTLIBINTL +LIBINTL +INTLLIBS +LTLIBICONV +LIBICONV +MSGMERGE +XGETTEXT +GMSGFMT +MSGFMT +USE_NLS +MKINSTALLDIRS +EGREP +GREP +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +PERL +AR +CPP +RANLIB +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='MAINT_MAKEFILE' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_nls +with_gnu_ld +enable_rpath +with_libiconv_prefix +with_libintl_prefix +enable_largefile +with_customs +enable_case_insensitive_file_system +enable_job_server +with_dmalloc +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information." + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures GNU make 3.82 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/make] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of GNU make 3.82:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --disable-nls do not use Native Language Support + --disable-rpath do not hardcode runtime library paths + --disable-largefile omit support for large files + --enable-case-insensitive-file-system + assume file systems are case insensitive + --disable-job-server disallow recursive make communication during -jN + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib + --without-libintl-prefix don't search for libintl in includedir and libdir + --with-customs=DIR enable remote jobs via Customs--see README.customs + --with-dmalloc use dmalloc, as in + http://www.dmalloc.com/dmalloc.tar.gz + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +GNU make home page: . +General help using GNU software: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +GNU make configure 3.82 +generated by GNU Autoconf 2.65 + +Copyright (C) 2009 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( cat <<\_ASBOX +## ------------------------------- ## +## Report this to bug-make@gnu.org ## +## ------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_type + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func + +# ac_fn_c_check_decl LINENO SYMBOL VAR +# ------------------------------------ +# Tests whether SYMBOL is declared, setting cache variable VAR accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared" >&5 +$as_echo_n "checking whether $2 is declared... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $2 + (void) $2; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_decl + +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + eval "$4=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$4 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_member +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by GNU make $as_me 3.82, which was +generated by GNU Autoconf 2.65. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + +# Autoconf setup +ac_aux_dir= +for ac_dir in config "$srcdir"/config; do + for ac_t in install-sh install.sh shtool; do + if test -f "$ac_dir/$ac_t"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/$ac_t -c" + break 2 + fi + done +done +if test -z "$ac_aux_dir"; then + as_fn_error "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +ac_config_headers="$ac_config_headers config.h" + + +# Automake setup +am__api_version='1.11' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='make' + VERSION='3.82' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +# Checks for programs. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "C compiler cannot create executables +See \`config.log' for more details." "$LINENO" 5; }; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of object files: cannot compile +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +# Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Perl is needed for the test suite (only) +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PERL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PERL"; then + ac_cv_prog_PERL="$PERL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PERL="perl" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_PERL" && ac_cv_prog_PERL="perl" +fi +fi +PERL=$ac_cv_prog_PERL +if test -n "$PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 +$as_echo "$PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +# Specialized system macros +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = x""yes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strerror in -lcposix" >&5 +$as_echo_n "checking for strerror in -lcposix... " >&6; } +if test "${ac_cv_lib_cposix_strerror+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (); +int +main () +{ +return strerror (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_cposix_strerror=yes +else + ac_cv_lib_cposix_strerror=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cposix_strerror" >&5 +$as_echo "$ac_cv_lib_cposix_strerror" >&6; } +if test "x$ac_cv_lib_cposix_strerror" = x""yes; then : + LIBS="$LIBS -lcposix" +fi + + + + + +# Enable gettext, in "external" mode. + + + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + case "$ac_aux_dir" in + /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; + *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; + esac + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 +$as_echo_n "checking whether NLS is requested... " >&6; } + # Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; USE_NLS=$enableval +else + USE_NLS=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + + + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_MSGFMT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGFMT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_GMSGFMT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_XGETTEXT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case "$XGETTEXT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + rm -f messages.po + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_MSGMERGE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGMERGE" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then + ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" + ;; +esac +fi +MSGMERGE="$ac_cv_path_MSGMERGE" +if test "$MSGMERGE" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 +$as_echo "$MSGMERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$GMSGFMT" != ":"; then + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 +$as_echo "found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; } + GMSGFMT=":" + fi + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 +$as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } + XGETTEXT=":" + fi + rm -f messages.po + fi + + ac_config_commands="$ac_config_commands default-1" + + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 +$as_echo_n "checking for ld used by GCC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${acl_cv_path_LD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${acl_cv_prog_gnu_ld+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +$as_echo_n "checking for shared library run path origin... " >&6; } +if test "${acl_cv_rpath+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +$as_echo "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then : + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then : + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 +$as_echo_n "checking whether NLS is requested... " >&6; } + # Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; USE_NLS=$enableval +else + USE_NLS=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + + + + + LIBINTL= + LTLIBINTL= + POSUB= + + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 +$as_echo_n "checking for GNU gettext in libc... " >&6; } +if test "${gt_cv_func_gnugettext1_libc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_gnugettext1_libc=yes +else + gt_cv_func_gnugettext1_libc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libc" >&5 +$as_echo "$gt_cv_func_gnugettext1_libc" >&6; } + + if test "$gt_cv_func_gnugettext1_libc" != "yes"; then + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +$as_echo_n "checking for iconv... " >&6; } +if test "${am_cv_func_iconv+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +$as_echo "$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + +$as_echo "#define HAVE_ICONV 1" >>confdefs.h + + fi + if test "$am_cv_lib_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +$as_echo_n "checking how to link with libiconv... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +$as_echo "$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libintl-prefix was given. +if test "${with_libintl_prefix+set}" = set; then : + withval=$with_libintl_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi + + LIBINTL= + LTLIBINTL= + INCINTL= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='intl ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" + ;; + esac + done + fi + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" + done + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 +$as_echo_n "checking for GNU gettext in libintl... " >&6; } +if test "${gt_cv_func_gnugettext1_libintl+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_gnugettext1_libintl=yes +else + gt_cv_func_gnugettext1_libintl=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext1_libintl=yes + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libintl" >&5 +$as_echo "$gt_cv_func_gnugettext1_libintl" >&6; } + fi + + if test "$gt_cv_func_gnugettext1_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + else + USE_NLS=no + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 +$as_echo_n "checking whether to use NLS... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + if test "$USE_NLS" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 +$as_echo_n "checking where the gettext function comes from... " >&6; } + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 +$as_echo "$gt_source" >&6; } + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 +$as_echo_n "checking how to link with libintl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 +$as_echo "$LIBINTL" >&6; } + + for element in $INCINTL; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + fi + + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + +$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h + + fi + + POSUB=po + fi + + + + INTLLIBS="$LIBINTL" + + + + + + + +# This test must come as early as possible after the compiler configuration +# tests, because the choice of the file model can (in principle) affect +# whether functions and headers are available, whether they work, etc. +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if test "${ac_cv_sys_largefile_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test "${ac_cv_sys_file_offset_bits+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if test "${ac_cv_sys_large_files+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi +fi + + +# Checks for libraries. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getpwnam" >&5 +$as_echo_n "checking for library containing getpwnam... " >&6; } +if test "${ac_cv_search_getpwnam+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getpwnam (); +int +main () +{ +return getpwnam (); + ; + return 0; +} +_ACEOF +for ac_lib in '' sun; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_getpwnam=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_getpwnam+set}" = set; then : + break +fi +done +if test "${ac_cv_search_getpwnam+set}" = set; then : + +else + ac_cv_search_getpwnam=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getpwnam" >&5 +$as_echo "$ac_cv_search_getpwnam" >&6; } +ac_res=$ac_cv_search_getpwnam +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +# Checks for header files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main () +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_ac_Header=yes" +else + eval "$as_ac_Header=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5 +$as_echo_n "checking whether stat file-mode macros are broken... " >&6; } +if test "${ac_cv_header_stat_broken+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +#if defined S_ISBLK && defined S_IFDIR +extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; +#endif + +#if defined S_ISBLK && defined S_IFCHR +extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; +#endif + +#if defined S_ISLNK && defined S_IFREG +extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; +#endif + +#if defined S_ISSOCK && defined S_IFREG +extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stat_broken=no +else + ac_cv_header_stat_broken=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 +$as_echo "$ac_cv_header_stat_broken" >&6; } +if test $ac_cv_header_stat_broken = yes; then + +$as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if test "${ac_cv_header_time+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + +for ac_header in stdlib.h locale.h unistd.h limits.h fcntl.h string.h \ + memory.h sys/param.h sys/resource.h sys/time.h sys/timeb.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Set a flag if we have an ANSI C compiler +if test "$ac_cv_prog_cc_stdc" != no; then + +$as_echo "#define HAVE_ANSI_COMPILER 1" >>confdefs.h + +fi + + +# Determine what kind of variadic function calls we support +for ac_header in stdarg.h varargs.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + break +fi + +done + + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 +$as_echo_n "checking return type of signal handlers... " >&6; } +if test "${ac_cv_type_signal+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +int +main () +{ +return *(signal (0, 0)) (0) == 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_type_signal=int +else + ac_cv_type_signal=void +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 +$as_echo "$ac_cv_type_signal" >&6; } + +cat >>confdefs.h <<_ACEOF +#define RETSIGTYPE $ac_cv_type_signal +_ACEOF + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 +$as_echo_n "checking for uid_t in sys/types.h... " >&6; } +if test "${ac_cv_type_uid_t+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "uid_t" >/dev/null 2>&1; then : + ac_cv_type_uid_t=yes +else + ac_cv_type_uid_t=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 +$as_echo "$ac_cv_type_uid_t" >&6; } +if test $ac_cv_type_uid_t = no; then + +$as_echo "#define uid_t int" >>confdefs.h + + +$as_echo "#define gid_t int" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" +if test "x$ac_cv_type_pid_t" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + + +# Find some definition for uintmax_t + +ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default" +if test "x$ac_cv_type_uintmax_t" = x""yes; then : + +else + + uintmax_t="unsigned long" + ac_fn_c_check_type "$LINENO" "unsigned long long" "ac_cv_type_unsigned_long_long" "$ac_includes_default" +if test "x$ac_cv_type_unsigned_long_long" = x""yes; then : + uintmax_t="unsigned long long" +fi + + +cat >>confdefs.h <<_ACEOF +#define uintmax_t $uintmax_t +_ACEOF + +fi + + +# Find out whether our struct stat returns nanosecond resolution timestamps. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanoseconds field of struct stat.st_mtim" >&5 +$as_echo_n "checking for nanoseconds field of struct stat.st_mtim... " >&6; } +if test "${ac_cv_struct_st_mtim_nsec+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_CPPFLAGS="$CPPFLAGS" + ac_cv_struct_st_mtim_nsec=no + # tv_nsec -- the usual case + # _tv_nsec -- Solaris 2.6, if + # (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1 + # && !defined __EXTENSIONS__) + # st__tim.tv_nsec -- UnixWare 2.1.2 + for ac_val in tv_nsec _tv_nsec st__tim.tv_nsec; do + CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +int +main () +{ +struct stat s; s.st_mtim.ST_MTIM_NSEC; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_struct_st_mtim_nsec=$ac_val; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done + CPPFLAGS="$ac_save_CPPFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_st_mtim_nsec" >&5 +$as_echo "$ac_cv_struct_st_mtim_nsec" >&6; } + + if test $ac_cv_struct_st_mtim_nsec != no; then + +cat >>confdefs.h <<_ACEOF +#define ST_MTIM_NSEC $ac_cv_struct_st_mtim_nsec +_ACEOF + + fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use high resolution file timestamps" >&5 +$as_echo_n "checking whether to use high resolution file timestamps... " >&6; } +if test "${make_cv_file_timestamp_hi_res+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + make_cv_file_timestamp_hi_res=no + if test "$ac_cv_struct_st_mtim_nsec" != no; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# if HAVE_INTTYPES_H +# include +# endif +int +main () +{ +char a[0x7fffffff < (uintmax_t)-1 >> 30 ? 1 : -1]; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + make_cv_file_timestamp_hi_res=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_file_timestamp_hi_res" >&5 +$as_echo "$make_cv_file_timestamp_hi_res" >&6; } +if test "$make_cv_file_timestamp_hi_res" = yes; then + val=1 +else + val=0 +fi + +cat >>confdefs.h <<_ACEOF +#define FILE_TIMESTAMP_HI_RES $val +_ACEOF + + +if test "$make_cv_file_timestamp_hi_res" = yes; then + # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function. + # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 +$as_echo_n "checking for library containing clock_gettime... " >&6; } +if test "${ac_cv_search_clock_gettime+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (); +int +main () +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +for ac_lib in '' rt posix4; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_clock_gettime=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_clock_gettime+set}" = set; then : + break +fi +done +if test "${ac_cv_search_clock_gettime+set}" = set; then : + +else + ac_cv_search_clock_gettime=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 +$as_echo "$ac_cv_search_clock_gettime" >&6; } +ac_res=$ac_cv_search_clock_gettime +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + if test "$ac_cv_search_clock_gettime" != no; then + +$as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h + + fi +fi + +# Check for DOS-style pathnames. + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system uses MSDOS-style paths" >&5 +$as_echo_n "checking whether system uses MSDOS-style paths... " >&6; } +if test "${ac_cv_dos_paths+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __EMX__ && !defined __MSYS__ && !defined __CYGWIN__ +neither MSDOS nor Windows nor OS2 +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_dos_paths=yes +else + ac_cv_dos_paths=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_dos_paths" >&5 +$as_echo "$ac_cv_dos_paths" >&6; } + + if test x"$ac_cv_dos_paths" = xyes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DOS_PATHS 1 +_ACEOF + + fi + + +# See if we have a standard version of gettimeofday(). Since actual +# implementations can differ, just make sure we have the most common +# one. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for standard gettimeofday" >&5 +$as_echo_n "checking for standard gettimeofday... " >&6; } +if test "${ac_cv_func_gettimeofday+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_func_gettimeofday=no + if test "$cross_compiling" = yes; then : + ac_cv_func_gettimeofday="no (cross-compiling)" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int main () + { + struct timeval t; t.tv_sec = -1; t.tv_usec = -1; + exit (gettimeofday (&t, 0) != 0 + || t.tv_sec < 0 || t.tv_usec < 0); + } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_gettimeofday=yes +else + ac_cv_func_gettimeofday=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gettimeofday" >&5 +$as_echo "$ac_cv_func_gettimeofday" >&6; } +if test "$ac_cv_func_gettimeofday" = yes; then + +$as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h + +fi + +for ac_func in strdup strndup mkstemp mktemp fdopen fileno \ + dup2 getcwd realpath sigsetmask sigaction \ + getgroups seteuid setegid setlinebuf setreuid setregid \ + getrlimit setrlimit setvbuf pipe strerror strsignal \ + lstat readlink atexit +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# We need to check declarations, not just existence, because on Tru64 this +# function is not declared without special flags, which themselves cause +# other problems. We'll just use our own. +ac_fn_c_check_decl "$LINENO" "bsd_signal" "ac_cv_have_decl_bsd_signal" "#include +" +if test "x$ac_cv_have_decl_bsd_signal" = x""yes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BSD_SIGNAL $ac_have_decl +_ACEOF + + +if test "${ac_cv_func_setvbuf_reversed+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_func_setvbuf_reversed=no +fi + + + +# Rumor has it that strcasecmp lives in -lresolv on some odd systems. +# It doesn't hurt much to use our own if we can't find it so I don't +# make the effort here. +for ac_func in strcasecmp strncasecmp strcmpi strncmpi stricmp strnicmp +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# strcoll() is used by the GNU glob library +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strcoll" >&5 +$as_echo_n "checking for working strcoll... " >&6; } +if test "${ac_cv_func_strcoll_works+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_strcoll_works=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +return (strcoll ("abc", "def") >= 0 || + strcoll ("ABC", "DEF") >= 0 || + strcoll ("123", "456") >= 0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_strcoll_works=yes +else + ac_cv_func_strcoll_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strcoll_works" >&5 +$as_echo "$ac_cv_func_strcoll_works" >&6; } +if test $ac_cv_func_strcoll_works = yes; then + +$as_echo "#define HAVE_STRCOLL 1" >>confdefs.h + +fi + + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +$as_echo_n "checking for working alloca.h... " >&6; } +if test "${ac_cv_working_alloca_h+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_working_alloca_h=yes +else + ac_cv_working_alloca_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +$as_echo "$ac_cv_working_alloca_h" >&6; } +if test $ac_cv_working_alloca_h = yes; then + +$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +$as_echo_n "checking for alloca... " >&6; } +if test "${ac_cv_func_alloca_works+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_func_alloca_works=yes +else + ac_cv_func_alloca_works=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +$as_echo "$ac_cv_func_alloca_works" >&6; } + +if test $ac_cv_func_alloca_works = yes; then + +$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + +$as_echo "#define C_ALLOCA 1" >>confdefs.h + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 +$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } +if test "${ac_cv_os_cray+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined CRAY && ! defined CRAY2 +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then : + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 +$as_echo "$ac_cv_os_cray" >&6; } +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +$as_echo_n "checking stack direction for C alloca... " >&6; } +if test "${ac_cv_c_stack_direction+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_c_stack_direction=0 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + return find_stack_direction () < 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_stack_direction=1 +else + ac_cv_c_stack_direction=-1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 +$as_echo "$ac_cv_c_stack_direction" >&6; } +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + +for ac_header in vfork.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" +if test "x$ac_cv_header_vfork_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VFORK_H 1 +_ACEOF + +fi + +done + +for ac_func in fork vfork +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +if test "x$ac_cv_func_fork" = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 +$as_echo_n "checking for working fork... " >&6; } +if test "${ac_cv_func_fork_works+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_fork_works=cross +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* By Ruediger Kuhlmann. */ + return fork () < 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_fork_works=yes +else + ac_cv_func_fork_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 +$as_echo "$ac_cv_func_fork_works" >&6; } + +else + ac_cv_func_fork_works=$ac_cv_func_fork +fi +if test "x$ac_cv_func_fork_works" = xcross; then + case $host in + *-*-amigaos* | *-*-msdosdjgpp*) + # Override, as these systems have only a dummy fork() stub + ac_cv_func_fork_works=no + ;; + *) + ac_cv_func_fork_works=yes + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 +$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} +fi +ac_cv_func_vfork_works=$ac_cv_func_vfork +if test "x$ac_cv_func_vfork" = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 +$as_echo_n "checking for working vfork... " >&6; } +if test "${ac_cv_func_vfork_works+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_vfork_works=cross +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Thanks to Paul Eggert for this test. */ +$ac_includes_default +#include +#ifdef HAVE_VFORK_H +# include +#endif +/* On some sparc systems, changes by the child to local and incoming + argument registers are propagated back to the parent. The compiler + is told about this with #include , but some compilers + (e.g. gcc -O) don't grok . Test for this by using a + static variable whose address is put into a register that is + clobbered by the vfork. */ +static void +#ifdef __cplusplus +sparc_address_test (int arg) +# else +sparc_address_test (arg) int arg; +#endif +{ + static pid_t child; + if (!child) { + child = vfork (); + if (child < 0) { + perror ("vfork"); + _exit(2); + } + if (!child) { + arg = getpid(); + write(-1, "", 0); + _exit (arg); + } + } +} + +int +main () +{ + pid_t parent = getpid (); + pid_t child; + + sparc_address_test (0); + + child = vfork (); + + if (child == 0) { + /* Here is another test for sparc vfork register problems. This + test uses lots of local variables, at least as many local + variables as main has allocated so far including compiler + temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris + 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should + reuse the register of parent for one of the local variables, + since it will think that parent can't possibly be used any more + in this routine. Assigning to the local variable will thus + munge parent in the parent process. */ + pid_t + p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), + p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); + /* Convince the compiler that p..p7 are live; otherwise, it might + use the same hardware register for all 8 local variables. */ + if (p != p1 || p != p2 || p != p3 || p != p4 + || p != p5 || p != p6 || p != p7) + _exit(1); + + /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent + from child file descriptors. If the child closes a descriptor + before it execs or exits, this munges the parent's descriptor + as well. Test for this by closing stdout in the child. */ + _exit(close(fileno(stdout)) != 0); + } else { + int status; + struct stat st; + + while (wait(&status) != child) + ; + return ( + /* Was there some problem with vforking? */ + child < 0 + + /* Did the child fail? (This shouldn't happen.) */ + || status + + /* Did the vfork/compiler bug occur? */ + || parent != getpid() + + /* Did the file descriptor bug occur? */ + || fstat(fileno(stdout), &st) != 0 + ); + } +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_vfork_works=yes +else + ac_cv_func_vfork_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 +$as_echo "$ac_cv_func_vfork_works" >&6; } + +fi; +if test "x$ac_cv_func_fork_works" = xcross; then + ac_cv_func_vfork_works=$ac_cv_func_vfork + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 +$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} +fi + +if test "x$ac_cv_func_vfork_works" = xyes; then + +$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h + +else + +$as_echo "#define vfork fork" >>confdefs.h + +fi +if test "x$ac_cv_func_fork_works" = xyes; then + +$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h + +fi + +for ac_func in vprintf +do : + ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" +if test "x$ac_cv_func_vprintf" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VPRINTF 1 +_ACEOF + +ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" +if test "x$ac_cv_func__doprnt" = x""yes; then : + +$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h + +fi + +fi +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 +$as_echo_n "checking whether closedir returns void... " >&6; } +if test "${ac_cv_func_closedir_void+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_closedir_void=yes +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header_dirent> +#ifndef __cplusplus +int closedir (); +#endif + +int +main () +{ +return closedir (opendir (".")) != 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_closedir_void=no +else + ac_cv_func_closedir_void=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 +$as_echo "$ac_cv_func_closedir_void" >&6; } +if test $ac_cv_func_closedir_void = yes; then + +$as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h + +fi + + +ac_have_func=no # yes means we've found a way to get the load average. + +# Make sure getloadavg.c is where it belongs, at configure-time. +test -f "$srcdir/$ac_config_libobj_dir/getloadavg.c" || + as_fn_error "$srcdir/$ac_config_libobj_dir/getloadavg.c is missing" "$LINENO" 5 + +ac_save_LIBS=$LIBS + +# Check for getloadavg, but be sure not to touch the cache variable. +(ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg" +if test "x$ac_cv_func_getloadavg" = x""yes; then : + exit 0 +else + exit 1 +fi +) && ac_have_func=yes + +# On HPUX9, an unprivileged user can get load averages through this function. +for ac_func in pstat_getdynamic +do : + ac_fn_c_check_func "$LINENO" "pstat_getdynamic" "ac_cv_func_pstat_getdynamic" +if test "x$ac_cv_func_pstat_getdynamic" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PSTAT_GETDYNAMIC 1 +_ACEOF + +fi +done + + +# Solaris has libkstat which does not require root. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for kstat_open in -lkstat" >&5 +$as_echo_n "checking for kstat_open in -lkstat... " >&6; } +if test "${ac_cv_lib_kstat_kstat_open+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lkstat $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char kstat_open (); +int +main () +{ +return kstat_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_kstat_kstat_open=yes +else + ac_cv_lib_kstat_kstat_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kstat_kstat_open" >&5 +$as_echo "$ac_cv_lib_kstat_kstat_open" >&6; } +if test "x$ac_cv_lib_kstat_kstat_open" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBKSTAT 1 +_ACEOF + + LIBS="-lkstat $LIBS" + +fi + +test $ac_cv_lib_kstat_kstat_open = yes && ac_have_func=yes + +# Some systems with -lutil have (and need) -lkvm as well, some do not. +# On Solaris, -lkvm requires nlist from -lelf, so check that first +# to get the right answer into the cache. +# For kstat on solaris, we need libelf to force the definition of SVR4 below. +if test $ac_have_func = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for elf_begin in -lelf" >&5 +$as_echo_n "checking for elf_begin in -lelf... " >&6; } +if test "${ac_cv_lib_elf_elf_begin+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lelf $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char elf_begin (); +int +main () +{ +return elf_begin (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_elf_elf_begin=yes +else + ac_cv_lib_elf_elf_begin=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_elf_elf_begin" >&5 +$as_echo "$ac_cv_lib_elf_elf_begin" >&6; } +if test "x$ac_cv_lib_elf_elf_begin" = x""yes; then : + LIBS="-lelf $LIBS" +fi + +fi +if test $ac_have_func = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kvm_open in -lkvm" >&5 +$as_echo_n "checking for kvm_open in -lkvm... " >&6; } +if test "${ac_cv_lib_kvm_kvm_open+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lkvm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char kvm_open (); +int +main () +{ +return kvm_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_kvm_kvm_open=yes +else + ac_cv_lib_kvm_kvm_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kvm_kvm_open" >&5 +$as_echo "$ac_cv_lib_kvm_kvm_open" >&6; } +if test "x$ac_cv_lib_kvm_kvm_open" = x""yes; then : + LIBS="-lkvm $LIBS" +fi + + # Check for the 4.4BSD definition of getloadavg. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getloadavg in -lutil" >&5 +$as_echo_n "checking for getloadavg in -lutil... " >&6; } +if test "${ac_cv_lib_util_getloadavg+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getloadavg (); +int +main () +{ +return getloadavg (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_util_getloadavg=yes +else + ac_cv_lib_util_getloadavg=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_getloadavg" >&5 +$as_echo "$ac_cv_lib_util_getloadavg" >&6; } +if test "x$ac_cv_lib_util_getloadavg" = x""yes; then : + LIBS="-lutil $LIBS" ac_have_func=yes ac_cv_func_getloadavg_setgid=yes +fi + +fi + +if test $ac_have_func = no; then + # There is a commonly available library for RS/6000 AIX. + # Since it is not a standard part of AIX, it might be installed locally. + ac_getloadavg_LIBS=$LIBS + LIBS="-L/usr/local/lib $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getloadavg in -lgetloadavg" >&5 +$as_echo_n "checking for getloadavg in -lgetloadavg... " >&6; } +if test "${ac_cv_lib_getloadavg_getloadavg+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgetloadavg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getloadavg (); +int +main () +{ +return getloadavg (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_getloadavg_getloadavg=yes +else + ac_cv_lib_getloadavg_getloadavg=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_getloadavg_getloadavg" >&5 +$as_echo "$ac_cv_lib_getloadavg_getloadavg" >&6; } +if test "x$ac_cv_lib_getloadavg_getloadavg" = x""yes; then : + LIBS="-lgetloadavg $LIBS" +else + LIBS=$ac_getloadavg_LIBS +fi + +fi + +# Make sure it is really in the library, if we think we found it, +# otherwise set up the replacement function. +for ac_func in getloadavg +do : + ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg" +if test "x$ac_cv_func_getloadavg" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETLOADAVG 1 +_ACEOF + +else + case " $LIBOBJS " in + *" getloadavg.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getloadavg.$ac_objext" + ;; +esac + + +$as_echo "#define C_GETLOADAVG 1" >>confdefs.h + +# Figure out what our getloadavg.c needs. +ac_have_func=no +ac_fn_c_check_header_mongrel "$LINENO" "sys/dg_sys_info.h" "ac_cv_header_sys_dg_sys_info_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_dg_sys_info_h" = x""yes; then : + ac_have_func=yes + +$as_echo "#define DGUX 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dg_sys_info in -ldgc" >&5 +$as_echo_n "checking for dg_sys_info in -ldgc... " >&6; } +if test "${ac_cv_lib_dgc_dg_sys_info+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldgc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dg_sys_info (); +int +main () +{ +return dg_sys_info (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dgc_dg_sys_info=yes +else + ac_cv_lib_dgc_dg_sys_info=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dgc_dg_sys_info" >&5 +$as_echo "$ac_cv_lib_dgc_dg_sys_info" >&6; } +if test "x$ac_cv_lib_dgc_dg_sys_info" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBDGC 1 +_ACEOF + + LIBS="-ldgc $LIBS" + +fi + +fi + + + +ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = x""yes; then : + +fi + + +for ac_func in setlocale +do : + ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" +if test "x$ac_cv_func_setlocale" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETLOCALE 1 +_ACEOF + +fi +done + + +# We cannot check for , because Solaris 2 does not use dwarf (it +# uses stabs), but it is still SVR4. We cannot check for because +# Irix 4.0.5F has the header but not the library. +if test $ac_have_func = no && test "$ac_cv_lib_elf_elf_begin" = yes; then + ac_have_func=yes + +$as_echo "#define SVR4 1" >>confdefs.h + +fi + +if test $ac_have_func = no; then + ac_fn_c_check_header_mongrel "$LINENO" "inq_stats/cpustats.h" "ac_cv_header_inq_stats_cpustats_h" "$ac_includes_default" +if test "x$ac_cv_header_inq_stats_cpustats_h" = x""yes; then : + ac_have_func=yes + +$as_echo "#define UMAX 1" >>confdefs.h + + +$as_echo "#define UMAX4_3 1" >>confdefs.h + +fi + + +fi + +if test $ac_have_func = no; then + ac_fn_c_check_header_mongrel "$LINENO" "sys/cpustats.h" "ac_cv_header_sys_cpustats_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_cpustats_h" = x""yes; then : + ac_have_func=yes; $as_echo "#define UMAX 1" >>confdefs.h + +fi + + +fi + +if test $ac_have_func = no; then + for ac_header in mach/mach.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "mach/mach.h" "ac_cv_header_mach_mach_h" "$ac_includes_default" +if test "x$ac_cv_header_mach_mach_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MACH_MACH_H 1 +_ACEOF + +fi + +done + +fi + +for ac_header in nlist.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "nlist.h" "ac_cv_header_nlist_h" "$ac_includes_default" +if test "x$ac_cv_header_nlist_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NLIST_H 1 +_ACEOF + ac_fn_c_check_member "$LINENO" "struct nlist" "n_un.n_name" "ac_cv_member_struct_nlist_n_un_n_name" "#include +" +if test "x$ac_cv_member_struct_nlist_n_un_n_name" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_NLIST_N_UN_N_NAME 1 +_ACEOF + + +$as_echo "#define NLIST_NAME_UNION 1" >>confdefs.h + +fi + + +fi + +done + +fi +done + + +# Some definitions of getloadavg require that the program be installed setgid. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getloadavg requires setgid" >&5 +$as_echo_n "checking whether getloadavg requires setgid... " >&6; } +if test "${ac_cv_func_getloadavg_setgid+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include "$srcdir/$ac_config_libobj_dir/getloadavg.c" +#ifdef LDAV_PRIVILEGED +Yowza Am I SETGID yet +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Yowza Am I SETGID yet" >/dev/null 2>&1; then : + ac_cv_func_getloadavg_setgid=yes +else + ac_cv_func_getloadavg_setgid=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getloadavg_setgid" >&5 +$as_echo "$ac_cv_func_getloadavg_setgid" >&6; } +if test $ac_cv_func_getloadavg_setgid = yes; then + NEED_SETGID=true + +$as_echo "#define GETLOADAVG_PRIVILEGED 1" >>confdefs.h + +else + NEED_SETGID=false +fi + +if test $ac_cv_func_getloadavg_setgid = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking group of /dev/kmem" >&5 +$as_echo_n "checking group of /dev/kmem... " >&6; } +if test "${ac_cv_group_kmem+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # On Solaris, /dev/kmem is a symlink. Get info on the real file. + ac_ls_output=`ls -lgL /dev/kmem 2>/dev/null` + # If we got an error (system does not support symlinks), try without -L. + test -z "$ac_ls_output" && ac_ls_output=`ls -lg /dev/kmem` + ac_cv_group_kmem=`$as_echo "$ac_ls_output" \ + | sed -ne 's/[ ][ ]*/ /g; + s/^.[sSrwx-]* *[0-9]* *\([^0-9]*\) *.*/\1/; + / /s/.* //;p;'` + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_group_kmem" >&5 +$as_echo "$ac_cv_group_kmem" >&6; } + KMEM_GROUP=$ac_cv_group_kmem +fi +if test "x$ac_save_LIBS" = x; then + GETLOADAVG_LIBS=$LIBS +else + GETLOADAVG_LIBS=`$as_echo "$LIBS" | sed "s|$ac_save_LIBS||"` +fi +LIBS=$ac_save_LIBS + + + +# AC_FUNC_GETLOADAVG is documented to set the NLIST_STRUCT value, but it +# doesn't. So, we will. + +if test "$ac_cv_header_nlist_h" = yes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +struct nlist nl; + nl.n_name = "string"; + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + make_cv_nlist_struct=yes +else + make_cv_nlist_struct=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test "$make_cv_nlist_struct" = yes; then + +$as_echo "#define NLIST_STRUCT 1" >>confdefs.h + + fi +fi + +ac_fn_c_check_decl "$LINENO" "sys_siglist" "ac_cv_have_decl_sys_siglist" "$ac_includes_default +#include +/* NetBSD declares sys_siglist in unistd.h. */ +#if HAVE_UNISTD_H +# include +#endif + +" +if test "x$ac_cv_have_decl_sys_siglist" = x""yes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGLIST $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "_sys_siglist" "ac_cv_have_decl__sys_siglist" "$ac_includes_default +#include +/* NetBSD declares sys_siglist in unistd.h. */ +#if HAVE_UNISTD_H +# include +#endif + +" +if test "x$ac_cv_have_decl__sys_siglist" = x""yes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__SYS_SIGLIST $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "__sys_siglist" "ac_cv_have_decl___sys_siglist" "$ac_includes_default +#include +/* NetBSD declares sys_siglist in unistd.h. */ +#if HAVE_UNISTD_H +# include +#endif + +" +if test "x$ac_cv_have_decl___sys_siglist" = x""yes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL___SYS_SIGLIST $ac_have_decl +_ACEOF + + + +# Check out the wait reality. +for ac_header in sys/wait.h +do : + ac_fn_c_check_header_compile "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "#include +" +if test "x$ac_cv_header_sys_wait_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_WAIT_H 1 +_ACEOF + +fi + +done + +for ac_func in waitpid wait3 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for union wait" >&5 +$as_echo_n "checking for union wait... " >&6; } +if test "${make_cv_union_wait+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +union wait status; int pid; pid = wait (&status); +#ifdef WEXITSTATUS +/* Some POSIXoid systems have both the new-style macros and the old + union wait type, and they do not work together. If union wait + conflicts with WEXITSTATUS et al, we don't want to use it at all. */ + if (WEXITSTATUS (status) != 0) pid = -1; +#ifdef WTERMSIG + /* If we have WEXITSTATUS and WTERMSIG, just use them on ints. */ + -- blow chunks here -- +#endif +#endif +#ifdef HAVE_WAITPID + /* Make sure union wait works with waitpid. */ + pid = waitpid (-1, &status, 0); +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + make_cv_union_wait=yes +else + make_cv_union_wait=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +if test "$make_cv_union_wait" = yes; then + +$as_echo "#define HAVE_UNION_WAIT 1" >>confdefs.h + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_union_wait" >&5 +$as_echo "$make_cv_union_wait" >&6; } + + +# If we're building on Windows/DOS/OS/2, add some support for DOS drive specs. +if test "$PATH_SEPARATOR" = ';'; then + +$as_echo "#define HAVE_DOS_PATHS 1" >>confdefs.h + +fi + + +# See if the user wants to use pmake's "customs" distributed build capability + + REMOTE=stub +use_customs=false + +# Check whether --with-customs was given. +if test "${with_customs+set}" = set; then : + withval=$with_customs; case $withval in + n|no) : ;; + *) make_cppflags="$CPPFLAGS" + case $withval in + y|ye|yes) : ;; + *) CPPFLAGS="$CPPFLAGS -I$with_customs/include/customs" + make_ldflags="$LDFLAGS -L$with_customs/lib" ;; + esac + +cf_test_netlibs=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for network libraries" >&5 +$as_echo_n "checking for network libraries... " >&6; } +if test "${cf_cv_netlibs+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: working..." >&5 +$as_echo "working..." >&6; } +cf_cv_netlibs="" +cf_test_netlibs=yes +for ac_func in gethostname +do : + ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname" +if test "x$ac_cv_func_gethostname" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETHOSTNAME 1 +_ACEOF + +else + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostname in -lnsl" >&5 +$as_echo_n "checking for gethostname in -lnsl... " >&6; } +if test "${ac_cv_lib_nsl_gethostname+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $cf_cv_netlibs $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostname (); +int +main () +{ +return gethostname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostname=yes +else + ac_cv_lib_nsl_gethostname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostname" >&6; } +if test "x$ac_cv_lib_nsl_gethostname" = x""yes; then : + + +cf_tr_func=`echo gethostname | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_gethostname=yes + cf_cv_netlibs="-lnsl $cf_cv_netlibs" +else + + ac_cv_func_gethostname=unknown + unset ac_cv_func_gethostname 2>/dev/null + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostname in -lsocket" >&5 +$as_echo_n "checking for gethostname in -lsocket... " >&6; } +if test "${ac_cv_lib_socket_gethostname+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $cf_cv_netlibs $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostname (); +int +main () +{ +return gethostname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_gethostname=yes +else + ac_cv_lib_socket_gethostname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_gethostname" >&5 +$as_echo "$ac_cv_lib_socket_gethostname" >&6; } +if test "x$ac_cv_lib_socket_gethostname" = x""yes; then : + + +cf_tr_func=`echo gethostname | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_gethostname=yes + cf_cv_netlibs="-lsocket $cf_cv_netlibs" +else + + ac_cv_func_gethostname=unknown + unset ac_cv_func_gethostname 2>/dev/null + +fi + + +fi + + +fi +done + +# +# FIXME: sequent needs this library (i.e., -lsocket -linet -lnsl), but +# I don't know the entrypoints - 97/7/22 TD +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 +$as_echo_n "checking for main in -linet... " >&6; } +if test "${ac_cv_lib_inet_main+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-linet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_inet_main=yes +else + ac_cv_lib_inet_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 +$as_echo "$ac_cv_lib_inet_main" >&6; } +if test "x$ac_cv_lib_inet_main" = x""yes; then : + cf_cv_netlibs="-linet $cf_cv_netlibs" +fi + +# +if test "$ac_cv_func_lsocket" != no ; then +for ac_func in socket +do : + ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" +if test "x$ac_cv_func_socket" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SOCKET 1 +_ACEOF + +else + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 +$as_echo_n "checking for socket in -lsocket... " >&6; } +if test "${ac_cv_lib_socket_socket+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $cf_cv_netlibs $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_socket=yes +else + ac_cv_lib_socket_socket=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 +$as_echo "$ac_cv_lib_socket_socket" >&6; } +if test "x$ac_cv_lib_socket_socket" = x""yes; then : + + +cf_tr_func=`echo socket | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_socket=yes + cf_cv_netlibs="-lsocket $cf_cv_netlibs" +else + + ac_cv_func_socket=unknown + unset ac_cv_func_socket 2>/dev/null + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lbsd" >&5 +$as_echo_n "checking for socket in -lbsd... " >&6; } +if test "${ac_cv_lib_bsd_socket+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $cf_cv_netlibs $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_socket=yes +else + ac_cv_lib_bsd_socket=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_socket" >&5 +$as_echo "$ac_cv_lib_bsd_socket" >&6; } +if test "x$ac_cv_lib_bsd_socket" = x""yes; then : + + +cf_tr_func=`echo socket | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_socket=yes + cf_cv_netlibs="-lbsd $cf_cv_netlibs" +else + + ac_cv_func_socket=unknown + unset ac_cv_func_socket 2>/dev/null + +fi + + +fi + + +fi +done + +fi +# +for ac_func in gethostbyname +do : + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETHOSTBYNAME 1 +_ACEOF + +else + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $cf_cv_netlibs $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : + + +cf_tr_func=`echo gethostbyname | tr '[a-z]' '[A-Z]'` + + +cat >>confdefs.h <<_ACEOF +#define HAVE_$cf_tr_func 1 +_ACEOF + + ac_cv_func_gethostbyname=yes + cf_cv_netlibs="-lnsl $cf_cv_netlibs" +else + + ac_cv_func_gethostbyname=unknown + unset ac_cv_func_gethostbyname 2>/dev/null + +fi + + +fi +done + + +fi + +LIBS="$LIBS $cf_cv_netlibs" +test $cf_test_netlibs = no && echo "$cf_cv_netlibs" >&6 + + ac_fn_c_check_header_mongrel "$LINENO" "customs.h" "ac_cv_header_customs_h" "$ac_includes_default" +if test "x$ac_cv_header_customs_h" = x""yes; then : + use_customs=true + REMOTE=cstms + LIBS="$LIBS -lcustoms" LDFLAGS="$make_ldflags" +else + with_customs=no + CPPFLAGS="$make_cppflags" make_badcust=yes +fi + + + ;; + esac +fi + +# Tell automake about this, so it can include the right .c files. + if test "$use_customs" = true; then + USE_CUSTOMS_TRUE= + USE_CUSTOMS_FALSE='#' +else + USE_CUSTOMS_TRUE='#' + USE_CUSTOMS_FALSE= +fi + + +# See if the user asked to handle case insensitive file systems. + + +# Check whether --enable-case-insensitive-file-system was given. +if test "${enable_case_insensitive_file_system+set}" = set; then : + enableval=$enable_case_insensitive_file_system; case $enableval in + yes) $as_echo "#define HAVE_CASE_INSENSITIVE_FS 1" >>confdefs.h + ;; + esac +fi + + +# See if we can handle the job server feature, and if the user wants it. + +# Check whether --enable-job-server was given. +if test "${enable_job_server+set}" = set; then : + enableval=$enable_job_server; make_cv_job_server="$enableval" user_job_server="$enableval" +else + make_cv_job_server="yes" +fi + + +has_wait_nohang=yes +case "$ac_cv_func_waitpid/$ac_cv_func_wait3" in + no/no) has_wait_nohang=no ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SA_RESTART" >&5 +$as_echo_n "checking for SA_RESTART... " >&6; } +if test "${make_cv_sa_restart+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +return SA_RESTART; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + make_cv_sa_restart=yes +else + make_cv_sa_restart=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_sa_restart" >&5 +$as_echo "$make_cv_sa_restart" >&6; } + +if test "$make_cv_sa_restart" != no; then + +$as_echo "#define HAVE_SA_RESTART 1" >>confdefs.h + +fi + +# enable make_cv_sa_restart for OS/2 so that the jobserver will be enabled, +# but do it after HAVE_SA_RESTART has been defined. +case "$host_os" in + os2*) make_cv_sa_restart=yes ;; +esac + +case "$ac_cv_func_pipe/$ac_cv_func_sigaction/$make_cv_sa_restart/$has_wait_nohang/$make_cv_job_server" in + yes/yes/yes/yes/yes) + +$as_echo "#define MAKE_JOBSERVER 1" >>confdefs.h +;; +esac + +# if we have both lstat() and readlink() then we can support symlink +# timechecks. +case "$ac_cv_func_lstat/$ac_cv_func_readlink" in + yes/yes) + +$as_echo "#define MAKE_SYMLINKS 1" >>confdefs.h +;; +esac + +# Find the SCCS commands, so we can include them in our default rules. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for location of SCCS get command" >&5 +$as_echo_n "checking for location of SCCS get command... " >&6; } +if test "${make_cv_path_sccs_get+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +if test -f /usr/sccs/get; then + make_cv_path_sccs_get=/usr/sccs/get +else + make_cv_path_sccs_get=get +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_path_sccs_get" >&5 +$as_echo "$make_cv_path_sccs_get" >&6; } + +cat >>confdefs.h <<_ACEOF +#define SCCS_GET "$make_cv_path_sccs_get" +_ACEOF + + +ac_clean_files="$ac_clean_files s.conftest conftoast" # Remove these later. +if ( /usr/sccs/admin -n s.conftest || admin -n s.conftest ) >/dev/null 2>&1 && + test -f s.conftest; then + # We successfully created an SCCS file. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if SCCS get command understands -G" >&5 +$as_echo_n "checking if SCCS get command understands -G... " >&6; } +if test "${make_cv_sys_get_minus_G+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + if $make_cv_path_sccs_get -Gconftoast s.conftest >/dev/null 2>&1 && + test -f conftoast; then + make_cv_sys_get_minus_G=yes + else + make_cv_sys_get_minus_G=no + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_sys_get_minus_G" >&5 +$as_echo "$make_cv_sys_get_minus_G" >&6; } + case "$make_cv_sys_get_minus_G" in + yes) +$as_echo "#define SCCS_GET_MINUS_G 1" >>confdefs.h +;; + esac +fi +rm -f s.conftest conftoast + +# Check the system to see if it provides GNU glob. If not, use our +# local version. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if system libc has GNU glob" >&5 +$as_echo_n "checking if system libc has GNU glob... " >&6; } +if test "${make_cv_sys_gnu_glob+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +#define GLOB_INTERFACE_VERSION 1 +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include +# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION + gnu glob +# endif +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "gnu glob" >/dev/null 2>&1; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +make_cv_sys_gnu_glob=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no; using local copy" >&5 +$as_echo "no; using local copy" >&6; } +make_cv_sys_gnu_glob=no +fi +rm -f conftest* + +fi + +if test "$make_cv_sys_gnu_glob" = no; then + GLOBINC='-I$(srcdir)/glob' + GLOBLIB=glob/libglob.a +fi + + + +# Tell automake about this, so it can build the right .c files. + if test "$make_cv_sys_gnu_glob" = no; then + USE_LOCAL_GLOB_TRUE= + USE_LOCAL_GLOB_FALSE='#' +else + USE_LOCAL_GLOB_TRUE='#' + USE_LOCAL_GLOB_FALSE= +fi + + +# Let the makefile know what our build host is + + +cat >>confdefs.h <<_ACEOF +#define MAKE_HOST "$host" +_ACEOF + +MAKE_HOST="$host" + + +w32_target_env=no + if false; then + WINDOWSENV_TRUE= + WINDOWSENV_FALSE='#' +else + WINDOWSENV_TRUE='#' + WINDOWSENV_FALSE= +fi + + +case "$host" in + *-*-mingw32) + if true; then + WINDOWSENV_TRUE= + WINDOWSENV_FALSE='#' +else + WINDOWSENV_TRUE='#' + WINDOWSENV_FALSE= +fi + + w32_target_env=yes + +$as_echo "#define WINDOWS32 1" >>confdefs.h + + +$as_echo "#define HAVE_DOS_PATHS 1" >>confdefs.h + + ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define PATH_SEPARATOR_CHAR '$PATH_SEPARATOR' +_ACEOF + + +# Include the Maintainer's Makefile section, if it's here. + +MAINT_MAKEFILE=/dev/null +if test -r "$srcdir/maintMakefile"; then + MAINT_MAKEFILE="$srcdir/maintMakefile" +fi + + +# Allow building with dmalloc +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if malloc debugging is wanted" >&5 +$as_echo_n "checking if malloc debugging is wanted... " >&6; } + +# Check whether --with-dmalloc was given. +if test "${with_dmalloc+set}" = set; then : + withval=$with_dmalloc; if test "$withval" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define WITH_DMALLOC 1" >>confdefs.h + + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +# Forcibly disable SET_MAKE. If it's set it breaks things like the test +# scripts, etc. +SET_MAKE= + +# Sanity check and inform the user of what we found + +case "$make_badcust" in + yes) echo + echo "WARNING: --with-customs specified but no customs.h could be found;" + echo " disabling Customs support." + echo ;; +esac + +case "$with_customs" in + ""|n|no|y|ye|yes) ;; + *) if test -f "$with_customs/lib/libcustoms.a"; then + : + else + echo + echo "WARNING: '$with_customs/lib' does not appear to contain the" + echo " Customs library. You must build and install Customs" + echo " before compiling GNU make." + echo + fi ;; +esac + +case "$has_wait_nohang" in + no) echo + echo "WARNING: Your system has neither waitpid() nor wait3()." + echo " Without one of these, signal handling is unreliable." + echo " You should be aware that running GNU make with -j" + echo " could result in erratic behavior." + echo ;; +esac + +case "$make_cv_job_server/$user_job_server" in + no/yes) echo + echo "WARNING: Make job server requires a POSIX-ish system that" + echo " supports the pipe(), sigaction(), and either" + echo " waitpid() or wait3() functions. Your system doesn't" + echo " appear to provide one or more of those." + echo " Disabling job server support." + echo ;; +esac + + +# Specify what files are to be created. +ac_config_files="$ac_config_files Makefile glob/Makefile po/Makefile.in config/Makefile doc/Makefile w32/Makefile" + + +# OK, do it! + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_CUSTOMS_TRUE}" && test -z "${USE_CUSTOMS_FALSE}"; then + as_fn_error "conditional \"USE_CUSTOMS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LOCAL_GLOB_TRUE}" && test -z "${USE_LOCAL_GLOB_FALSE}"; then + as_fn_error "conditional \"USE_LOCAL_GLOB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WINDOWSENV_TRUE}" && test -z "${WINDOWSENV_FALSE}"; then + as_fn_error "conditional \"WINDOWSENV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WINDOWSENV_TRUE}" && test -z "${WINDOWSENV_FALSE}"; then + as_fn_error "conditional \"WINDOWSENV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by GNU make $as_me 3.82, which was +generated by GNU Autoconf 2.65. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to . +GNU make home page: . +General help using GNU software: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +GNU make config.status 3.82 +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2009 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "glob/Makefile") CONFIG_FILES="$CONFIG_FILES glob/Makefile" ;; + "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "config/Makefile") CONFIG_FILES="$CONFIG_FILES config/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "w32/Makefile") CONFIG_FILES="$CONFIG_FILES w32/Makefile" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + +if $AWK 'BEGIN { getline <"/dev/null" }' /dev/null; then + ac_cs_awk_getline=: + ac_cs_awk_pipe_init= + ac_cs_awk_read_file=' + while ((getline aline < (F[key])) > 0) + print(aline) + close(F[key])' + ac_cs_awk_pipe_fini= +else + ac_cs_awk_getline=false + ac_cs_awk_pipe_init="print \"cat <<'|#_!!_#|' &&\"" + ac_cs_awk_read_file=' + print "|#_!!_#|" + print "cat " F[key] " &&" + '$ac_cs_awk_pipe_init + # The final `:' finishes the AND list. + ac_cs_awk_pipe_fini='END { print "|#_!!_#|"; print ":" }' +fi +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + +# Create commands to substitute file output variables. +{ + echo "cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1" && + echo 'cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&' && + echo "$ac_subst_files" | sed 's/.*/F["&"]="$&"/' && + echo "_ACAWK" && + echo "_ACEOF" +} >conf$$files.sh && +. ./conf$$files.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +rm -f conf$$files.sh + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + \$ac_cs_awk_pipe_init +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + if (nfields == 3 && !substed) { + key = field[2] + if (F[key] != "" && line ~ /^[ ]*@.*@[ ]*$/) { + \$ac_cs_awk_read_file + next + } + } + print line +} +\$ac_cs_awk_pipe_fini +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | +if $ac_cs_awk_getline; then + $AWK -f "$tmp/subs.awk" +else + $AWK -f "$tmp/subs.awk" | $SHELL +fi >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "default-1":C) + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit $? +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +# We only generate the build.sh if we have a build.sh.in; we won't have +# one before we've created a distribution. +if test -f "$srcdir/build.sh.in"; then + ./config.status --file build.sh + chmod +x build.sh +fi + diff --git a/configure.bat b/configure.bat new file mode 100644 index 0000000..c7b4591 --- /dev/null +++ b/configure.bat @@ -0,0 +1,61 @@ +@echo off +rem Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, +rem 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +rem This file is part of GNU Make. +rem +rem GNU Make is free software; you can redistribute it and/or modify it under +rem the terms of the GNU General Public License as published by the Free +rem Software Foundation; either version 3 of the License, or (at your option) +rem any later version. +rem +rem GNU Make is distributed in the hope that it will be useful, but WITHOUT +rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +rem FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for. +rem more details. +rem +rem You should have received a copy of the GNU General Public License along +rem with this program. If not, see . + +echo Configuring MAKE for DJGPP + +rem The SmallEnv trick protects against too small environment block, +rem in which case the values will be truncated and the whole thing +rem goes awry. COMMAND.COM will say "Out of environment space", but +rem many people don't care, so we force them to care by refusing to go. + +rem Where is the srcdir? +set XSRC=. +if not "%XSRC%"=="." goto SmallEnv +if "%1%"=="" goto SrcDone +set XSRC=%1 +if not "%XSRC%"=="%1" goto SmallEnv + +:SrcDone + +update %XSRC%/configh.dos ./config.h + +rem Do they have Make? +redir -o junk.$$$ -eo make -n -f NUL +rem REDIR will return 1 if it cannot run Make. +rem If it can run Make, it will usually return 2, +rem but 0 is also OK with us. +if errorlevel 2 goto MakeOk +if not errorlevel 1 goto MakeOk +if exist junk.$$$ del junk.$$$ +echo No Make program found--use DOSBUILD.BAT to build Make. +goto End + +rem They do have Make. Generate the Makefile. + +:MakeOk +del junk.$$$ +update %XSRC%/Makefile.DOS ./Makefile +echo Done. +if not "%XSRC%"=="." echo Invoke Make thus: "make srcdir=%XSRC%" +goto End + +:SmallEnv +echo Your environment is too small. Please enlarge it and run me again. + +:End +set XRSC= diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..0b03617 --- /dev/null +++ b/configure.in @@ -0,0 +1,478 @@ +# Process this file with autoconf to produce a configure script. +# +# Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +AC_INIT([GNU make],[3.82],[bug-make@gnu.org]) + +AC_PREREQ(2.59) +AC_REVISION([[$Id: configure.in,v 1.156 2010/07/28 05:39:50 psmith Exp $]]) + +# Autoconf setup +AC_CONFIG_AUX_DIR(config) +AC_CONFIG_SRCDIR(vpath.c) +AC_CONFIG_HEADERS(config.h) + +# Automake setup +AM_INIT_AUTOMAKE([1.9]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_RANLIB +AC_PROG_CPP +AC_CHECK_PROG(AR, ar, ar, ar) +# Perl is needed for the test suite (only) +AC_CHECK_PROG(PERL, perl, perl, perl) + +# Specialized system macros +AC_CANONICAL_HOST +AC_AIX +AC_ISC_POSIX +AC_MINIX + +# Enable gettext, in "external" mode. + +AM_GNU_GETTEXT_VERSION(0.14.1) +AM_GNU_GETTEXT([external]) + +# This test must come as early as possible after the compiler configuration +# tests, because the choice of the file model can (in principle) affect +# whether functions and headers are available, whether they work, etc. +AC_SYS_LARGEFILE + +# Checks for libraries. +AC_SEARCH_LIBS(getpwnam, [sun]) + +# Checks for header files. +AC_HEADER_STDC +AC_HEADER_DIRENT +AC_HEADER_STAT +AC_HEADER_TIME +AC_CHECK_HEADERS(stdlib.h locale.h unistd.h limits.h fcntl.h string.h \ + memory.h sys/param.h sys/resource.h sys/time.h sys/timeb.h) + +# Set a flag if we have an ANSI C compiler +if test "$ac_cv_prog_cc_stdc" != no; then + AC_DEFINE(HAVE_ANSI_COMPILER, 1, + [Define to 1 if your compiler conforms to the ANSI C standard.]) +fi + + +# Determine what kind of variadic function calls we support +AC_CHECK_HEADERS(stdarg.h varargs.h, break) + +AM_PROG_CC_C_O +AC_C_CONST +AC_TYPE_SIGNAL +AC_TYPE_UID_T +AC_TYPE_PID_T + +# Find some definition for uintmax_t + +AC_CHECK_TYPE(uintmax_t,,[ + uintmax_t="unsigned long" + AC_CHECK_TYPE(unsigned long long,[uintmax_t="unsigned long long"]) + AC_DEFINE_UNQUOTED(uintmax_t,$uintmax_t, + [Define uintmax_t if not defined in or .])]) + +# Find out whether our struct stat returns nanosecond resolution timestamps. + +AC_STRUCT_ST_MTIM_NSEC +AC_MSG_CHECKING([whether to use high resolution file timestamps]) +AC_CACHE_VAL(make_cv_file_timestamp_hi_res, [ + make_cv_file_timestamp_hi_res=no + if test "$ac_cv_struct_st_mtim_nsec" != no; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +# if HAVE_INTTYPES_H +# include +# endif]], + [[char a[0x7fffffff < (uintmax_t)-1 >> 30 ? 1 : -1];]])], + [make_cv_file_timestamp_hi_res=yes], + []) + fi]) +AC_MSG_RESULT($make_cv_file_timestamp_hi_res) +if test "$make_cv_file_timestamp_hi_res" = yes; then + val=1 +else + val=0 +fi +AC_DEFINE_UNQUOTED(FILE_TIMESTAMP_HI_RES, $val, + [Use high resolution file timestamps if nonzero.]) + +if test "$make_cv_file_timestamp_hi_res" = yes; then + # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function. + # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4. + AC_SEARCH_LIBS(clock_gettime, [rt posix4]) + if test "$ac_cv_search_clock_gettime" != no; then + AC_DEFINE(HAVE_CLOCK_GETTIME, 1, + [Define to 1 if you have the clock_gettime function.]) + fi +fi + +# Check for DOS-style pathnames. +pds_AC_DOS_PATHS + +# See if we have a standard version of gettimeofday(). Since actual +# implementations can differ, just make sure we have the most common +# one. +AC_CACHE_CHECK([for standard gettimeofday], ac_cv_func_gettimeofday, + [ac_cv_func_gettimeofday=no + AC_RUN_IFELSE([AC_LANG_SOURCE([[#include + int main () + { + struct timeval t; t.tv_sec = -1; t.tv_usec = -1; + exit (gettimeofday (&t, 0) != 0 + || t.tv_sec < 0 || t.tv_usec < 0); + }]])], + [ac_cv_func_gettimeofday=yes], + [ac_cv_func_gettimeofday=no], + [ac_cv_func_gettimeofday="no (cross-compiling)"])]) +if test "$ac_cv_func_gettimeofday" = yes; then + AC_DEFINE(HAVE_GETTIMEOFDAY, 1, + [Define to 1 if you have a standard gettimeofday function]) +fi + +AC_CHECK_FUNCS( strdup strndup mkstemp mktemp fdopen fileno \ + dup2 getcwd realpath sigsetmask sigaction \ + getgroups seteuid setegid setlinebuf setreuid setregid \ + getrlimit setrlimit setvbuf pipe strerror strsignal \ + lstat readlink atexit) + +# We need to check declarations, not just existence, because on Tru64 this +# function is not declared without special flags, which themselves cause +# other problems. We'll just use our own. +AC_CHECK_DECLS([bsd_signal], [], [], [[#include ]]) + +AC_FUNC_SETVBUF_REVERSED + +# Rumor has it that strcasecmp lives in -lresolv on some odd systems. +# It doesn't hurt much to use our own if we can't find it so I don't +# make the effort here. +AC_CHECK_FUNCS(strcasecmp strncasecmp strcmpi strncmpi stricmp strnicmp) + +# strcoll() is used by the GNU glob library +AC_FUNC_STRCOLL + +AC_FUNC_ALLOCA +AC_FUNC_FORK([]) +AC_FUNC_VPRINTF +AC_FUNC_CLOSEDIR_VOID + +AC_FUNC_GETLOADAVG + +# AC_FUNC_GETLOADAVG is documented to set the NLIST_STRUCT value, but it +# doesn't. So, we will. + +if test "$ac_cv_header_nlist_h" = yes; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[struct nlist nl; + nl.n_name = "string"; + return 0;]])], + [make_cv_nlist_struct=yes], + [make_cv_nlist_struct=no]) + if test "$make_cv_nlist_struct" = yes; then + AC_DEFINE(NLIST_STRUCT, 1, + [Define to 1 if struct nlist.n_name is a pointer rather than an array.]) + fi +fi + +AC_CHECK_DECLS([sys_siglist, _sys_siglist, __sys_siglist], , , + [AC_INCLUDES_DEFAULT +#include +/* NetBSD declares sys_siglist in unistd.h. */ +#if HAVE_UNISTD_H +# include +#endif +]) + + +# Check out the wait reality. +AC_CHECK_HEADERS(sys/wait.h,,,[[#include ]]) +AC_CHECK_FUNCS(waitpid wait3) +AC_MSG_CHECKING(for union wait) +AC_CACHE_VAL(make_cv_union_wait, [dnl + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +#include ]], + [[union wait status; int pid; pid = wait (&status); +#ifdef WEXITSTATUS +/* Some POSIXoid systems have both the new-style macros and the old + union wait type, and they do not work together. If union wait + conflicts with WEXITSTATUS et al, we don't want to use it at all. */ + if (WEXITSTATUS (status) != 0) pid = -1; +#ifdef WTERMSIG + /* If we have WEXITSTATUS and WTERMSIG, just use them on ints. */ + -- blow chunks here -- +#endif +#endif +#ifdef HAVE_WAITPID + /* Make sure union wait works with waitpid. */ + pid = waitpid (-1, &status, 0); +#endif + ]])], + [make_cv_union_wait=yes], + [make_cv_union_wait=no])]) +if test "$make_cv_union_wait" = yes; then + AC_DEFINE(HAVE_UNION_WAIT, 1, + [Define to 1 if you have the \`union wait' type in .]) +fi +AC_MSG_RESULT($make_cv_union_wait) + + +# If we're building on Windows/DOS/OS/2, add some support for DOS drive specs. +if test "$PATH_SEPARATOR" = ';'; then + AC_DEFINE(HAVE_DOS_PATHS, 1, + [Define to 1 if your system requires backslashes or drive specs in pathnames.]) +fi + + +# See if the user wants to use pmake's "customs" distributed build capability + +AC_SUBST(REMOTE) REMOTE=stub +use_customs=false +AC_ARG_WITH(customs, + AC_HELP_STRING([--with-customs=DIR], + [enable remote jobs via Customs--see README.customs]), + [case $withval in + n|no) : ;; + *) make_cppflags="$CPPFLAGS" + case $withval in + y|ye|yes) : ;; + *) CPPFLAGS="$CPPFLAGS -I$with_customs/include/customs" + make_ldflags="$LDFLAGS -L$with_customs/lib" ;; + esac + CF_NETLIBS + AC_CHECK_HEADER(customs.h, + [use_customs=true + REMOTE=cstms + LIBS="$LIBS -lcustoms" LDFLAGS="$make_ldflags"], + [with_customs=no + CPPFLAGS="$make_cppflags" make_badcust=yes]) + ;; + esac]) +# Tell automake about this, so it can include the right .c files. +AM_CONDITIONAL(USE_CUSTOMS, test "$use_customs" = true) + +# See if the user asked to handle case insensitive file systems. + +AH_TEMPLATE(HAVE_CASE_INSENSITIVE_FS, [Use case insensitive file names]) +AC_ARG_ENABLE(case-insensitive-file-system, + AC_HELP_STRING([--enable-case-insensitive-file-system], + [assume file systems are case insensitive]), + [case $enableval in + yes) AC_DEFINE(HAVE_CASE_INSENSITIVE_FS) ;; + esac]) + +# See if we can handle the job server feature, and if the user wants it. + +AC_ARG_ENABLE(job-server, + AC_HELP_STRING([--disable-job-server], + [disallow recursive make communication during -jN]), + [make_cv_job_server="$enableval" user_job_server="$enableval"], + [make_cv_job_server="yes"]) + +has_wait_nohang=yes +case "$ac_cv_func_waitpid/$ac_cv_func_wait3" in + no/no) has_wait_nohang=no ;; +esac + +AC_CACHE_CHECK(for SA_RESTART, make_cv_sa_restart, [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[return SA_RESTART;]])], + [make_cv_sa_restart=yes], + [make_cv_sa_restart=no])]) + +if test "$make_cv_sa_restart" != no; then + AC_DEFINE(HAVE_SA_RESTART, 1, + [Define to 1 if defines the SA_RESTART constant.]) +fi + +# enable make_cv_sa_restart for OS/2 so that the jobserver will be enabled, +# but do it after HAVE_SA_RESTART has been defined. +case "$host_os" in + os2*) make_cv_sa_restart=yes ;; +esac + +case "$ac_cv_func_pipe/$ac_cv_func_sigaction/$make_cv_sa_restart/$has_wait_nohang/$make_cv_job_server" in + yes/yes/yes/yes/yes) + AC_DEFINE(MAKE_JOBSERVER, 1, + [Define to 1 to enable job server support in GNU make.]);; +esac + +# if we have both lstat() and readlink() then we can support symlink +# timechecks. +case "$ac_cv_func_lstat/$ac_cv_func_readlink" in + yes/yes) + AC_DEFINE(MAKE_SYMLINKS, 1, + [Define to 1 to enable symbolic link timestamp checking.]);; +esac + +# Find the SCCS commands, so we can include them in our default rules. + +AC_CACHE_CHECK(for location of SCCS get command, make_cv_path_sccs_get, [ +if test -f /usr/sccs/get; then + make_cv_path_sccs_get=/usr/sccs/get +else + make_cv_path_sccs_get=get +fi]) +AC_DEFINE_UNQUOTED(SCCS_GET, ["$make_cv_path_sccs_get"], + [Define to the name of the SCCS 'get' command.]) + +ac_clean_files="$ac_clean_files s.conftest conftoast" # Remove these later. +if ( /usr/sccs/admin -n s.conftest || admin -n s.conftest ) >/dev/null 2>&1 && + test -f s.conftest; then + # We successfully created an SCCS file. + AC_CACHE_CHECK(if SCCS get command understands -G, make_cv_sys_get_minus_G, [ + if $make_cv_path_sccs_get -Gconftoast s.conftest >/dev/null 2>&1 && + test -f conftoast; then + make_cv_sys_get_minus_G=yes + else + make_cv_sys_get_minus_G=no + fi]) + case "$make_cv_sys_get_minus_G" in + yes) AC_DEFINE(SCCS_GET_MINUS_G, 1, + [Define to 1 if the SCCS 'get' command understands the '-G' option.]);; + esac +fi +rm -f s.conftest conftoast + +# Check the system to see if it provides GNU glob. If not, use our +# local version. +AC_MSG_CHECKING(if system libc has GNU glob) +AC_CACHE_VAL(make_cv_sys_gnu_glob, [ + AC_EGREP_CPP(gnu glob,[ +#include +#include +#include + +#define GLOB_INTERFACE_VERSION 1 +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include +# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION + gnu glob +# endif +#endif + ], [AC_MSG_RESULT(yes) +make_cv_sys_gnu_glob=yes], [AC_MSG_RESULT([no; using local copy]) +make_cv_sys_gnu_glob=no])]) +if test "$make_cv_sys_gnu_glob" = no; then + GLOBINC='-I$(srcdir)/glob' + GLOBLIB=glob/libglob.a +fi +AC_SUBST(GLOBINC) +AC_SUBST(GLOBLIB) + +# Tell automake about this, so it can build the right .c files. +AM_CONDITIONAL(USE_LOCAL_GLOB, test "$make_cv_sys_gnu_glob" = no) + +# Let the makefile know what our build host is + +AC_DEFINE_UNQUOTED(MAKE_HOST,"$host",[Build host information.]) +MAKE_HOST="$host" +AC_SUBST(MAKE_HOST) + +w32_target_env=no +AM_CONDITIONAL([WINDOWSENV], false) + +case "$host" in + *-*-mingw32) + AM_CONDITIONAL(WINDOWSENV, true) + w32_target_env=yes + AC_DEFINE([WINDOWS32], [1], [Use platform specific coding]) + AC_DEFINE([HAVE_DOS_PATHS], [1], [Use platform specific coding]) + ;; +esac + +AC_DEFINE_UNQUOTED(PATH_SEPARATOR_CHAR,'$PATH_SEPARATOR',[Define to the character that separates directories in PATH.]) + +# Include the Maintainer's Makefile section, if it's here. + +MAINT_MAKEFILE=/dev/null +if test -r "$srcdir/maintMakefile"; then + MAINT_MAKEFILE="$srcdir/maintMakefile" +fi +AC_SUBST_FILE(MAINT_MAKEFILE) + +# Allow building with dmalloc +AM_WITH_DMALLOC + +# Forcibly disable SET_MAKE. If it's set it breaks things like the test +# scripts, etc. +SET_MAKE= + +# Sanity check and inform the user of what we found + +case "$make_badcust" in + yes) echo + echo "WARNING: --with-customs specified but no customs.h could be found;" + echo " disabling Customs support." + echo ;; +esac + +case "$with_customs" in + ""|n|no|y|ye|yes) ;; + *) if test -f "$with_customs/lib/libcustoms.a"; then + : + else + echo + echo "WARNING: '$with_customs/lib' does not appear to contain the" + echo " Customs library. You must build and install Customs" + echo " before compiling GNU make." + echo + fi ;; +esac + +case "$has_wait_nohang" in + no) echo + echo "WARNING: Your system has neither waitpid() nor wait3()." + echo " Without one of these, signal handling is unreliable." + echo " You should be aware that running GNU make with -j" + echo " could result in erratic behavior." + echo ;; +esac + +case "$make_cv_job_server/$user_job_server" in + no/yes) echo + echo "WARNING: Make job server requires a POSIX-ish system that" + echo " supports the pipe(), sigaction(), and either" + echo " waitpid() or wait3() functions. Your system doesn't" + echo " appear to provide one or more of those." + echo " Disabling job server support." + echo ;; +esac + + +# Specify what files are to be created. +AC_CONFIG_FILES(Makefile glob/Makefile po/Makefile.in config/Makefile doc/Makefile w32/Makefile) + +# OK, do it! + +AC_OUTPUT + +# We only generate the build.sh if we have a build.sh.in; we won't have +# one before we've created a distribution. +if test -f "$srcdir/build.sh.in"; then + ./config.status --file build.sh + chmod +x build.sh +fi + +dnl Local Variables: +dnl comment-start: "dnl " +dnl comment-end: "" +dnl comment-start-skip: "\\bdnl\\b\\s *" +dnl compile-command: "make configure config.h.in" +dnl End: diff --git a/debug.h b/debug.h new file mode 100644 index 0000000..3d20c87 --- /dev/null +++ b/debug.h @@ -0,0 +1,38 @@ +/* Debugging macros and interface. +Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, +2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#define DB_NONE (0x000) +#define DB_BASIC (0x001) +#define DB_VERBOSE (0x002) +#define DB_JOBS (0x004) +#define DB_IMPLICIT (0x008) +#define DB_MAKEFILES (0x100) + +#define DB_ALL (0xfff) + +extern int db_level; + +#define ISDB(_l) ((_l)&db_level) + +#define DBS(_l,_x) do{ if(ISDB(_l)) {print_spaces (depth); \ + printf _x; fflush (stdout);} }while(0) + +#define DBF(_l,_x) do{ if(ISDB(_l)) {print_spaces (depth); \ + printf (_x, file->name); \ + fflush (stdout);} }while(0) + +#define DB(_l,_x) do{ if(ISDB(_l)) {printf _x; fflush (stdout);} }while(0) diff --git a/default.c b/default.c new file mode 100644 index 0000000..4d6d984 --- /dev/null +++ b/default.c @@ -0,0 +1,607 @@ +/* Data base of default implicit rules for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "filedef.h" +#include "variable.h" +#include "rule.h" +#include "dep.h" +#include "job.h" +#include "commands.h" + +/* Define GCC_IS_NATIVE if gcc is the native development environment on + your system (gcc/bison/flex vs cc/yacc/lex). */ +#if defined(__MSDOS__) || defined(__EMX__) +# define GCC_IS_NATIVE +#endif + + +/* This is the default list of suffixes for suffix rules. + `.s' must come last, so that a `.o' file will be made from + a `.c' or `.p' or ... file rather than from a .s file. */ + +static char default_suffixes[] +#ifdef VMS + = ".exe .olb .ln .obj .c .cxx .cc .pas .p .for .f .r .y .l .mar \ +.s .ss .i .ii .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \ +.w .ch .cweb .web .com .sh .elc .el"; +#elif defined(__EMX__) + = ".out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S \ +.mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \ +.w .ch .web .sh .elc .el .obj .exe .dll .lib"; +#else + = ".out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S \ +.mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \ +.w .ch .web .sh .elc .el"; +#endif + +static struct pspec default_pattern_rules[] = + { + { "(%)", "%", + "$(AR) $(ARFLAGS) $@ $<" }, + + /* The X.out rules are only in BSD's default set because + BSD Make has no null-suffix rules, so `foo.out' and + `foo' are the same thing. */ +#ifdef VMS + { "%.exe", "%", + "copy $< $@" }, +#else + { "%.out", "%", + "@rm -f $@ \n cp $< $@" }, +#endif + /* Syntax is "ctangle foo.w foo.ch foo.c". */ + { "%.c", "%.w %.ch", + "$(CTANGLE) $^ $@" }, + { "%.tex", "%.w %.ch", + "$(CWEAVE) $^ $@" }, + + { 0, 0, 0 } + }; + +static struct pspec default_terminal_rules[] = + { +#ifdef VMS + /* RCS. */ + { "%", "%$$5lv", /* Multinet style */ + "if f$$search($@) .nes. \"\" then +$(CHECKOUT,v)" }, + { "%", "[.$$rcs]%$$5lv", /* Multinet style */ + "if f$$search($@) .nes. \"\" then +$(CHECKOUT,v)" }, + { "%", "%_v", /* Normal style */ + "if f$$search($@) .nes. \"\" then +$(CHECKOUT,v)" }, + { "%", "[.rcs]%_v", /* Normal style */ + "if f$$search($@) .nes. \"\" then +$(CHECKOUT,v)" }, + + /* SCCS. */ + /* ain't no SCCS on vms */ +#else + /* RCS. */ + { "%", "%,v", + "$(CHECKOUT,v)" }, + { "%", "RCS/%,v", + "$(CHECKOUT,v)" }, + { "%", "RCS/%", + "$(CHECKOUT,v)" }, + + /* SCCS. */ + { "%", "s.%", + "$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" }, + { "%", "SCCS/s.%", + "$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" }, +#endif /* !VMS */ + { 0, 0, 0 } + }; + +static char *default_suffix_rules[] = + { +#ifdef VMS + ".obj.exe", + "$(LINK.obj) $^ $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@", + ".mar.exe", + "$(COMPILE.mar) $^ \n $(LINK.obj) $(subst .mar,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@", + ".s.exe", + "$(COMPILE.s) $^ \n $(LINK.obj) $(subst .s,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@", + ".c.exe", + "$(COMPILE.c) $^ \n $(LINK.obj) $(subst .c,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@", + ".cc.exe", +#ifdef GCC_IS_NATIVE + "$(COMPILE.cc) $^ \n $(LINK.obj) $(CXXSTARTUP),sys$$disk:[]$(subst .cc,.obj,$^) $(LOADLIBES) $(LXLIBS) $(LDLIBS) $(CXXRT0) /exe=$@", +#else + "$(COMPILE.cc) $^ \n $(CXXLINK.obj) $(subst .cc,.obj,$^) $(LOADLIBES) $(LXLIBS) $(LDLIBS) $(CXXRT0) /exe=$@", + ".cxx.exe", + "$(COMPILE.cxx) $^ \n $(CXXLINK.obj) $(subst .cxx,.obj,$^) $(LOADLIBES) $(LXLIBS) $(LDLIBS) $(CXXRT0) /exe=$@", +#endif + ".for.exe", + "$(COMPILE.for) $^ \n $(LINK.obj) $(subst .for,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@", + ".pas.exe", + "$(COMPILE.pas) $^ \n $(LINK.obj) $(subst .pas,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@", + + ".com", + "copy $< >$@", + + ".mar.obj", + "$(COMPILE.mar) /obj=$@ $<", + ".s.obj", + "$(COMPILE.s) /obj=$@ $<", + ".ss.obj", + "$(COMPILE.s) /obj=$@ $<", + ".c.i", + "$(COMPILE.c)/prep /list=$@ $<", + ".c.s", + "$(COMPILE.c)/noobj/machine /list=$@ $<", + ".i.s", + "$(COMPILE.c)/noprep/noobj/machine /list=$@ $<", + ".c.obj", + "$(COMPILE.c) /obj=$@ $<", + ".cc.ii", + "$(COMPILE.cc)/prep /list=$@ $<", + ".cc.ss", + "$(COMPILE.cc)/noobj/machine /list=$@ $<", + ".ii.ss", + "$(COMPILE.cc)/noprep/noobj/machine /list=$@ $<", + ".cc.obj", + "$(COMPILE.cc) /obj=$@ $<", + ".cxx.obj", + "$(COMPILE.cxx) /obj=$@ $<", + ".for.obj", + "$(COMPILE.for) /obj=$@ $<", + ".pas.obj", + "$(COMPILE.pas) /obj=$@ $<", + + ".y.c", + "$(YACC.y) $< \n rename y_tab.c $@", + ".l.c", + "$(LEX.l) $< \n rename lexyy.c $@", + + ".texinfo.info", + "$(MAKEINFO) $<", + + ".tex.dvi", + "$(TEX) $<", + +#else /* ! VMS */ + + ".o", + "$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".s", + "$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".S", + "$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".c", + "$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".cc", + "$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".C", + "$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".cpp", + "$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".f", + "$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".m", + "$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".p", + "$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".F", + "$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".r", + "$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@", + ".mod", + "$(COMPILE.mod) -o $@ -e $@ $^", + + ".def.sym", + "$(COMPILE.def) -o $@ $<", + + ".sh", + "cat $< >$@ \n chmod a+x $@", + + ".s.o", + "$(COMPILE.s) -o $@ $<", + ".S.o", + "$(COMPILE.S) -o $@ $<", + ".c.o", + "$(COMPILE.c) $(OUTPUT_OPTION) $<", + ".cc.o", + "$(COMPILE.cc) $(OUTPUT_OPTION) $<", + ".C.o", + "$(COMPILE.C) $(OUTPUT_OPTION) $<", + ".cpp.o", + "$(COMPILE.cpp) $(OUTPUT_OPTION) $<", + ".f.o", + "$(COMPILE.f) $(OUTPUT_OPTION) $<", + ".m.o", + "$(COMPILE.m) $(OUTPUT_OPTION) $<", + ".p.o", + "$(COMPILE.p) $(OUTPUT_OPTION) $<", + ".F.o", + "$(COMPILE.F) $(OUTPUT_OPTION) $<", + ".r.o", + "$(COMPILE.r) $(OUTPUT_OPTION) $<", + ".mod.o", + "$(COMPILE.mod) -o $@ $<", + + ".c.ln", + "$(LINT.c) -C$* $<", + ".y.ln", +#ifndef __MSDOS__ + "$(YACC.y) $< \n $(LINT.c) -C$* y.tab.c \n $(RM) y.tab.c", +#else + "$(YACC.y) $< \n $(LINT.c) -C$* y_tab.c \n $(RM) y_tab.c", +#endif + ".l.ln", + "@$(RM) $*.c\n $(LEX.l) $< > $*.c\n$(LINT.c) -i $*.c -o $@\n $(RM) $*.c", + + ".y.c", +#ifndef __MSDOS__ + "$(YACC.y) $< \n mv -f y.tab.c $@", +#else + "$(YACC.y) $< \n mv -f y_tab.c $@", +#endif + ".l.c", + "@$(RM) $@ \n $(LEX.l) $< > $@", + ".ym.m", + "$(YACC.m) $< \n mv -f y.tab.c $@", + ".lm.m", + "@$(RM) $@ \n $(LEX.m) $< > $@", + + ".F.f", + "$(PREPROCESS.F) $(OUTPUT_OPTION) $<", + ".r.f", + "$(PREPROCESS.r) $(OUTPUT_OPTION) $<", + + /* This might actually make lex.yy.c if there's no %R% directive in $*.l, + but in that case why were you trying to make $*.r anyway? */ + ".l.r", + "$(LEX.l) $< > $@ \n mv -f lex.yy.r $@", + + ".S.s", + "$(PREPROCESS.S) $< > $@", + + ".texinfo.info", + "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@", + + ".texi.info", + "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@", + + ".txinfo.info", + "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@", + + ".tex.dvi", + "$(TEX) $<", + + ".texinfo.dvi", + "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<", + + ".texi.dvi", + "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<", + + ".txinfo.dvi", + "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<", + + ".w.c", + "$(CTANGLE) $< - $@", /* The `-' says there is no `.ch' file. */ + + ".web.p", + "$(TANGLE) $<", + + ".w.tex", + "$(CWEAVE) $< - $@", /* The `-' says there is no `.ch' file. */ + + ".web.tex", + "$(WEAVE) $<", + +#endif /* !VMS */ + + 0, 0, + }; + +static const char *default_variables[] = + { +#ifdef VMS +#ifdef __ALPHA + "ARCH", "ALPHA", +#endif +#ifdef __ia64 + "ARCH", "IA64", +#endif +#ifdef __VAX + "ARCH", "VAX", +#endif + "AR", "library/obj", + "ARFLAGS", "/replace", + "AS", "macro", + "MACRO", "macro", +#ifdef GCC_IS_NATIVE + "CC", "gcc", +#else + "CC", "cc", +#endif + "CD", "builtin_cd", + "MAKE", "make", + "ECHO", "write sys$$output \"", +#ifdef GCC_IS_NATIVE + "C++", "gcc/plus", + "CXX", "gcc/plus", +#else + "C++", "cxx", + "CXX", "cxx", + "CXXLD", "cxxlink", +#endif + "CO", "co", + "CPP", "$(CC) /preprocess_only", + "FC", "fortran", + /* System V uses these, so explicit rules using them should work. + However, there is no way to make implicit rules use them and FC. */ + "F77", "$(FC)", + "F77FLAGS", "$(FFLAGS)", + "LD", "link", + "LEX", "lex", + "PC", "pascal", + "YACC", "bison/yacc", + "YFLAGS", "/Define/Verbose", + "BISON", "bison", + "MAKEINFO", "makeinfo", + "TEX", "tex", + "TEXINDEX", "texindex", + + "RM", "delete/nolog", + + "CSTARTUP", "", +#ifdef GCC_IS_NATIVE + "CRT0", ",sys$$library:vaxcrtl.olb/lib,gnu_cc_library:crt0.obj", + "CXXSTARTUP", "gnu_cc_library:crtbegin.obj", + "CXXRT0", ",sys$$library:vaxcrtl.olb/lib,gnu_cc_library:crtend.obj,gnu_cc_library:gxx_main.obj", + "LXLIBS", ",gnu_cc_library:libstdcxx.olb/lib,gnu_cc_library:libgccplus.olb/lib", + "LDLIBS", ",gnu_cc_library:libgcc.olb/lib", +#else + "CRT0", "", + "CXXSTARTUP", "", + "CXXRT0", "", + "LXLIBS", "", + "LDLIBS", "", +#endif + + "LINK.obj", "$(LD) $(LDFLAGS)", +#ifndef GCC_IS_NATIVE + "CXXLINK.obj", "$(CXXLD) $(LDFLAGS)", + "COMPILE.cxx", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH)", +#endif + "COMPILE.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)", + "COMPILE.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH)", + "YACC.y", "$(YACC) $(YFLAGS)", + "LEX.l", "$(LEX) $(LFLAGS)", + "COMPILE.for", "$(FC) $(FFLAGS) $(TARGET_ARCH)", + "COMPILE.pas", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH)", + "COMPILE.mar", "$(MACRO) $(MACROFLAGS)", + "COMPILE.s", "$(AS) $(ASFLAGS) $(TARGET_MACH)", + "LINT.c", "$(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)", + + "MV", "rename/new_version", + "CP", "copy", + +#else /* !VMS */ + + "AR", "ar", + "ARFLAGS", "rv", + "AS", "as", +#ifdef GCC_IS_NATIVE + "CC", "gcc", +# ifdef __MSDOS__ + "CXX", "gpp", /* g++ is an invalid name on MSDOS */ +# else + "CXX", "gcc", +# endif /* __MSDOS__ */ + "OBJC", "gcc", +#else + "CC", "cc", + "CXX", "g++", + "OBJC", "cc", +#endif + + /* This expands to $(CO) $(COFLAGS) $< $@ if $@ does not exist, + and to the empty string if $@ does exist. */ + "CHECKOUT,v", "+$(if $(wildcard $@),,$(CO) $(COFLAGS) $< $@)", + "CO", "co", + "COFLAGS", "", + + "CPP", "$(CC) -E", +#ifdef CRAY + "CF77PPFLAGS", "-P", + "CF77PP", "/lib/cpp", + "CFT", "cft77", + "CF", "cf77", + "FC", "$(CF)", +#else /* Not CRAY. */ +#ifdef _IBMR2 + "FC", "xlf", +#else +#ifdef __convex__ + "FC", "fc", +#else + "FC", "f77", +#endif /* __convex__ */ +#endif /* _IBMR2 */ + /* System V uses these, so explicit rules using them should work. + However, there is no way to make implicit rules use them and FC. */ + "F77", "$(FC)", + "F77FLAGS", "$(FFLAGS)", +#endif /* Cray. */ + "GET", SCCS_GET, + "LD", "ld", +#ifdef GCC_IS_NATIVE + "LEX", "flex", +#else + "LEX", "lex", +#endif + "LINT", "lint", + "M2C", "m2c", +#ifdef pyr + "PC", "pascal", +#else +#ifdef CRAY + "PC", "PASCAL", + "SEGLDR", "segldr", +#else + "PC", "pc", +#endif /* CRAY. */ +#endif /* pyr. */ +#ifdef GCC_IS_NATIVE + "YACC", "bison -y", +#else + "YACC", "yacc", /* Or "bison -y" */ +#endif + "MAKEINFO", "makeinfo", + "TEX", "tex", + "TEXI2DVI", "texi2dvi", + "WEAVE", "weave", + "CWEAVE", "cweave", + "TANGLE", "tangle", + "CTANGLE", "ctangle", + + "RM", "rm -f", + + "LINK.o", "$(CC) $(LDFLAGS) $(TARGET_ARCH)", + "COMPILE.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c", + "LINK.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", + "COMPILE.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c", + "LINK.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", + "COMPILE.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c", + "COMPILE.C", "$(COMPILE.cc)", + "COMPILE.cpp", "$(COMPILE.cc)", + "LINK.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", + "LINK.C", "$(LINK.cc)", + "LINK.cpp", "$(LINK.cc)", + "YACC.y", "$(YACC) $(YFLAGS)", + "LEX.l", "$(LEX) $(LFLAGS) -t", + "YACC.m", "$(YACC) $(YFLAGS)", + "LEX.m", "$(LEX) $(LFLAGS) -t", + "COMPILE.f", "$(FC) $(FFLAGS) $(TARGET_ARCH) -c", + "LINK.f", "$(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)", + "COMPILE.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c", + "LINK.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", + "COMPILE.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c", + "LINK.r", "$(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)", + "COMPILE.def", "$(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)", + "COMPILE.mod", "$(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)", + "COMPILE.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c", + "LINK.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)", + "LINK.s", "$(CC) $(ASFLAGS) $(LDFLAGS) $(TARGET_MACH)", + "COMPILE.s", "$(AS) $(ASFLAGS) $(TARGET_MACH)", + "LINK.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)", + "COMPILE.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c", + "PREPROCESS.S", "$(CC) -E $(CPPFLAGS)", + "PREPROCESS.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F", + "PREPROCESS.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F", + "LINT.c", "$(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)", + +#ifndef NO_MINUS_C_MINUS_O + "OUTPUT_OPTION", "-o $@", +#endif + +#ifdef SCCS_GET_MINUS_G + "SCCS_OUTPUT_OPTION", "-G$@", +#endif + +#ifdef _AMIGA + ".LIBPATTERNS", "%.lib", +#else +#ifdef __MSDOS__ + ".LIBPATTERNS", "lib%.a $(DJDIR)/lib/lib%.a", +#else + ".LIBPATTERNS", "lib%.so lib%.a", +#endif +#endif + +#endif /* !VMS */ + 0, 0 + }; + +/* Set up the default .SUFFIXES list. */ + +void +set_default_suffixes (void) +{ + suffix_file = enter_file (strcache_add (".SUFFIXES")); + + if (no_builtin_rules_flag) + define_variable_cname ("SUFFIXES", "", o_default, 0); + else + { + char *p = default_suffixes; + suffix_file->deps = enter_prereqs(PARSE_FILE_SEQ (&p, struct dep, '\0', + NULL, 0), + NULL); + define_variable_cname ("SUFFIXES", default_suffixes, o_default, 0); + } +} + +/* Enter the default suffix rules as file rules. This used to be done in + install_default_implicit_rules, but that loses because we want the + suffix rules installed before reading makefiles, and the pattern rules + installed after. */ + +void +install_default_suffix_rules (void) +{ + char **s; + + if (no_builtin_rules_flag) + return; + + for (s = default_suffix_rules; *s != 0; s += 2) + { + struct file *f = enter_file (strcache_add (s[0])); + /* Don't clobber cmds given in a makefile if there were any. */ + if (f->cmds == 0) + { + f->cmds = xmalloc (sizeof (struct commands)); + f->cmds->fileinfo.filenm = 0; + f->cmds->commands = s[1]; + f->cmds->command_lines = 0; + } + } +} + + +/* Install the default pattern rules. */ + +void +install_default_implicit_rules (void) +{ + struct pspec *p; + + if (no_builtin_rules_flag) + return; + + for (p = default_pattern_rules; p->target != 0; ++p) + install_pattern_rule (p, 0); + + for (p = default_terminal_rules; p->target != 0; ++p) + install_pattern_rule (p, 1); +} + +void +define_default_variables (void) +{ + const char **s; + + if (no_builtin_variables_flag) + return; + + for (s = default_variables; *s != 0; s += 2) + define_variable (s[0], strlen (s[0]), s[1], o_default, 1); +} diff --git a/dep.h b/dep.h new file mode 100644 index 0000000..c27423b --- /dev/null +++ b/dep.h @@ -0,0 +1,93 @@ +/* Definitions of dependency data structures for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +/* Flag bits for the second argument to `read_makefile'. + These flags are saved in the `changed' field of each + `struct dep' in the chain returned by `read_all_makefiles'. */ + +#define RM_NO_DEFAULT_GOAL (1 << 0) /* Do not set default goal. */ +#define RM_INCLUDED (1 << 1) /* Search makefile search path. */ +#define RM_DONTCARE (1 << 2) /* No error if it doesn't exist. */ +#define RM_NO_TILDE (1 << 3) /* Don't expand ~ in file name. */ +#define RM_NOFLAG 0 + +/* Structure representing one dependency of a file. + Each struct file's `deps' points to a chain of these, + chained through the `next'. `stem' is the stem for this + dep line of static pattern rule or NULL. + + Note that the first two words of this match a struct nameseq. */ + +struct dep + { + struct dep *next; + const char *name; + const char *stem; + struct file *file; + unsigned int changed : 8; + unsigned int ignore_mtime : 1; + unsigned int staticpattern : 1; + unsigned int need_2nd_expansion : 1; + unsigned int dontcare : 1; + }; + + +/* Structure used in chains of names, for parsing and globbing. */ + +struct nameseq + { + struct nameseq *next; + const char *name; + }; + + +#define PARSEFS_NONE (0x0000) +#define PARSEFS_NOSTRIP (0x0001) +#define PARSEFS_NOAR (0x0002) +#define PARSEFS_NOGLOB (0x0004) +#define PARSEFS_EXISTS (0x0008) +#define PARSEFS_NOCACHE (0x0010) + +#define PARSE_FILE_SEQ(_s,_t,_c,_p,_f) \ + (_t *)parse_file_seq ((_s),sizeof (_t),(_c),(_p),(_f)) + +#ifdef VMS +void *parse_file_seq (); +#else +void *parse_file_seq (char **stringp, unsigned int size, + int stopchar, const char *prefix, int flags); +#endif + +char *tilde_expand (const char *name); + +#ifndef NO_ARCHIVES +struct nameseq *ar_glob (const char *arname, const char *member_pattern, unsigned int size); +#endif + +#define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name) + +#define alloc_dep() (xcalloc (sizeof (struct dep))) +#define free_ns(_n) free (_n) +#define free_dep(_d) free_ns (_d) + +struct dep *copy_dep_chain (const struct dep *d); +void free_dep_chain (struct dep *d); +void free_ns_chain (struct nameseq *n); +struct dep *read_all_makefiles (const char **makefiles); +void eval_buffer (char *buffer); +int update_goal_chain (struct dep *goals); diff --git a/dir.c b/dir.c new file mode 100644 index 0000000..5529019 --- /dev/null +++ b/dir.c @@ -0,0 +1,1228 @@ +/* Directory hashing for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "hash.h" + +#ifdef HAVE_DIRENT_H +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +# ifdef VMS +/* its prototype is in vmsdir.h, which is not needed for HAVE_DIRENT_H */ +const char *vmsify (const char *name, int type); +# endif +#else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# ifdef HAVE_SYS_NDIR_H +# include +# endif +# ifdef HAVE_SYS_DIR_H +# include +# endif +# ifdef HAVE_NDIR_H +# include +# endif +# ifdef HAVE_VMSDIR_H +# include "vmsdir.h" +# endif /* HAVE_VMSDIR_H */ +#endif + +/* In GNU systems, defines this macro for us. */ +#ifdef _D_NAMLEN +# undef NAMLEN +# define NAMLEN(d) _D_NAMLEN(d) +#endif + +#if (defined (POSIX) || defined (VMS) || defined (WINDOWS32)) && !defined (__GNU_LIBRARY__) +/* Posix does not require that the d_ino field be present, and some + systems do not provide it. */ +# define REAL_DIR_ENTRY(dp) 1 +# define FAKE_DIR_ENTRY(dp) +#else +# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) +# define FAKE_DIR_ENTRY(dp) (dp->d_ino = 1) +#endif /* POSIX */ + +#ifdef __MSDOS__ +#include +#include + +/* If it's MSDOS that doesn't have _USE_LFN, disable LFN support. */ +#ifndef _USE_LFN +#define _USE_LFN 0 +#endif + +static const char * +dosify (const char *filename) +{ + static char dos_filename[14]; + char *df; + int i; + + if (filename == 0 || _USE_LFN) + return filename; + + /* FIXME: what about filenames which violate + 8+3 constraints, like "config.h.in", or ".emacs"? */ + if (strpbrk (filename, "\"*+,;<=>?[\\]|") != 0) + return filename; + + df = dos_filename; + + /* First, transform the name part. */ + for (i = 0; *filename != '\0' && i < 8 && *filename != '.'; ++i) + *df++ = tolower ((unsigned char)*filename++); + + /* Now skip to the next dot. */ + while (*filename != '\0' && *filename != '.') + ++filename; + if (*filename != '\0') + { + *df++ = *filename++; + for (i = 0; *filename != '\0' && i < 3 && *filename != '.'; ++i) + *df++ = tolower ((unsigned char)*filename++); + } + + /* Look for more dots. */ + while (*filename != '\0' && *filename != '.') + ++filename; + if (*filename == '.') + return filename; + *df = 0; + return dos_filename; +} +#endif /* __MSDOS__ */ + +#ifdef WINDOWS32 +#include "pathstuff.h" +#endif + +#ifdef _AMIGA +#include +#endif + +#ifdef HAVE_CASE_INSENSITIVE_FS +static const char * +downcase (const char *filename) +{ + static PATH_VAR (new_filename); + char *df; + + if (filename == 0) + return 0; + + df = new_filename; + while (*filename != '\0') + { + *df++ = tolower ((unsigned char)*filename); + ++filename; + } + + *df = 0; + + return new_filename; +} +#endif /* HAVE_CASE_INSENSITIVE_FS */ + +#ifdef VMS + +static int +vms_hash (const char *name) +{ + int h = 0; + int g; + + while (*name) + { + unsigned char uc = *name; +#ifdef HAVE_CASE_INSENSITIVE_FS + h = (h << 4) + (isupper (uc) ? tolower (uc) : uc); +#else + h = (h << 4) + uc; +#endif + name++; + g = h & 0xf0000000; + if (g) + { + h = h ^ (g >> 24); + h = h ^ g; + } + } + return h; +} + +/* fake stat entry for a directory */ +static int +vmsstat_dir (const char *name, struct stat *st) +{ + char *s; + int h; + DIR *dir; + + dir = opendir (name); + if (dir == 0) + return -1; + closedir (dir); + s = strchr (name, ':'); /* find device */ + if (s) + { + /* to keep the compiler happy we said "const char *name", now we cheat */ + *s++ = 0; + st->st_dev = (char *)vms_hash (name); + h = vms_hash (s); + *(s-1) = ':'; + } + else + { + st->st_dev = 0; + h = vms_hash (name); + } + + st->st_ino[0] = h & 0xff; + st->st_ino[1] = h & 0xff00; + st->st_ino[2] = h >> 16; + + return 0; +} +#endif /* VMS */ + +/* Hash table of directories. */ + +#ifndef DIRECTORY_BUCKETS +#define DIRECTORY_BUCKETS 199 +#endif + +struct directory_contents + { + dev_t dev; /* Device and inode numbers of this dir. */ +#ifdef WINDOWS32 + /* Inode means nothing on WINDOWS32. Even file key information is + * unreliable because it is random per file open and undefined for remote + * filesystems. The most unique attribute I can come up with is the fully + * qualified name of the directory. Beware though, this is also + * unreliable. I'm open to suggestion on a better way to emulate inode. */ + char *path_key; + int ctime; + int mtime; /* controls check for stale directory cache */ + int fs_flags; /* FS_FAT, FS_NTFS, ... */ +# define FS_FAT 0x1 +# define FS_NTFS 0x2 +# define FS_UNKNOWN 0x4 +#else +# ifdef VMS + ino_t ino[3]; +# else + ino_t ino; +# endif +#endif /* WINDOWS32 */ + struct hash_table dirfiles; /* Files in this directory. */ + DIR *dirstream; /* Stream reading this directory. */ + }; + +static unsigned long +directory_contents_hash_1 (const void *key_0) +{ + const struct directory_contents *key = key_0; + unsigned long hash; + +#ifdef WINDOWS32 + hash = 0; + ISTRING_HASH_1 (key->path_key, hash); + hash ^= ((unsigned int) key->dev << 4) ^ (unsigned int) key->ctime; +#else +# ifdef VMS + hash = (((unsigned int) key->dev << 4) + ^ ((unsigned int) key->ino[0] + + (unsigned int) key->ino[1] + + (unsigned int) key->ino[2])); +# else + hash = ((unsigned int) key->dev << 4) ^ (unsigned int) key->ino; +# endif +#endif /* WINDOWS32 */ + return hash; +} + +static unsigned long +directory_contents_hash_2 (const void *key_0) +{ + const struct directory_contents *key = key_0; + unsigned long hash; + +#ifdef WINDOWS32 + hash = 0; + ISTRING_HASH_2 (key->path_key, hash); + hash ^= ((unsigned int) key->dev << 4) ^ (unsigned int) ~key->ctime; +#else +# ifdef VMS + hash = (((unsigned int) key->dev << 4) + ^ ~((unsigned int) key->ino[0] + + (unsigned int) key->ino[1] + + (unsigned int) key->ino[2])); +# else + hash = ((unsigned int) key->dev << 4) ^ (unsigned int) ~key->ino; +# endif +#endif /* WINDOWS32 */ + + return hash; +} + +/* Sometimes it's OK to use subtraction to get this value: + result = X - Y; + But, if we're not sure of the type of X and Y they may be too large for an + int (on a 64-bit system for example). So, use ?: instead. + See Savannah bug #15534. + + NOTE! This macro has side-effects! +*/ + +#define MAKECMP(_x,_y) ((_x)<(_y)?-1:((_x)==(_y)?0:1)) + +static int +directory_contents_hash_cmp (const void *xv, const void *yv) +{ + const struct directory_contents *x = xv; + const struct directory_contents *y = yv; + int result; + +#ifdef WINDOWS32 + ISTRING_COMPARE (x->path_key, y->path_key, result); + if (result) + return result; + result = MAKECMP(x->ctime, y->ctime); + if (result) + return result; +#else +# ifdef VMS + result = MAKECMP(x->ino[0], y->ino[0]); + if (result) + return result; + result = MAKECMP(x->ino[1], y->ino[1]); + if (result) + return result; + result = MAKECMP(x->ino[2], y->ino[2]); + if (result) + return result; +# else + result = MAKECMP(x->ino, y->ino); + if (result) + return result; +# endif +#endif /* WINDOWS32 */ + + return MAKECMP(x->dev, y->dev); +} + +/* Table of directory contents hashed by device and inode number. */ +static struct hash_table directory_contents; + +struct directory + { + const char *name; /* Name of the directory. */ + + /* The directory's contents. This data may be shared by several + entries in the hash table, which refer to the same directory + (identified uniquely by `dev' and `ino') under different names. */ + struct directory_contents *contents; + }; + +static unsigned long +directory_hash_1 (const void *key) +{ + return_ISTRING_HASH_1 (((const struct directory *) key)->name); +} + +static unsigned long +directory_hash_2 (const void *key) +{ + return_ISTRING_HASH_2 (((const struct directory *) key)->name); +} + +static int +directory_hash_cmp (const void *x, const void *y) +{ + return_ISTRING_COMPARE (((const struct directory *) x)->name, + ((const struct directory *) y)->name); +} + +/* Table of directories hashed by name. */ +static struct hash_table directories; + +/* Never have more than this many directories open at once. */ + +#define MAX_OPEN_DIRECTORIES 10 + +static unsigned int open_directories = 0; + + +/* Hash table of files in each directory. */ + +struct dirfile + { + const char *name; /* Name of the file. */ + short length; + short impossible; /* This file is impossible. */ + }; + +static unsigned long +dirfile_hash_1 (const void *key) +{ + return_ISTRING_HASH_1 (((struct dirfile const *) key)->name); +} + +static unsigned long +dirfile_hash_2 (const void *key) +{ + return_ISTRING_HASH_2 (((struct dirfile const *) key)->name); +} + +static int +dirfile_hash_cmp (const void *xv, const void *yv) +{ + const struct dirfile *x = xv; + const struct dirfile *y = yv; + int result = x->length - y->length; + if (result) + return result; + return_ISTRING_COMPARE (x->name, y->name); +} + +#ifndef DIRFILE_BUCKETS +#define DIRFILE_BUCKETS 107 +#endif + +static int dir_contents_file_exists_p (struct directory_contents *dir, + const char *filename); +static struct directory *find_directory (const char *name); + +/* Find the directory named NAME and return its `struct directory'. */ + +static struct directory * +find_directory (const char *name) +{ + const char *p; + struct directory *dir; + struct directory **dir_slot; + struct directory dir_key; + int r; +#ifdef WINDOWS32 + char* w32_path; + char fs_label[BUFSIZ]; + char fs_type[BUFSIZ]; + unsigned long fs_serno; + unsigned long fs_flags; + unsigned long fs_len; +#endif +#ifdef VMS + if ((*name == '.') && (*(name+1) == 0)) + name = "[]"; + else + name = vmsify (name,1); +#endif + + dir_key.name = name; + dir_slot = (struct directory **) hash_find_slot (&directories, &dir_key); + dir = *dir_slot; + + if (HASH_VACANT (dir)) + { + struct stat st; + + /* The directory was not found. Create a new entry for it. */ + + p = name + strlen (name); + dir = xmalloc (sizeof (struct directory)); +#if defined(HAVE_CASE_INSENSITIVE_FS) && defined(VMS) + dir->name = strcache_add_len (downcase(name), p - name); +#else + dir->name = strcache_add_len (name, p - name); +#endif + hash_insert_at (&directories, dir, dir_slot); + /* The directory is not in the name hash table. + Find its device and inode numbers, and look it up by them. */ + +#ifdef VMS + r = vmsstat_dir (name, &st); +#elif defined(WINDOWS32) + { + char tem[MAXPATHLEN], *tstart, *tend; + + /* Remove any trailing slashes. Windows32 stat fails even on + valid directories if they end in a slash. */ + memcpy (tem, name, p - name + 1); + tstart = tem; + if (tstart[1] == ':') + tstart += 2; + for (tend = tem + (p - name - 1); + tend > tstart && (*tend == '/' || *tend == '\\'); + tend--) + *tend = '\0'; + + r = stat (tem, &st); + } +#else + EINTRLOOP (r, stat (name, &st)); +#endif + + if (r < 0) + { + /* Couldn't stat the directory. Mark this by + setting the `contents' member to a nil pointer. */ + dir->contents = 0; + } + else + { + /* Search the contents hash table; device and inode are the key. */ + + struct directory_contents *dc; + struct directory_contents **dc_slot; + struct directory_contents dc_key; + + dc_key.dev = st.st_dev; +#ifdef WINDOWS32 + dc_key.path_key = w32_path = w32ify (name, 1); + dc_key.ctime = st.st_ctime; +#else +# ifdef VMS + dc_key.ino[0] = st.st_ino[0]; + dc_key.ino[1] = st.st_ino[1]; + dc_key.ino[2] = st.st_ino[2]; +# else + dc_key.ino = st.st_ino; +# endif +#endif + dc_slot = (struct directory_contents **) hash_find_slot (&directory_contents, &dc_key); + dc = *dc_slot; + + if (HASH_VACANT (dc)) + { + /* Nope; this really is a directory we haven't seen before. */ + + dc = (struct directory_contents *) + xmalloc (sizeof (struct directory_contents)); + + /* Enter it in the contents hash table. */ + dc->dev = st.st_dev; +#ifdef WINDOWS32 + dc->path_key = xstrdup (w32_path); + dc->ctime = st.st_ctime; + dc->mtime = st.st_mtime; + + /* + * NTFS is the only WINDOWS32 filesystem that bumps mtime + * on a directory when files are added/deleted from + * a directory. + */ + w32_path[3] = '\0'; + if (GetVolumeInformation(w32_path, + fs_label, sizeof (fs_label), + &fs_serno, &fs_len, + &fs_flags, fs_type, sizeof (fs_type)) == FALSE) + dc->fs_flags = FS_UNKNOWN; + else if (!strcmp(fs_type, "FAT")) + dc->fs_flags = FS_FAT; + else if (!strcmp(fs_type, "NTFS")) + dc->fs_flags = FS_NTFS; + else + dc->fs_flags = FS_UNKNOWN; +#else +# ifdef VMS + dc->ino[0] = st.st_ino[0]; + dc->ino[1] = st.st_ino[1]; + dc->ino[2] = st.st_ino[2]; +# else + dc->ino = st.st_ino; +# endif +#endif /* WINDOWS32 */ + hash_insert_at (&directory_contents, dc, dc_slot); + ENULLLOOP (dc->dirstream, opendir (name)); + if (dc->dirstream == 0) + /* Couldn't open the directory. Mark this by setting the + `files' member to a nil pointer. */ + dc->dirfiles.ht_vec = 0; + else + { + hash_init (&dc->dirfiles, DIRFILE_BUCKETS, + dirfile_hash_1, dirfile_hash_2, dirfile_hash_cmp); + /* Keep track of how many directories are open. */ + ++open_directories; + if (open_directories == MAX_OPEN_DIRECTORIES) + /* We have too many directories open already. + Read the entire directory and then close it. */ + dir_contents_file_exists_p (dc, 0); + } + } + + /* Point the name-hashed entry for DIR at its contents data. */ + dir->contents = dc; + } + } + + return dir; +} + +/* Return 1 if the name FILENAME is entered in DIR's hash table. + FILENAME must contain no slashes. */ + +static int +dir_contents_file_exists_p (struct directory_contents *dir, + const char *filename) +{ + unsigned int hash; + struct dirfile *df; + struct dirent *d; +#ifdef WINDOWS32 + struct stat st; + int rehash = 0; +#endif + + if (dir == 0 || dir->dirfiles.ht_vec == 0) + /* The directory could not be stat'd or opened. */ + return 0; + +#ifdef __MSDOS__ + filename = dosify (filename); +#endif + +#ifdef HAVE_CASE_INSENSITIVE_FS + filename = downcase (filename); +#endif + +#ifdef __EMX__ + if (filename != 0) + _fnlwr (filename); /* lower case for FAT drives */ +#endif + +#ifdef VMS + filename = vmsify (filename,0); +#endif + + hash = 0; + if (filename != 0) + { + struct dirfile dirfile_key; + + if (*filename == '\0') + { + /* Checking if the directory exists. */ + return 1; + } + dirfile_key.name = filename; + dirfile_key.length = strlen (filename); + df = hash_find_item (&dir->dirfiles, &dirfile_key); + if (df) + return !df->impossible; + } + + /* The file was not found in the hashed list. + Try to read the directory further. */ + + if (dir->dirstream == 0) + { +#ifdef WINDOWS32 + /* + * Check to see if directory has changed since last read. FAT + * filesystems force a rehash always as mtime does not change + * on directories (ugh!). + */ + if (dir->path_key) + { + if ((dir->fs_flags & FS_FAT) != 0) + { + dir->mtime = time ((time_t *) 0); + rehash = 1; + } + else if (stat (dir->path_key, &st) == 0 && st.st_mtime > dir->mtime) + { + /* reset date stamp to show most recent re-process. */ + dir->mtime = st.st_mtime; + rehash = 1; + } + + /* If it has been already read in, all done. */ + if (!rehash) + return 0; + + /* make sure directory can still be opened; if not return. */ + dir->dirstream = opendir (dir->path_key); + if (!dir->dirstream) + return 0; + } + else +#endif + /* The directory has been all read in. */ + return 0; + } + + while (1) + { + /* Enter the file in the hash table. */ + unsigned int len; + struct dirfile dirfile_key; + struct dirfile **dirfile_slot; + + ENULLLOOP (d, readdir (dir->dirstream)); + if (d == 0) + { + if (errno) + fatal (NILF, "INTERNAL: readdir: %s\n", strerror (errno)); + break; + } + +#if defined(VMS) && defined(HAVE_DIRENT_H) + /* In VMS we get file versions too, which have to be stripped off */ + { + char *p = strrchr (d->d_name, ';'); + if (p) + *p = '\0'; + } +#endif + if (!REAL_DIR_ENTRY (d)) + continue; + + len = NAMLEN (d); + dirfile_key.name = d->d_name; + dirfile_key.length = len; + dirfile_slot = (struct dirfile **) hash_find_slot (&dir->dirfiles, &dirfile_key); +#ifdef WINDOWS32 + /* + * If re-reading a directory, don't cache files that have + * already been discovered. + */ + if (! rehash || HASH_VACANT (*dirfile_slot)) +#endif + { + df = xmalloc (sizeof (struct dirfile)); +#if defined(HAVE_CASE_INSENSITIVE_FS) && defined(VMS) + df->name = strcache_add_len (downcase(d->d_name), len); +#else + df->name = strcache_add_len (d->d_name, len); +#endif + df->length = len; + df->impossible = 0; + hash_insert_at (&dir->dirfiles, df, dirfile_slot); + } + /* Check if the name matches the one we're searching for. */ + if (filename != 0 && patheq (d->d_name, filename)) + return 1; + } + + /* If the directory has been completely read in, + close the stream and reset the pointer to nil. */ + if (d == 0) + { + --open_directories; + closedir (dir->dirstream); + dir->dirstream = 0; + } + return 0; +} + +/* Return 1 if the name FILENAME in directory DIRNAME + is entered in the dir hash table. + FILENAME must contain no slashes. */ + +int +dir_file_exists_p (const char *dirname, const char *filename) +{ + return dir_contents_file_exists_p (find_directory (dirname)->contents, + filename); +} + +/* Return 1 if the file named NAME exists. */ + +int +file_exists_p (const char *name) +{ + const char *dirend; + const char *dirname; + const char *slash; + +#ifndef NO_ARCHIVES + if (ar_name (name)) + return ar_member_date (name) != (time_t) -1; +#endif + +#ifdef VMS + dirend = strrchr (name, ']'); + if (dirend == 0) + dirend = strrchr (name, ':'); + if (dirend == 0) + return dir_file_exists_p ("[]", name); +#else /* !VMS */ + dirend = strrchr (name, '/'); +#ifdef HAVE_DOS_PATHS + /* Forward and backslashes might be mixed. We need the rightmost one. */ + { + const char *bslash = strrchr(name, '\\'); + if (!dirend || bslash > dirend) + dirend = bslash; + /* The case of "d:file". */ + if (!dirend && name[0] && name[1] == ':') + dirend = name + 1; + } +#endif /* HAVE_DOS_PATHS */ + if (dirend == 0) +#ifndef _AMIGA + return dir_file_exists_p (".", name); +#else /* !VMS && !AMIGA */ + return dir_file_exists_p ("", name); +#endif /* AMIGA */ +#endif /* VMS */ + + slash = dirend; + if (dirend == name) + dirname = "/"; + else + { + char *p; +#ifdef HAVE_DOS_PATHS + /* d:/ and d: are *very* different... */ + if (dirend < name + 3 && name[1] == ':' && + (*dirend == '/' || *dirend == '\\' || *dirend == ':')) + dirend++; +#endif + p = alloca (dirend - name + 1); + memcpy (p, name, dirend - name); + p[dirend - name] = '\0'; + dirname = p; + } + return dir_file_exists_p (dirname, slash + 1); +} + +/* Mark FILENAME as `impossible' for `file_impossible_p'. + This means an attempt has been made to search for FILENAME + as an intermediate file, and it has failed. */ + +void +file_impossible (const char *filename) +{ + const char *dirend; + const char *p = filename; + struct directory *dir; + struct dirfile *new; + +#ifdef VMS + dirend = strrchr (p, ']'); + if (dirend == 0) + dirend = strrchr (p, ':'); + dirend++; + if (dirend == (char *)1) + dir = find_directory ("[]"); +#else + dirend = strrchr (p, '/'); +# ifdef HAVE_DOS_PATHS + /* Forward and backslashes might be mixed. We need the rightmost one. */ + { + const char *bslash = strrchr(p, '\\'); + if (!dirend || bslash > dirend) + dirend = bslash; + /* The case of "d:file". */ + if (!dirend && p[0] && p[1] == ':') + dirend = p + 1; + } +# endif /* HAVE_DOS_PATHS */ + if (dirend == 0) +# ifdef _AMIGA + dir = find_directory (""); +# else /* !VMS && !AMIGA */ + dir = find_directory ("."); +# endif /* AMIGA */ +#endif /* VMS */ + else + { + const char *dirname; + const char *slash = dirend; + if (dirend == p) + dirname = "/"; + else + { + char *cp; +#ifdef HAVE_DOS_PATHS + /* d:/ and d: are *very* different... */ + if (dirend < p + 3 && p[1] == ':' && + (*dirend == '/' || *dirend == '\\' || *dirend == ':')) + dirend++; +#endif + cp = alloca (dirend - p + 1); + memcpy (cp, p, dirend - p); + cp[dirend - p] = '\0'; + dirname = cp; + } + dir = find_directory (dirname); + filename = p = slash + 1; + } + + if (dir->contents == 0) + /* The directory could not be stat'd. We allocate a contents + structure for it, but leave it out of the contents hash table. */ + dir->contents = xcalloc (sizeof (struct directory_contents)); + + if (dir->contents->dirfiles.ht_vec == 0) + { + hash_init (&dir->contents->dirfiles, DIRFILE_BUCKETS, + dirfile_hash_1, dirfile_hash_2, dirfile_hash_cmp); + } + + /* Make a new entry and put it in the table. */ + + new = xmalloc (sizeof (struct dirfile)); + new->length = strlen (filename); +#if defined(HAVE_CASE_INSENSITIVE_FS) && defined(VMS) + new->name = strcache_add_len (downcase(filename), new->length); +#else + new->name = strcache_add_len (filename, new->length); +#endif + new->impossible = 1; + hash_insert (&dir->contents->dirfiles, new); +} + +/* Return nonzero if FILENAME has been marked impossible. */ + +int +file_impossible_p (const char *filename) +{ + const char *dirend; + const char *p = filename; + struct directory_contents *dir; + struct dirfile *dirfile; + struct dirfile dirfile_key; + +#ifdef VMS + dirend = strrchr (filename, ']'); + if (dirend == 0) + dir = find_directory ("[]")->contents; +#else + dirend = strrchr (filename, '/'); +#ifdef HAVE_DOS_PATHS + /* Forward and backslashes might be mixed. We need the rightmost one. */ + { + const char *bslash = strrchr(filename, '\\'); + if (!dirend || bslash > dirend) + dirend = bslash; + /* The case of "d:file". */ + if (!dirend && filename[0] && filename[1] == ':') + dirend = filename + 1; + } +#endif /* HAVE_DOS_PATHS */ + if (dirend == 0) +#ifdef _AMIGA + dir = find_directory ("")->contents; +#else /* !VMS && !AMIGA */ + dir = find_directory (".")->contents; +#endif /* AMIGA */ +#endif /* VMS */ + else + { + const char *dirname; + const char *slash = dirend; + if (dirend == filename) + dirname = "/"; + else + { + char *cp; +#ifdef HAVE_DOS_PATHS + /* d:/ and d: are *very* different... */ + if (dirend < filename + 3 && filename[1] == ':' && + (*dirend == '/' || *dirend == '\\' || *dirend == ':')) + dirend++; +#endif + cp = alloca (dirend - filename + 1); + memcpy (cp, p, dirend - p); + cp[dirend - p] = '\0'; + dirname = cp; + } + dir = find_directory (dirname)->contents; + p = filename = slash + 1; + } + + if (dir == 0 || dir->dirfiles.ht_vec == 0) + /* There are no files entered for this directory. */ + return 0; + +#ifdef __MSDOS__ + filename = dosify (p); +#endif +#ifdef HAVE_CASE_INSENSITIVE_FS + filename = downcase (p); +#endif +#ifdef VMS + filename = vmsify (p, 1); +#endif + + dirfile_key.name = filename; + dirfile_key.length = strlen (filename); + dirfile = hash_find_item (&dir->dirfiles, &dirfile_key); + if (dirfile) + return dirfile->impossible; + + return 0; +} + +/* Return the already allocated name in the + directory hash table that matches DIR. */ + +const char * +dir_name (const char *dir) +{ + return find_directory (dir)->name; +} + +/* Print the data base of directories. */ + +void +print_dir_data_base (void) +{ + unsigned int files; + unsigned int impossible; + struct directory **dir_slot; + struct directory **dir_end; + + puts (_("\n# Directories\n")); + + files = impossible = 0; + + dir_slot = (struct directory **) directories.ht_vec; + dir_end = dir_slot + directories.ht_size; + for ( ; dir_slot < dir_end; dir_slot++) + { + struct directory *dir = *dir_slot; + if (! HASH_VACANT (dir)) + { + if (dir->contents == 0) + printf (_("# %s: could not be stat'd.\n"), dir->name); + else if (dir->contents->dirfiles.ht_vec == 0) + { +#ifdef WINDOWS32 + printf (_("# %s (key %s, mtime %d): could not be opened.\n"), + dir->name, dir->contents->path_key,dir->contents->mtime); +#else /* WINDOWS32 */ +#ifdef VMS + printf (_("# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"), + dir->name, dir->contents->dev, + dir->contents->ino[0], dir->contents->ino[1], + dir->contents->ino[2]); +#else + printf (_("# %s (device %ld, inode %ld): could not be opened.\n"), + dir->name, (long int) dir->contents->dev, + (long int) dir->contents->ino); +#endif +#endif /* WINDOWS32 */ + } + else + { + unsigned int f = 0; + unsigned int im = 0; + struct dirfile **files_slot; + struct dirfile **files_end; + + files_slot = (struct dirfile **) dir->contents->dirfiles.ht_vec; + files_end = files_slot + dir->contents->dirfiles.ht_size; + for ( ; files_slot < files_end; files_slot++) + { + struct dirfile *df = *files_slot; + if (! HASH_VACANT (df)) + { + if (df->impossible) + ++im; + else + ++f; + } + } +#ifdef WINDOWS32 + printf (_("# %s (key %s, mtime %d): "), + dir->name, dir->contents->path_key, dir->contents->mtime); +#else /* WINDOWS32 */ +#ifdef VMS + printf (_("# %s (device %d, inode [%d,%d,%d]): "), + dir->name, dir->contents->dev, + dir->contents->ino[0], dir->contents->ino[1], + dir->contents->ino[2]); +#else + printf (_("# %s (device %ld, inode %ld): "), + dir->name, + (long)dir->contents->dev, (long)dir->contents->ino); +#endif +#endif /* WINDOWS32 */ + if (f == 0) + fputs (_("No"), stdout); + else + printf ("%u", f); + fputs (_(" files, "), stdout); + if (im == 0) + fputs (_("no"), stdout); + else + printf ("%u", im); + fputs (_(" impossibilities"), stdout); + if (dir->contents->dirstream == 0) + puts ("."); + else + puts (_(" so far.")); + files += f; + impossible += im; + } + } + } + + fputs ("\n# ", stdout); + if (files == 0) + fputs (_("No"), stdout); + else + printf ("%u", files); + fputs (_(" files, "), stdout); + if (impossible == 0) + fputs (_("no"), stdout); + else + printf ("%u", impossible); + printf (_(" impossibilities in %lu directories.\n"), directories.ht_fill); +} + +/* Hooks for globbing. */ + +#include + +/* Structure describing state of iterating through a directory hash table. */ + +struct dirstream + { + struct directory_contents *contents; /* The directory being read. */ + struct dirfile **dirfile_slot; /* Current slot in table. */ + }; + +/* Forward declarations. */ +static __ptr_t open_dirstream (const char *); +static struct dirent *read_dirstream (__ptr_t); + +static __ptr_t +open_dirstream (const char *directory) +{ + struct dirstream *new; + struct directory *dir = find_directory (directory); + + if (dir->contents == 0 || dir->contents->dirfiles.ht_vec == 0) + /* DIR->contents is nil if the directory could not be stat'd. + DIR->contents->dirfiles is nil if it could not be opened. */ + return 0; + + /* Read all the contents of the directory now. There is no benefit + in being lazy, since glob will want to see every file anyway. */ + + dir_contents_file_exists_p (dir->contents, 0); + + new = xmalloc (sizeof (struct dirstream)); + new->contents = dir->contents; + new->dirfile_slot = (struct dirfile **) new->contents->dirfiles.ht_vec; + + return (__ptr_t) new; +} + +static struct dirent * +read_dirstream (__ptr_t stream) +{ + static char *buf; + static unsigned int bufsz; + + struct dirstream *const ds = (struct dirstream *) stream; + struct directory_contents *dc = ds->contents; + struct dirfile **dirfile_end = (struct dirfile **) dc->dirfiles.ht_vec + dc->dirfiles.ht_size; + + while (ds->dirfile_slot < dirfile_end) + { + struct dirfile *df = *ds->dirfile_slot++; + if (! HASH_VACANT (df) && !df->impossible) + { + /* The glob interface wants a `struct dirent', so mock one up. */ + struct dirent *d; + unsigned int len = df->length + 1; + unsigned int sz = sizeof (*d) - sizeof (d->d_name) + len; + if (sz > bufsz) + { + bufsz *= 2; + if (sz > bufsz) + bufsz = sz; + buf = xrealloc (buf, bufsz); + } + d = (struct dirent *) buf; +#ifdef __MINGW32__ +# if __MINGW32_MAJOR_VERSION < 3 || (__MINGW32_MAJOR_VERSION == 3 && \ + __MINGW32_MINOR_VERSION == 0) + d->d_name = xmalloc(len); +# endif +#endif + FAKE_DIR_ENTRY (d); +#ifdef _DIRENT_HAVE_D_NAMLEN + d->d_namlen = len - 1; +#endif +#ifdef _DIRENT_HAVE_D_TYPE + d->d_type = DT_UNKNOWN; +#endif + memcpy (d->d_name, df->name, len); + return d; + } + } + + return 0; +} + +static void +ansi_free (void *p) +{ + if (p) + free(p); +} + +/* On 64 bit ReliantUNIX (5.44 and above) in LFS mode, stat() is actually a + * macro for stat64(). If stat is a macro, make a local wrapper function to + * invoke it. + */ +#ifndef stat +# ifndef VMS +int stat (const char *path, struct stat *sbuf); +# endif +# define local_stat stat +#else +static int +local_stat (const char *path, struct stat *buf) +{ + int e; + + EINTRLOOP (e, stat (path, buf)); + return e; +} +#endif + +void +dir_setup_glob (glob_t *gl) +{ + gl->gl_opendir = open_dirstream; + gl->gl_readdir = read_dirstream; + gl->gl_closedir = ansi_free; + gl->gl_stat = local_stat; + /* We don't bother setting gl_lstat, since glob never calls it. + The slot is only there for compatibility with 4.4 BSD. */ +} + +void +hash_init_directories (void) +{ + hash_init (&directories, DIRECTORY_BUCKETS, + directory_hash_1, directory_hash_2, directory_hash_cmp); + hash_init (&directory_contents, DIRECTORY_BUCKETS, + directory_contents_hash_1, directory_contents_hash_2, + directory_contents_hash_cmp); +} diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..67eec3a --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,36 @@ +# -*-Makefile-*-, or close enough +# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +# 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +TEXI2HTML = texi2html +TEXI2HTML_FLAGS = -split_chapter + +info_TEXINFOS = make.texi +make_TEXINFOS = fdl.texi make-stds.texi + +CLEANFILES = make*.html + +## ----------------------------- ## +## Other documentation formats. ## +## ----------------------------- ## + +html: make_1.html + +make_1.html: $(info_TEXINFOS) $(make_TEXINFOS) + $(TEXI2HTML) $(TEXI2HTML_FLAGS) $(srcdir)/make.texi + +.PHONY: html diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..a1089bc --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,673 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# -*-Makefile-*-, or close enough +# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +# 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc +DIST_COMMON = $(make_TEXINFOS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/stamp-vti \ + $(srcdir)/version.texi +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/isc-posix.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +INFO_DEPS = $(srcdir)/make.info +TEXINFO_TEX = $(top_srcdir)/config/texinfo.tex +am__TEXINFO_TEX_DIR = $(top_srcdir)/config +DVIS = make.dvi +PDFS = make.pdf +PSS = make.ps +HTMLS = make.html +TEXINFOS = make.texi +TEXI2DVI = texi2dvi +TEXI2PDF = $(TEXI2DVI) --pdf --batch +MAKEINFOHTML = $(MAKEINFO) --html +AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) +DVIPS = dvips +am__installdirs = "$(DESTDIR)$(infodir)" +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +TEXI2HTML = texi2html +TEXI2HTML_FLAGS = -split_chapter +info_TEXINFOS = make.texi +make_TEXINFOS = fdl.texi make-stds.texi +CLEANFILES = make*.html +all: all-am + +.SUFFIXES: +.SUFFIXES: .dvi .html .info .pdf .ps .texi +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +.texi.info: + restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && $(am__cd) $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $@ $<; \ + then \ + rc=0; \ + $(am__cd) $(srcdir); \ + else \ + rc=$$?; \ + $(am__cd) $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + +.texi.dvi: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) $< + +.texi.pdf: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2PDF) $< + +.texi.html: + rm -rf $(@:.html=.htp) + if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $(@:.html=.htp) $<; \ + then \ + rm -rf $@; \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ + else \ + if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ + rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ + exit 1; \ + fi +$(srcdir)/make.info: make.texi $(srcdir)/version.texi $(make_TEXINFOS) +make.dvi: make.texi $(srcdir)/version.texi $(make_TEXINFOS) +make.pdf: make.texi $(srcdir)/version.texi $(make_TEXINFOS) +make.html: make.texi $(srcdir)/version.texi $(make_TEXINFOS) +$(srcdir)/version.texi: $(srcdir)/stamp-vti +$(srcdir)/stamp-vti: make.texi $(top_srcdir)/configure + @(dir=.; test -f ./make.texi || dir=$(srcdir); \ + set `$(SHELL) $(top_srcdir)/config/mdate-sh $$dir/make.texi`; \ + echo "@set UPDATED $$1 $$2 $$3"; \ + echo "@set UPDATED-MONTH $$2 $$3"; \ + echo "@set EDITION $(VERSION)"; \ + echo "@set VERSION $(VERSION)") > vti.tmp + @cmp -s vti.tmp $(srcdir)/version.texi \ + || (echo "Updating $(srcdir)/version.texi"; \ + cp vti.tmp $(srcdir)/version.texi) + -@rm -f vti.tmp + @cp $(srcdir)/version.texi $@ + +mostlyclean-vti: + -rm -f vti.tmp + +maintainer-clean-vti: + -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi +.dvi.ps: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) -o $@ $< + +uninstall-dvi-am: + @$(NORMAL_UNINSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ + rm -f "$(DESTDIR)$(dvidir)/$$f"; \ + done + +uninstall-html-am: + @$(NORMAL_UNINSTALL) + @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ + done + +uninstall-info-am: + @$(PRE_UNINSTALL) + @if test -d '$(DESTDIR)$(infodir)' && \ + (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ + (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ + echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ + rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ + else :; fi); \ + done + +uninstall-pdf-am: + @$(NORMAL_UNINSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ + done + +uninstall-ps-am: + @$(NORMAL_UNINSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ + rm -f "$(DESTDIR)$(psdir)/$$f"; \ + done + +dist-info: $(INFO_DEPS) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + case $$base in \ + $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ + for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ + if test -f $$file; then \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f "$(distdir)/$$relfile" || \ + cp -p $$file "$(distdir)/$$relfile"; \ + else :; fi; \ + done; \ + done + +mostlyclean-aminfo: + -rm -rf make.aux make.cp make.cps make.fn make.fns make.ky make.kys \ + make.log make.pg make.tmp make.toc make.tp make.tps make.vr + +clean-aminfo: + -test -z "make.dvi make.pdf make.ps make.html" \ + || rm -rf make.dvi make.pdf make.ps make.html + +maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-info +check-am: all-am +check: check-am +all-am: Makefile $(INFO_DEPS) +installdirs: + for dir in "$(DESTDIR)$(infodir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-aminfo clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: $(DVIS) + +html-am: $(HTMLS) + +info: info-am + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am + +install-dvi: install-dvi-am + +install-dvi-am: $(DVIS) + @$(NORMAL_INSTALL) + test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)" + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ + done +install-exec-am: + +install-html: install-html-am + +install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) + test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" + @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__strip_dir) \ + if test -d "$$d$$p"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ + echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + else \ + list2="$$list2 $$d$$p"; \ + fi; \ + done; \ + test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done; } +install-info: install-info-am + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ + if test -f $$ifile; then \ + echo "$$ifile"; \ + else : ; fi; \ + done; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done + @$(POST_INSTALL) + @if (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: $(PDFS) + @$(NORMAL_INSTALL) + test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)" + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done +install-ps: install-ps-am + +install-ps-am: $(PSS) + @$(NORMAL_INSTALL) + test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)" + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti + +pdf: pdf-am + +pdf-am: $(PDFS) + +ps: ps-am + +ps-am: $(PSS) + +uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-pdf-am uninstall-ps-am + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-aminfo clean-generic \ + dist-info distclean distclean-generic distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-aminfo maintainer-clean-generic \ + maintainer-clean-vti mostlyclean mostlyclean-aminfo \ + mostlyclean-generic mostlyclean-vti pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-dvi-am uninstall-html-am \ + uninstall-info-am uninstall-pdf-am uninstall-ps-am + + +html: make_1.html + +make_1.html: $(info_TEXINFOS) $(make_TEXINFOS) + $(TEXI2HTML) $(TEXI2HTML_FLAGS) $(srcdir)/make.texi + +.PHONY: html + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/fdl.texi b/doc/fdl.texi new file mode 100644 index 0000000..fc19ddd --- /dev/null +++ b/doc/fdl.texi @@ -0,0 +1,506 @@ +@c The GNU Free Documentation License. +@center Version 1.3, 3 November 2008 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +@uref{http://fsf.org/} + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document @dfn{free} in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document'', below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you''. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, La@TeX{} input +format, SGML or XML using a publicly available +DTD, and standard-conforming simple HTML, +PostScript or PDF designed for human modification. Examples +of transparent image formats include PNG, XCF and +JPG. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, SGML or +XML for which the DTD and/or processing tools are +not generally available, and the machine-generated HTML, +PostScript or PDF produced by some word processors for +output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The ``publisher'' means any person or entity that distributes copies +of the Document to the public. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements'', +``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section Entitled ``History'', Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section Entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section to be Entitled ``Endorsements'' or +to conflict in title with any Invariant Section. + +@item +Preserve any Warranty Disclaimers. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements'', +and any sections Entitled ``Dedications''. You must delete all +sections Entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements'', +``Dedications'', or ``History'', the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +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, receipt of a copy of some or all of the same material does +not give you any rights to use it. + +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation 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. See +@uref{http://www.gnu.org/copyleft/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +@item +RELICENSING + +``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the +site means any set of copyrightable works thus published on the MMC +site. + +``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +``Incorporate'' means to publish or republish a Document, in whole or +in part, as part of another Document. + +An MMC is ``eligible for relicensing'' if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + +@end enumerate + +@page +@heading ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with@dots{}Texts.'' line with this: + +@smallexample +@group + with the Invariant Sections being @var{list their titles}, with + the Front-Cover Texts being @var{list}, and with the Back-Cover Texts + being @var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: + diff --git a/doc/make-stds.texi b/doc/make-stds.texi new file mode 100644 index 0000000..7cc9537 --- /dev/null +++ b/doc/make-stds.texi @@ -0,0 +1,1157 @@ +@comment This file is included by both standards.texi and make.texinfo. +@comment It was broken out of standards.texi on 1/6/93 by roland. + +@node Makefile Conventions +@chapter Makefile Conventions +@cindex makefile, conventions for +@cindex conventions for makefiles +@cindex standards for makefiles + +@c Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, +@c 2004, 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc. +@c +@c Permission is granted to copy, distribute and/or modify this document +@c under the terms of the GNU Free Documentation License, Version 1.3 +@c or any later version published by the Free Software Foundation; +@c with no Invariant Sections, with no +@c Front-Cover Texts, and with no Back-Cover Texts. +@c A copy of the license is included in the section entitled ``GNU +@c Free Documentation License''. + +This +@ifinfo +node +@end ifinfo +@iftex +@ifset CODESTD +section +@end ifset +@ifclear CODESTD +chapter +@end ifclear +@end iftex +describes conventions for writing the Makefiles for GNU programs. +Using Automake will help you write a Makefile that follows these +conventions. For more information on portable Makefiles, see +@sc{posix} and @ref{Portable Make, Portable Make Programming,, autoconf, +Autoconf}. + + +@menu +* Makefile Basics:: General conventions for Makefiles. +* Utilities in Makefiles:: Utilities to be used in Makefiles. +* Command Variables:: Variables for specifying commands. +* DESTDIR:: Supporting staged installs. +* Directory Variables:: Variables for installation directories. +* Standard Targets:: Standard targets for users. +* Install Command Categories:: Three categories of commands in the `install' + rule: normal, pre-install and post-install. +@end menu + +@node Makefile Basics +@section General Conventions for Makefiles + +Every Makefile should contain this line: + +@example +SHELL = /bin/sh +@end example + +@noindent +to avoid trouble on systems where the @code{SHELL} variable might be +inherited from the environment. (This is never a problem with GNU +@code{make}.) + +Different @code{make} programs have incompatible suffix lists and +implicit rules, and this sometimes creates confusion or misbehavior. So +it is a good idea to set the suffix list explicitly using only the +suffixes you need in the particular Makefile, like this: + +@example +.SUFFIXES: +.SUFFIXES: .c .o +@end example + +@noindent +The first line clears out the suffix list, the second introduces all +suffixes which may be subject to implicit rules in this Makefile. + +Don't assume that @file{.} is in the path for command execution. When +you need to run programs that are a part of your package during the +make, please make sure that it uses @file{./} if the program is built as +part of the make or @file{$(srcdir)/} if the file is an unchanging part +of the source code. Without one of these prefixes, the current search +path is used. + +The distinction between @file{./} (the @dfn{build directory}) and +@file{$(srcdir)/} (the @dfn{source directory}) is important because +users can build in a separate directory using the @samp{--srcdir} option +to @file{configure}. A rule of the form: + +@smallexample +foo.1 : foo.man sedscript + sed -f sedscript foo.man > foo.1 +@end smallexample + +@noindent +will fail when the build directory is not the source directory, because +@file{foo.man} and @file{sedscript} are in the source directory. + +When using GNU @code{make}, relying on @samp{VPATH} to find the source +file will work in the case where there is a single dependency file, +since the @code{make} automatic variable @samp{$<} will represent the +source file wherever it is. (Many versions of @code{make} set @samp{$<} +only in implicit rules.) A Makefile target like + +@smallexample +foo.o : bar.c + $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o +@end smallexample + +@noindent +should instead be written as + +@smallexample +foo.o : bar.c + $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@@ +@end smallexample + +@noindent +in order to allow @samp{VPATH} to work correctly. When the target has +multiple dependencies, using an explicit @samp{$(srcdir)} is the easiest +way to make the rule work well. For example, the target above for +@file{foo.1} is best written as: + +@smallexample +foo.1 : foo.man sedscript + sed -f $(srcdir)/sedscript $(srcdir)/foo.man > $@@ +@end smallexample + +GNU distributions usually contain some files which are not source +files---for example, Info files, and the output from Autoconf, Automake, +Bison or Flex. Since these files normally appear in the source +directory, they should always appear in the source directory, not in the +build directory. So Makefile rules to update them should put the +updated files in the source directory. + +However, if a file does not appear in the distribution, then the +Makefile should not put it in the source directory, because building a +program in ordinary circumstances should not modify the source directory +in any way. + +Try to make the build and installation targets, at least (and all their +subtargets) work correctly with a parallel @code{make}. + +@node Utilities in Makefiles +@section Utilities in Makefiles + +Write the Makefile commands (and any shell scripts, such as +@code{configure}) to run under @code{sh} (both the traditional Bourne +shell and the @sc{posix} shell), not @code{csh}. Don't use any +special features of @code{ksh} or @code{bash}, or @sc{posix} features +not widely supported in traditional Bourne @code{sh}. + +The @code{configure} script and the Makefile rules for building and +installation should not use any utilities directly except these: + +@c dd find +@c gunzip gzip md5sum +@c mkfifo mknod tee uname + +@example +awk cat cmp cp diff echo egrep expr false grep install-info ln ls +mkdir mv printf pwd rm rmdir sed sleep sort tar test touch tr true +@end example + +Compression programs such as @code{gzip} can be used in the +@code{dist} rule. + +Generally, stick to the widely-supported (usually +@sc{posix}-specified) options and features of these programs. For +example, don't use @samp{mkdir -p}, convenient as it may be, because a +few systems don't support it at all and with others, it is not safe +for parallel execution. For a list of known incompatibilities, see +@ref{Portable Shell, Portable Shell Programming,, autoconf, Autoconf}. + + +It is a good idea to avoid creating symbolic links in makefiles, since a +few file systems don't support them. + +The Makefile rules for building and installation can also use compilers +and related programs, but should do so via @code{make} variables so that the +user can substitute alternatives. Here are some of the programs we +mean: + +@example +ar bison cc flex install ld ldconfig lex +make makeinfo ranlib texi2dvi yacc +@end example + +Use the following @code{make} variables to run those programs: + +@example +$(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX) +$(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC) +@end example + +When you use @code{ranlib} or @code{ldconfig}, you should make sure +nothing bad happens if the system does not have the program in question. +Arrange to ignore an error from that command, and print a message before +the command to tell the user that failure of this command does not mean +a problem. (The Autoconf @samp{AC_PROG_RANLIB} macro can help with +this.) + +If you use symbolic links, you should implement a fallback for systems +that don't have symbolic links. + +Additional utilities that can be used via Make variables are: + +@example +chgrp chmod chown mknod +@end example + +It is ok to use other utilities in Makefile portions (or scripts) +intended only for particular systems where you know those utilities +exist. + +@node Command Variables +@section Variables for Specifying Commands + +Makefiles should provide variables for overriding certain commands, options, +and so on. + +In particular, you should run most utility programs via variables. +Thus, if you use Bison, have a variable named @code{BISON} whose default +value is set with @samp{BISON = bison}, and refer to it with +@code{$(BISON)} whenever you need to use Bison. + +File management utilities such as @code{ln}, @code{rm}, @code{mv}, and +so on, need not be referred to through variables in this way, since users +don't need to replace them with other programs. + +Each program-name variable should come with an options variable that is +used to supply options to the program. Append @samp{FLAGS} to the +program-name variable name to get the options variable name---for +example, @code{BISONFLAGS}. (The names @code{CFLAGS} for the C +compiler, @code{YFLAGS} for yacc, and @code{LFLAGS} for lex, are +exceptions to this rule, but we keep them because they are standard.) +Use @code{CPPFLAGS} in any compilation command that runs the +preprocessor, and use @code{LDFLAGS} in any compilation command that +does linking as well as in any direct use of @code{ld}. + +If there are C compiler options that @emph{must} be used for proper +compilation of certain files, do not include them in @code{CFLAGS}. +Users expect to be able to specify @code{CFLAGS} freely themselves. +Instead, arrange to pass the necessary options to the C compiler +independently of @code{CFLAGS}, by writing them explicitly in the +compilation commands or by defining an implicit rule, like this: + +@smallexample +CFLAGS = -g +ALL_CFLAGS = -I. $(CFLAGS) +.c.o: + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< +@end smallexample + +Do include the @samp{-g} option in @code{CFLAGS}, because that is not +@emph{required} for proper compilation. You can consider it a default +that is only recommended. If the package is set up so that it is +compiled with GCC by default, then you might as well include @samp{-O} +in the default value of @code{CFLAGS} as well. + +Put @code{CFLAGS} last in the compilation command, after other variables +containing compiler options, so the user can use @code{CFLAGS} to +override the others. + +@code{CFLAGS} should be used in every invocation of the C compiler, +both those which do compilation and those which do linking. + +Every Makefile should define the variable @code{INSTALL}, which is the +basic command for installing a file into the system. + +Every Makefile should also define the variables @code{INSTALL_PROGRAM} +and @code{INSTALL_DATA}. (The default for @code{INSTALL_PROGRAM} should +be @code{$(INSTALL)}; the default for @code{INSTALL_DATA} should be +@code{$@{INSTALL@} -m 644}.) Then it should use those variables as the +commands for actual installation, for executables and non-executables +respectively. Minimal use of these variables is as follows: + +@example +$(INSTALL_PROGRAM) foo $(bindir)/foo +$(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a +@end example + +However, it is preferable to support a @code{DESTDIR} prefix on the +target files, as explained in the next section. + +It is acceptable, but not required, to install multiple files in one +command, with the final argument being a directory, as in: + +@example +$(INSTALL_PROGRAM) foo bar baz $(bindir) +@end example + + +@node DESTDIR +@section @code{DESTDIR}: Support for Staged Installs + +@vindex DESTDIR +@cindex staged installs +@cindex installations, staged + +@code{DESTDIR} is a variable prepended to each installed target file, +like this: + +@example +$(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo +$(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a +@end example + +The @code{DESTDIR} variable is specified by the user on the @code{make} +command line as an absolute file name. For example: + +@example +make DESTDIR=/tmp/stage install +@end example + +@noindent +@code{DESTDIR} should be supported only in the @code{install*} and +@code{uninstall*} targets, as those are the only targets where it is +useful. + +If your installation step would normally install +@file{/usr/local/bin/foo} and @file{/usr/@/local/@/lib/@/libfoo.a}, then an +installation invoked as in the example above would install +@file{/tmp/stage/usr/local/bin/foo} and +@file{/tmp/stage/usr/local/lib/libfoo.a} instead. + +Prepending the variable @code{DESTDIR} to each target in this way +provides for @dfn{staged installs}, where the installed files are not +placed directly into their expected location but are instead copied +into a temporary location (@code{DESTDIR}). However, installed files +maintain their relative directory structure and any embedded file names +will not be modified. + +You should not set the value of @code{DESTDIR} in your @file{Makefile} +at all; then the files are installed into their expected locations by +default. Also, specifying @code{DESTDIR} should not change the +operation of the software in any way, so its value should not be +included in any file contents. + +@code{DESTDIR} support is commonly used in package creation. It is +also helpful to users who want to understand what a given package will +install where, and to allow users who don't normally have permissions +to install into protected areas to build and install before gaining +those permissions. Finally, it can be useful with tools such as +@code{stow}, where code is installed in one place but made to appear +to be installed somewhere else using symbolic links or special mount +operations. So, we strongly recommend GNU packages support +@code{DESTDIR}, though it is not an absolute requirement. + + +@node Directory Variables +@section Variables for Installation Directories + +Installation directories should always be named by variables, so it is +easy to install in a nonstandard place. The standard names for these +variables and the values they should have in GNU packages are +described below. They are based on a standard file system layout; +variants of it are used in GNU/Linux and other modern operating +systems. + +Installers are expected to override these values when calling +@command{make} (e.g., @kbd{make prefix=/usr install} or +@command{configure} (e.g., @kbd{configure --prefix=/usr}). GNU +packages should not try to guess which value should be appropriate for +these variables on the system they are being installed onto: use the +default settings specified here so that all GNU packages behave +identically, allowing the installer to achieve any desired layout. + +@cindex directories, creating installation +@cindex installation directories, creating +All installation directories, and their parent directories, should be +created (if necessary) before they are installed into. + +These first two variables set the root for the installation. All the +other installation directories should be subdirectories of one of +these two, and nothing should be directly installed into these two +directories. + +@table @code +@item prefix +@vindex prefix +A prefix used in constructing the default values of the variables listed +below. The default value of @code{prefix} should be @file{/usr/local}. +When building the complete GNU system, the prefix will be empty and +@file{/usr} will be a symbolic link to @file{/}. +(If you are using Autoconf, write it as @samp{@@prefix@@}.) + +Running @samp{make install} with a different value of @code{prefix} from +the one used to build the program should @emph{not} recompile the +program. + +@item exec_prefix +@vindex exec_prefix +A prefix used in constructing the default values of some of the +variables listed below. The default value of @code{exec_prefix} should +be @code{$(prefix)}. +(If you are using Autoconf, write it as @samp{@@exec_prefix@@}.) + +Generally, @code{$(exec_prefix)} is used for directories that contain +machine-specific files (such as executables and subroutine libraries), +while @code{$(prefix)} is used directly for other directories. + +Running @samp{make install} with a different value of @code{exec_prefix} +from the one used to build the program should @emph{not} recompile the +program. +@end table + +Executable programs are installed in one of the following directories. + +@table @code +@item bindir +@vindex bindir +The directory for installing executable programs that users can run. +This should normally be @file{/usr/local/bin}, but write it as +@file{$(exec_prefix)/bin}. +(If you are using Autoconf, write it as @samp{@@bindir@@}.) + +@item sbindir +@vindex sbindir +The directory for installing executable programs that can be run from +the shell, but are only generally useful to system administrators. This +should normally be @file{/usr/local/sbin}, but write it as +@file{$(exec_prefix)/sbin}. +(If you are using Autoconf, write it as @samp{@@sbindir@@}.) + +@item libexecdir +@vindex libexecdir +@comment This paragraph adjusted to avoid overfull hbox --roland 5jul94 +The directory for installing executable programs to be run by other +programs rather than by users. This directory should normally be +@file{/usr/local/libexec}, but write it as @file{$(exec_prefix)/libexec}. +(If you are using Autoconf, write it as @samp{@@libexecdir@@}.) + +The definition of @samp{libexecdir} is the same for all packages, so +you should install your data in a subdirectory thereof. Most packages +install their data under @file{$(libexecdir)/@var{package-name}/}, +possibly within additional subdirectories thereof, such as +@file{$(libexecdir)/@var{package-name}/@var{machine}/@var{version}}. +@end table + +Data files used by the program during its execution are divided into +categories in two ways. + +@itemize @bullet +@item +Some files are normally modified by programs; others are never normally +modified (though users may edit some of these). + +@item +Some files are architecture-independent and can be shared by all +machines at a site; some are architecture-dependent and can be shared +only by machines of the same kind and operating system; others may never +be shared between two machines. +@end itemize + +This makes for six different possibilities. However, we want to +discourage the use of architecture-dependent files, aside from object +files and libraries. It is much cleaner to make other data files +architecture-independent, and it is generally not hard. + +Here are the variables Makefiles should use to specify directories +to put these various kinds of files in: + +@table @samp +@item datarootdir +The root of the directory tree for read-only architecture-independent +data files. This should normally be @file{/usr/local/share}, but +write it as @file{$(prefix)/share}. (If you are using Autoconf, write +it as @samp{@@datarootdir@@}.) @samp{datadir}'s default value is +based on this variable; so are @samp{infodir}, @samp{mandir}, and +others. + +@item datadir +The directory for installing idiosyncratic read-only +architecture-independent data files for this program. This is usually +the same place as @samp{datarootdir}, but we use the two separate +variables so that you can move these program-specific files without +altering the location for Info files, man pages, etc. + +@c raggedright (not until next Texinfo release) +This should normally be @file{/usr/local/share}, but write it as +@file{$(datarootdir)}. (If you are using Autoconf, write it as +@samp{@@datadir@@}.) +@c end raggedright + +The definition of @samp{datadir} is the same for all packages, so you +should install your data in a subdirectory thereof. Most packages +install their data under @file{$(datadir)/@var{package-name}/}. + +@item sysconfdir +The directory for installing read-only data files that pertain to a +single machine--that is to say, files for configuring a host. Mailer +and network configuration files, @file{/etc/passwd}, and so forth belong +here. All the files in this directory should be ordinary ASCII text +files. This directory should normally be @file{/usr/local/etc}, but +write it as @file{$(prefix)/etc}. +(If you are using Autoconf, write it as @samp{@@sysconfdir@@}.) + +Do not install executables here in this directory (they probably belong +in @file{$(libexecdir)} or @file{$(sbindir)}). Also do not install +files that are modified in the normal course of their use (programs +whose purpose is to change the configuration of the system excluded). +Those probably belong in @file{$(localstatedir)}. + +@item sharedstatedir +The directory for installing architecture-independent data files which +the programs modify while they run. This should normally be +@file{/usr/local/com}, but write it as @file{$(prefix)/com}. +(If you are using Autoconf, write it as @samp{@@sharedstatedir@@}.) + +@item localstatedir +The directory for installing data files which the programs modify while +they run, and that pertain to one specific machine. Users should never +need to modify files in this directory to configure the package's +operation; put such configuration information in separate files that go +in @file{$(datadir)} or @file{$(sysconfdir)}. @file{$(localstatedir)} +should normally be @file{/usr/local/var}, but write it as +@file{$(prefix)/var}. +(If you are using Autoconf, write it as @samp{@@localstatedir@@}.) +@end table + +These variables specify the directory for installing certain specific +types of files, if your program has them. Every GNU package should +have Info files, so every program needs @samp{infodir}, but not all +need @samp{libdir} or @samp{lispdir}. + +@table @samp +@item includedir +The directory for installing header files to be included by user +programs with the C @samp{#include} preprocessor directive. This +should normally be @file{/usr/local/include}, but write it as +@file{$(prefix)/include}. +(If you are using Autoconf, write it as @samp{@@includedir@@}.) + +Most compilers other than GCC do not look for header files in directory +@file{/usr/local/include}. So installing the header files this way is +only useful with GCC. Sometimes this is not a problem because some +libraries are only really intended to work with GCC. But some libraries +are intended to work with other compilers. They should install their +header files in two places, one specified by @code{includedir} and one +specified by @code{oldincludedir}. + +@item oldincludedir +The directory for installing @samp{#include} header files for use with +compilers other than GCC. This should normally be @file{/usr/include}. +(If you are using Autoconf, you can write it as @samp{@@oldincludedir@@}.) + +The Makefile commands should check whether the value of +@code{oldincludedir} is empty. If it is, they should not try to use +it; they should cancel the second installation of the header files. + +A package should not replace an existing header in this directory unless +the header came from the same package. Thus, if your Foo package +provides a header file @file{foo.h}, then it should install the header +file in the @code{oldincludedir} directory if either (1) there is no +@file{foo.h} there or (2) the @file{foo.h} that exists came from the Foo +package. + +To tell whether @file{foo.h} came from the Foo package, put a magic +string in the file---part of a comment---and @code{grep} for that string. + +@item docdir +The directory for installing documentation files (other than Info) for +this package. By default, it should be +@file{/usr/local/share/doc/@var{yourpkg}}, but it should be written as +@file{$(datarootdir)/doc/@var{yourpkg}}. (If you are using Autoconf, +write it as @samp{@@docdir@@}.) The @var{yourpkg} subdirectory, which +may include a version number, prevents collisions among files with +common names, such as @file{README}. + +@item infodir +The directory for installing the Info files for this package. By +default, it should be @file{/usr/local/share/info}, but it should be +written as @file{$(datarootdir)/info}. (If you are using Autoconf, +write it as @samp{@@infodir@@}.) @code{infodir} is separate from +@code{docdir} for compatibility with existing practice. + +@item htmldir +@itemx dvidir +@itemx pdfdir +@itemx psdir +Directories for installing documentation files in the particular +format. They should all be set to @code{$(docdir)} by default. (If +you are using Autoconf, write them as @samp{@@htmldir@@}, +@samp{@@dvidir@@}, etc.) Packages which supply several translations +of their documentation should install them in +@samp{$(htmldir)/}@var{ll}, @samp{$(pdfdir)/}@var{ll}, etc. where +@var{ll} is a locale abbreviation such as @samp{en} or @samp{pt_BR}. + +@item libdir +The directory for object files and libraries of object code. Do not +install executables here, they probably ought to go in @file{$(libexecdir)} +instead. The value of @code{libdir} should normally be +@file{/usr/local/lib}, but write it as @file{$(exec_prefix)/lib}. +(If you are using Autoconf, write it as @samp{@@libdir@@}.) + +@item lispdir +The directory for installing any Emacs Lisp files in this package. By +default, it should be @file{/usr/local/share/emacs/site-lisp}, but it +should be written as @file{$(datarootdir)/emacs/site-lisp}. + +If you are using Autoconf, write the default as @samp{@@lispdir@@}. +In order to make @samp{@@lispdir@@} work, you need the following lines +in your @file{configure.in} file: + +@example +lispdir='$@{datarootdir@}/emacs/site-lisp' +AC_SUBST(lispdir) +@end example + +@item localedir +The directory for installing locale-specific message catalogs for this +package. By default, it should be @file{/usr/local/share/locale}, but +it should be written as @file{$(datarootdir)/locale}. (If you are +using Autoconf, write it as @samp{@@localedir@@}.) This directory +usually has a subdirectory per locale. +@end table + +Unix-style man pages are installed in one of the following: + +@table @samp +@item mandir +The top-level directory for installing the man pages (if any) for this +package. It will normally be @file{/usr/local/share/man}, but you +should write it as @file{$(datarootdir)/man}. (If you are using +Autoconf, write it as @samp{@@mandir@@}.) + +@item man1dir +The directory for installing section 1 man pages. Write it as +@file{$(mandir)/man1}. +@item man2dir +The directory for installing section 2 man pages. Write it as +@file{$(mandir)/man2} +@item @dots{} + +@strong{Don't make the primary documentation for any GNU software be a +man page. Write a manual in Texinfo instead. Man pages are just for +the sake of people running GNU software on Unix, which is a secondary +application only.} + +@item manext +The file name extension for the installed man page. This should contain +a period followed by the appropriate digit; it should normally be @samp{.1}. + +@item man1ext +The file name extension for installed section 1 man pages. +@item man2ext +The file name extension for installed section 2 man pages. +@item @dots{} +Use these names instead of @samp{manext} if the package needs to install man +pages in more than one section of the manual. +@end table + +And finally, you should set the following variable: + +@table @samp +@item srcdir +The directory for the sources being compiled. The value of this +variable is normally inserted by the @code{configure} shell script. +(If you are using Autoconf, use @samp{srcdir = @@srcdir@@}.) +@end table + +For example: + +@smallexample +@c I have changed some of the comments here slightly to fix an overfull +@c hbox, so the make manual can format correctly. --roland +# Common prefix for installation directories. +# NOTE: This directory must exist when you start the install. +prefix = /usr/local +datarootdir = $(prefix)/share +datadir = $(datarootdir) +exec_prefix = $(prefix) +# Where to put the executable for the command `gcc'. +bindir = $(exec_prefix)/bin +# Where to put the directories used by the compiler. +libexecdir = $(exec_prefix)/libexec +# Where to put the Info files. +infodir = $(datarootdir)/info +@end smallexample + +If your program installs a large number of files into one of the +standard user-specified directories, it might be useful to group them +into a subdirectory particular to that program. If you do this, you +should write the @code{install} rule to create these subdirectories. + +Do not expect the user to include the subdirectory name in the value of +any of the variables listed above. The idea of having a uniform set of +variable names for installation directories is to enable the user to +specify the exact same values for several different GNU packages. In +order for this to be useful, all the packages must be designed so that +they will work sensibly when the user does so. + +At times, not all of these variables may be implemented in the current +release of Autoconf and/or Automake; but as of Autoconf@tie{}2.60, we +believe all of them are. When any are missing, the descriptions here +serve as specifications for what Autoconf will implement. As a +programmer, you can either use a development version of Autoconf or +avoid using these variables until a stable release is made which +supports them. + + +@node Standard Targets +@section Standard Targets for Users + +All GNU programs should have the following targets in their Makefiles: + +@table @samp +@item all +Compile the entire program. This should be the default target. This +target need not rebuild any documentation files; Info files should +normally be included in the distribution, and DVI (and other +documentation format) files should be made only when explicitly asked +for. + +By default, the Make rules should compile and link with @samp{-g}, so +that executable programs have debugging symbols. Users who don't mind +being helpless can strip the executables later if they wish. + +@item install +Compile the program and copy the executables, libraries, and so on to +the file names where they should reside for actual use. If there is a +simple test to verify that a program is properly installed, this target +should run that test. + +Do not strip executables when installing them. Devil-may-care users can +use the @code{install-strip} target to do that. + +If possible, write the @code{install} target rule so that it does not +modify anything in the directory where the program was built, provided +@samp{make all} has just been done. This is convenient for building the +program under one user name and installing it under another. + +The commands should create all the directories in which files are to be +installed, if they don't already exist. This includes the directories +specified as the values of the variables @code{prefix} and +@code{exec_prefix}, as well as all subdirectories that are needed. +One way to do this is by means of an @code{installdirs} target +as described below. + +Use @samp{-} before any command for installing a man page, so that +@code{make} will ignore any errors. This is in case there are systems +that don't have the Unix man page documentation system installed. + +The way to install Info files is to copy them into @file{$(infodir)} +with @code{$(INSTALL_DATA)} (@pxref{Command Variables}), and then run +the @code{install-info} program if it is present. @code{install-info} +is a program that edits the Info @file{dir} file to add or update the +menu entry for the given Info file; it is part of the Texinfo package. + +Here is a sample rule to install an Info file that also tries to +handle some additional situations, such as @code{install-info} not +being present. + +@comment This example has been carefully formatted for the Make manual. +@comment Please do not reformat it without talking to bug-make@gnu.org. +@smallexample +do-install-info: foo.info installdirs + $(NORMAL_INSTALL) +# Prefer an info file in . to one in srcdir. + if test -f foo.info; then d=.; \ + else d="$(srcdir)"; fi; \ + $(INSTALL_DATA) $$d/foo.info \ + "$(DESTDIR)$(infodir)/foo.info" +# Run install-info only if it exists. +# Use `if' instead of just prepending `-' to the +# line so we notice real errors from install-info. +# Use `$(SHELL) -c' because some shells do not +# fail gracefully when there is an unknown command. + $(POST_INSTALL) + if $(SHELL) -c 'install-info --version' \ + >/dev/null 2>&1; then \ + install-info --dir-file="$(DESTDIR)$(infodir)/dir" \ + "$(DESTDIR)$(infodir)/foo.info"; \ + else true; fi +@end smallexample + +When writing the @code{install} target, you must classify all the +commands into three categories: normal ones, @dfn{pre-installation} +commands and @dfn{post-installation} commands. @xref{Install Command +Categories}. + +@item install-html +@itemx install-dvi +@itemx install-pdf +@itemx install-ps +These targets install documentation in formats other than Info; +they're intended to be called explicitly by the person installing the +package, if that format is desired. GNU prefers Info files, so these +must be installed by the @code{install} target. + +When you have many documentation files to install, we recommend that +you avoid collisions and clutter by arranging for these targets to +install in subdirectories of the appropriate installation directory, +such as @code{htmldir}. As one example, if your package has multiple +manuals, and you wish to install HTML documentation with many files +(such as the ``split'' mode output by @code{makeinfo --html}), you'll +certainly want to use subdirectories, or two nodes with the same name +in different manuals will overwrite each other. + +Please make these @code{install-@var{format}} targets invoke the +commands for the @var{format} target, for example, by making +@var{format} a dependency. + +@item uninstall +Delete all the installed files---the copies that the @samp{install} +and @samp{install-*} targets create. + +This rule should not modify the directories where compilation is done, +only the directories where files are installed. + +The uninstallation commands are divided into three categories, just like +the installation commands. @xref{Install Command Categories}. + +@item install-strip +Like @code{install}, but strip the executable files while installing +them. In simple cases, this target can use the @code{install} target in +a simple way: + +@smallexample +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \ + install +@end smallexample + +But if the package installs scripts as well as real executables, the +@code{install-strip} target can't just refer to the @code{install} +target; it has to strip the executables but not the scripts. + +@code{install-strip} should not strip the executables in the build +directory which are being copied for installation. It should only strip +the copies that are installed. + +Normally we do not recommend stripping an executable unless you are sure +the program has no bugs. However, it can be reasonable to install a +stripped executable for actual execution while saving the unstripped +executable elsewhere in case there is a bug. + +@comment The gratuitous blank line here is to make the table look better +@comment in the printed Make manual. Please leave it in. +@item clean + +Delete all files in the current directory that are normally created by +building the program. Also delete files in other directories if they +are created by this makefile. However, don't delete the files that +record the configuration. Also preserve files that could be made by +building, but normally aren't because the distribution comes with +them. There is no need to delete parent directories that were created +with @samp{mkdir -p}, since they could have existed anyway. + +Delete @file{.dvi} files here if they are not part of the distribution. + +@item distclean +Delete all files in the current directory (or created by this +makefile) that are created by configuring or building the program. If +you have unpacked the source and built the program without creating +any other files, @samp{make distclean} should leave only the files +that were in the distribution. However, there is no need to delete +parent directories that were created with @samp{mkdir -p}, since they +could have existed anyway. + +@item mostlyclean +Like @samp{clean}, but may refrain from deleting a few files that people +normally don't want to recompile. For example, the @samp{mostlyclean} +target for GCC does not delete @file{libgcc.a}, because recompiling it +is rarely necessary and takes a lot of time. + +@item maintainer-clean +Delete almost everything that can be reconstructed with this Makefile. +This typically includes everything deleted by @code{distclean}, plus +more: C source files produced by Bison, tags tables, Info files, and +so on. + +The reason we say ``almost everything'' is that running the command +@samp{make maintainer-clean} should not delete @file{configure} even +if @file{configure} can be remade using a rule in the Makefile. More +generally, @samp{make maintainer-clean} should not delete anything +that needs to exist in order to run @file{configure} and then begin to +build the program. Also, there is no need to delete parent +directories that were created with @samp{mkdir -p}, since they could +have existed anyway. These are the only exceptions; +@code{maintainer-clean} should delete everything else that can be +rebuilt. + +The @samp{maintainer-clean} target is intended to be used by a maintainer of +the package, not by ordinary users. You may need special tools to +reconstruct some of the files that @samp{make maintainer-clean} deletes. +Since these files are normally included in the distribution, we don't +take care to make them easy to reconstruct. If you find you need to +unpack the full distribution again, don't blame us. + +To help make users aware of this, the commands for the special +@code{maintainer-clean} target should start with these two: + +@smallexample +@@echo 'This command is intended for maintainers to use; it' +@@echo 'deletes files that may need special tools to rebuild.' +@end smallexample + +@item TAGS +Update a tags table for this program. +@c ADR: how? + +@item info +Generate any Info files needed. The best way to write the rules is as +follows: + +@smallexample +info: foo.info + +foo.info: foo.texi chap1.texi chap2.texi + $(MAKEINFO) $(srcdir)/foo.texi +@end smallexample + +@noindent +You must define the variable @code{MAKEINFO} in the Makefile. It should +run the @code{makeinfo} program, which is part of the Texinfo +distribution. + +Normally a GNU distribution comes with Info files, and that means the +Info files are present in the source directory. Therefore, the Make +rule for an info file should update it in the source directory. When +users build the package, ordinarily Make will not update the Info files +because they will already be up to date. + +@item dvi +@itemx html +@itemx pdf +@itemx ps +Generate documentation files in the given format. These targets +should always exist, but any or all can be a no-op if the given output +format cannot be generated. These targets should not be dependencies +of the @code{all} target; the user must manually invoke them. + +Here's an example rule for generating DVI files from Texinfo: + +@smallexample +dvi: foo.dvi + +foo.dvi: foo.texi chap1.texi chap2.texi + $(TEXI2DVI) $(srcdir)/foo.texi +@end smallexample + +@noindent +You must define the variable @code{TEXI2DVI} in the Makefile. It should +run the program @code{texi2dvi}, which is part of the Texinfo +distribution.@footnote{@code{texi2dvi} uses @TeX{} to do the real work +of formatting. @TeX{} is not distributed with Texinfo.} Alternatively, +write just the dependencies, and allow GNU @code{make} to provide the command. + +Here's another example, this one for generating HTML from Texinfo: + +@smallexample +html: foo.html + +foo.html: foo.texi chap1.texi chap2.texi + $(TEXI2HTML) $(srcdir)/foo.texi +@end smallexample + +@noindent +Again, you would define the variable @code{TEXI2HTML} in the Makefile; +for example, it might run @code{makeinfo --no-split --html} +(@command{makeinfo} is part of the Texinfo distribution). + +@item dist +Create a distribution tar file for this program. The tar file should be +set up so that the file names in the tar file start with a subdirectory +name which is the name of the package it is a distribution for. This +name can include the version number. + +For example, the distribution tar file of GCC version 1.40 unpacks into +a subdirectory named @file{gcc-1.40}. + +The easiest way to do this is to create a subdirectory appropriately +named, use @code{ln} or @code{cp} to install the proper files in it, and +then @code{tar} that subdirectory. + +Compress the tar file with @code{gzip}. For example, the actual +distribution file for GCC version 1.40 is called @file{gcc-1.40.tar.gz}. +It is ok to support other free compression formats as well. + +The @code{dist} target should explicitly depend on all non-source files +that are in the distribution, to make sure they are up to date in the +distribution. +@ifset CODESTD +@xref{Releases, , Making Releases}. +@end ifset +@ifclear CODESTD +@xref{Releases, , Making Releases, standards, GNU Coding Standards}. +@end ifclear + +@item check +Perform self-tests (if any). The user must build the program before +running the tests, but need not install the program; you should write +the self-tests so that they work when the program is built but not +installed. +@end table + +The following targets are suggested as conventional names, for programs +in which they are useful. + +@table @code +@item installcheck +Perform installation tests (if any). The user must build and install +the program before running the tests. You should not assume that +@file{$(bindir)} is in the search path. + +@item installdirs +It's useful to add a target named @samp{installdirs} to create the +directories where files are installed, and their parent directories. +There is a script called @file{mkinstalldirs} which is convenient for +this; you can find it in the Gnulib package. +You can use a rule like this: + +@comment This has been carefully formatted to look decent in the Make manual. +@comment Please be sure not to make it extend any further to the right.--roland +@smallexample +# Make sure all installation directories (e.g. $(bindir)) +# actually exist by making them if necessary. +installdirs: mkinstalldirs + $(srcdir)/mkinstalldirs $(bindir) $(datadir) \ + $(libdir) $(infodir) \ + $(mandir) +@end smallexample + +@noindent +or, if you wish to support @env{DESTDIR} (strongly encouraged), + +@smallexample +# Make sure all installation directories (e.g. $(bindir)) +# actually exist by making them if necessary. +installdirs: mkinstalldirs + $(srcdir)/mkinstalldirs \ + $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \ + $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \ + $(DESTDIR)$(mandir) +@end smallexample + +This rule should not modify the directories where compilation is done. +It should do nothing but create installation directories. +@end table + +@node Install Command Categories +@section Install Command Categories + +@cindex pre-installation commands +@cindex post-installation commands +When writing the @code{install} target, you must classify all the +commands into three categories: normal ones, @dfn{pre-installation} +commands and @dfn{post-installation} commands. + +Normal commands move files into their proper places, and set their +modes. They may not alter any files except the ones that come entirely +from the package they belong to. + +Pre-installation and post-installation commands may alter other files; +in particular, they can edit global configuration files or data bases. + +Pre-installation commands are typically executed before the normal +commands, and post-installation commands are typically run after the +normal commands. + +The most common use for a post-installation command is to run +@code{install-info}. This cannot be done with a normal command, since +it alters a file (the Info directory) which does not come entirely and +solely from the package being installed. It is a post-installation +command because it needs to be done after the normal command which +installs the package's Info files. + +Most programs don't need any pre-installation commands, but we have the +feature just in case it is needed. + +To classify the commands in the @code{install} rule into these three +categories, insert @dfn{category lines} among them. A category line +specifies the category for the commands that follow. + +A category line consists of a tab and a reference to a special Make +variable, plus an optional comment at the end. There are three +variables you can use, one for each category; the variable name +specifies the category. Category lines are no-ops in ordinary execution +because these three Make variables are normally undefined (and you +@emph{should not} define them in the makefile). + +Here are the three possible category lines, each with a comment that +explains what it means: + +@smallexample + $(PRE_INSTALL) # @r{Pre-install commands follow.} + $(POST_INSTALL) # @r{Post-install commands follow.} + $(NORMAL_INSTALL) # @r{Normal commands follow.} +@end smallexample + +If you don't use a category line at the beginning of the @code{install} +rule, all the commands are classified as normal until the first category +line. If you don't use any category lines, all the commands are +classified as normal. + +These are the category lines for @code{uninstall}: + +@smallexample + $(PRE_UNINSTALL) # @r{Pre-uninstall commands follow.} + $(POST_UNINSTALL) # @r{Post-uninstall commands follow.} + $(NORMAL_UNINSTALL) # @r{Normal commands follow.} +@end smallexample + +Typically, a pre-uninstall command would be used for deleting entries +from the Info directory. + +If the @code{install} or @code{uninstall} target has any dependencies +which act as subroutines of installation, then you should start +@emph{each} dependency's commands with a category line, and start the +main target's commands with a category line also. This way, you can +ensure that each command is placed in the right category regardless of +which of the dependencies actually run. + +Pre-installation and post-installation commands should not run any +programs except for these: + +@example +[ basename bash cat chgrp chmod chown cmp cp dd diff echo +egrep expand expr false fgrep find getopt grep gunzip gzip +hostname install install-info kill ldconfig ln ls md5sum +mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee +test touch true uname xargs yes +@end example + +@cindex binary packages +The reason for distinguishing the commands in this way is for the sake +of making binary packages. Typically a binary package contains all the +executables and other files that need to be installed, and has its own +method of installing them---so it does not need to run the normal +installation commands. But installing the binary package does need to +execute the pre-installation and post-installation commands. + +Programs to build binary packages work by extracting the +pre-installation and post-installation commands. Here is one way of +extracting the pre-installation commands (the @option{-s} option to +@command{make} is needed to silence messages about entering +subdirectories): + +@smallexample +make -s -n install -o all \ + PRE_INSTALL=pre-install \ + POST_INSTALL=post-install \ + NORMAL_INSTALL=normal-install \ + | gawk -f pre-install.awk +@end smallexample + +@noindent +where the file @file{pre-install.awk} could contain this: + +@smallexample +$0 ~ /^(normal-install|post-install)[ \t]*$/ @{on = 0@} +on @{print $0@} +$0 ~ /^pre-install[ \t]*$/ @{on = 1@} +@end smallexample diff --git a/doc/make.info b/doc/make.info new file mode 100644 index 0000000..bd28f2b --- /dev/null +++ b/doc/make.info @@ -0,0 +1,187 @@ +This is make.info, produced by makeinfo version 4.13 from make.texi. + +This file documents the GNU `make' utility, which determines +automatically which pieces of a large program need to be recompiled, +and issues the commands to recompile them. + + This is Edition 0.71, last updated 19 July 2010, of `The GNU Make +Manual', for GNU `make' version 3.82. + + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, +1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.2 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual. Buying copies from the FSF supports it in + developing GNU and promoting software freedom." + +INFO-DIR-SECTION Software development +START-INFO-DIR-ENTRY +* Make: (make). Remake files automatically. +END-INFO-DIR-ENTRY + + +Indirect: +make.info-1: 1319 +make.info-2: 293656 + +Tag Table: +(Indirect) +Node: Top1319 +Node: Overview14709 +Node: Preparing15719 +Node: Reading16690 +Node: Bugs17617 +Node: Introduction19446 +Node: Rule Introduction21037 +Node: Simple Makefile22970 +Node: How Make Works26666 +Node: Variables Simplify29321 +Node: make Deduces31527 +Node: Combine By Prerequisite33260 +Node: Cleanup34289 +Node: Makefiles35707 +Node: Makefile Contents36543 +Node: Makefile Names39649 +Node: Include41260 +Ref: Include-Footnote-145008 +Node: MAKEFILES Variable45142 +Node: Remaking Makefiles46683 +Node: Overriding Makefiles50907 +Node: Reading Makefiles52935 +Node: Secondary Expansion55947 +Node: Rules63388 +Node: Rule Example66060 +Node: Rule Syntax66914 +Node: Prerequisite Types69507 +Node: Wildcards72374 +Node: Wildcard Examples74092 +Node: Wildcard Pitfall75441 +Node: Wildcard Function77230 +Node: Directory Search79014 +Node: General Search80148 +Node: Selective Search81855 +Node: Search Algorithm84843 +Node: Recipes/Search87361 +Node: Implicit/Search88684 +Node: Libraries/Search89626 +Node: Phony Targets91596 +Node: Force Targets96665 +Node: Empty Targets97702 +Node: Special Targets99007 +Node: Multiple Targets106862 +Node: Multiple Rules108727 +Node: Static Pattern110945 +Node: Static Usage111597 +Node: Static versus Implicit115316 +Node: Double-Colon117057 +Node: Automatic Prerequisites118817 +Node: Recipes123095 +Node: Recipe Syntax124268 +Node: Splitting Lines126383 +Node: Variables in Recipes129483 +Node: Echoing130802 +Node: Execution132077 +Ref: Execution-Footnote-1133488 +Node: One Shell133633 +Node: Choosing the Shell136948 +Node: Parallel141094 +Node: Errors144815 +Node: Interrupts148483 +Node: Recursion150066 +Node: MAKE Variable152164 +Node: Variables/Recursion154411 +Node: Options/Recursion159861 +Node: -w Option165021 +Node: Canned Recipes166016 +Node: Empty Recipes169000 +Node: Using Variables170148 +Node: Reference173523 +Node: Flavors175081 +Node: Advanced180821 +Node: Substitution Refs181326 +Node: Computed Names182879 +Node: Values187425 +Node: Setting188342 +Node: Appending190378 +Node: Override Directive194304 +Node: Multi-Line195931 +Node: Undefine Directive198754 +Node: Environment199840 +Node: Target-specific202091 +Node: Pattern-specific205108 +Node: Suppressing Inheritance206954 +Node: Special Variables208408 +Node: Conditionals213121 +Node: Conditional Example213834 +Node: Conditional Syntax216397 +Node: Testing Flags222127 +Node: Functions223228 +Node: Syntax of Functions224659 +Node: Text Functions226858 +Node: File Name Functions235429 +Node: Conditional Functions240651 +Node: Foreach Function243025 +Node: Call Function246237 +Node: Value Function249122 +Node: Eval Function250559 +Node: Origin Function252835 +Node: Flavor Function256051 +Node: Shell Function257117 +Node: Make Control Functions258751 +Node: Running260413 +Node: Makefile Arguments262396 +Node: Goals263112 +Node: Instead of Execution267851 +Node: Avoiding Compilation271433 +Node: Overriding273407 +Node: Testing275710 +Node: Options Summary277594 +Node: Implicit Rules287992 +Node: Using Implicit290137 +Node: Catalogue of Rules293656 +Node: Implicit Variables303004 +Node: Chained Rules307761 +Node: Pattern Rules311772 +Node: Pattern Intro313307 +Node: Pattern Examples315895 +Node: Automatic Variables317701 +Node: Pattern Match325059 +Node: Match-Anything Rules328382 +Node: Canceling Rules332256 +Node: Last Resort332970 +Node: Suffix Rules334799 +Node: Implicit Rule Search338524 +Node: Archives342023 +Node: Archive Members342721 +Node: Archive Update344331 +Node: Archive Symbols346242 +Node: Archive Pitfalls347476 +Node: Archive Suffix Rules348198 +Node: Features349745 +Node: Missing358290 +Node: Makefile Conventions362017 +Node: Makefile Basics362996 +Node: Utilities in Makefiles366163 +Node: Command Variables368661 +Node: DESTDIR371900 +Node: Directory Variables374067 +Node: Standard Targets388682 +Ref: Standard Targets-Footnote-1402458 +Node: Install Command Categories402558 +Node: Quick Reference407084 +Node: Error Messages418767 +Node: Complex Makefile426463 +Node: GNU Free Documentation License434974 +Node: Concept Index460136 +Node: Name Index526637 + +End Tag Table diff --git a/doc/make.info-1 b/doc/make.info-1 new file mode 100644 index 0000000..509ce05 --- /dev/null +++ b/doc/make.info-1 @@ -0,0 +1,7066 @@ +This is make.info, produced by makeinfo version 4.13 from make.texi. + +This file documents the GNU `make' utility, which determines +automatically which pieces of a large program need to be recompiled, +and issues the commands to recompile them. + + This is Edition 0.71, last updated 19 July 2010, of `The GNU Make +Manual', for GNU `make' version 3.82. + + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, +1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.2 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual. Buying copies from the FSF supports it in + developing GNU and promoting software freedom." + +INFO-DIR-SECTION Software development +START-INFO-DIR-ENTRY +* Make: (make). Remake files automatically. +END-INFO-DIR-ENTRY + + +File: make.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir) + +GNU `make' +********** + +This file documents the GNU `make' utility, which determines +automatically which pieces of a large program need to be recompiled, +and issues the commands to recompile them. + + This is Edition 0.71, last updated 19 July 2010, of `The GNU Make +Manual', for GNU `make' version 3.82. + + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, +1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.2 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual. Buying copies from the FSF supports it in + developing GNU and promoting software freedom." + +* Menu: + +* Overview:: Overview of `make'. +* Introduction:: An introduction to `make'. +* Makefiles:: Makefiles tell `make' what to do. +* Rules:: Rules describe when a file must be remade. +* Recipes:: Recipes say how to remake a file. +* Using Variables:: You can use variables to avoid repetition. +* Conditionals:: Use or ignore parts of the makefile based + on the values of variables. +* Functions:: Many powerful ways to manipulate text. +* Invoking make: Running. How to invoke `make' on the command line. +* Implicit Rules:: Use implicit rules to treat many files alike, + based on their file names. +* Archives:: How `make' can update library archives. +* Features:: Features GNU `make' has over other `make's. +* Missing:: What GNU `make' lacks from other `make's. +* Makefile Conventions:: Conventions for writing makefiles for + GNU programs. +* Quick Reference:: A quick reference for experienced users. +* Error Messages:: A list of common errors generated by `make'. +* Complex Makefile:: A real example of a straightforward, + but nontrivial, makefile. + +* GNU Free Documentation License:: License for copying this manual +* Concept Index:: Index of Concepts +* Name Index:: Index of Functions, Variables, & Directives + + --- The Detailed Node Listing --- + +Overview of `make' + +* Preparing:: Preparing and running make +* Reading:: On reading this text +* Bugs:: Problems and bugs + +An Introduction to Makefiles + +* Rule Introduction:: What a rule looks like. +* Simple Makefile:: A simple makefile +* How Make Works:: How `make' processes this makefile +* Variables Simplify:: Variables make makefiles simpler +* make Deduces:: Letting `make' deduce the recipe +* Combine By Prerequisite:: Another style of makefile +* Cleanup:: Rules for cleaning the directory + +Writing Makefiles + +* Makefile Contents:: What makefiles contain. +* Makefile Names:: How to name your makefile. +* Include:: How one makefile can use another makefile. +* MAKEFILES Variable:: The environment can specify extra makefiles. +* Remaking Makefiles:: How makefiles get remade. +* Overriding Makefiles:: How to override part of one makefile + with another makefile. +* Reading Makefiles:: How makefiles are parsed. +* Secondary Expansion:: How and when secondary expansion is performed. + +Writing Rules + +* Rule Example:: An example explained. +* Rule Syntax:: General syntax explained. +* Prerequisite Types:: There are two types of prerequisites. +* Wildcards:: Using wildcard characters such as `*'. +* Directory Search:: Searching other directories for source files. +* Phony Targets:: Using a target that is not a real file's name. +* Force Targets:: You can use a target without a recipe + or prerequisites to mark other targets + as phony. +* Empty Targets:: When only the date matters and the + files are empty. +* Special Targets:: Targets with special built-in meanings. +* Multiple Targets:: When to make use of several targets in a rule. +* Multiple Rules:: How to use several rules with the same target. +* Static Pattern:: Static pattern rules apply to multiple targets + and can vary the prerequisites according to + the target name. +* Double-Colon:: How to use a special kind of rule to allow + several independent rules for one target. +* Automatic Prerequisites:: How to automatically generate rules giving + prerequisites from source files themselves. + +Using Wildcard Characters in File Names + +* Wildcard Examples:: Several examples +* Wildcard Pitfall:: Problems to avoid. +* Wildcard Function:: How to cause wildcard expansion where + it does not normally take place. + +Searching Directories for Prerequisites + +* General Search:: Specifying a search path that applies + to every prerequisite. +* Selective Search:: Specifying a search path + for a specified class of names. +* Search Algorithm:: When and how search paths are applied. +* Recipes/Search:: How to write recipes that work together + with search paths. +* Implicit/Search:: How search paths affect implicit rules. +* Libraries/Search:: Directory search for link libraries. + +Static Pattern Rules + +* Static Usage:: The syntax of static pattern rules. +* Static versus Implicit:: When are they better than implicit rules? + +Writing Recipes in Rules + +* Recipe Syntax:: Recipe syntax features and pitfalls. +* Echoing:: How to control when recipes are echoed. +* Execution:: How recipes are executed. +* Parallel:: How recipes can be executed in parallel. +* Errors:: What happens after a recipe execution error. +* Interrupts:: What happens when a recipe is interrupted. +* Recursion:: Invoking `make' from makefiles. +* Canned Recipes:: Defining canned recipes. +* Empty Recipes:: Defining useful, do-nothing recipes. + +Recipe Syntax + +* Splitting Lines:: Breaking long recipe lines for readability. +* Variables in Recipes:: Using `make' variables in recipes. + +Recipe Execution + +* Choosing the Shell:: How `make' chooses the shell used + to run recipes. + +Recursive Use of `make' + +* MAKE Variable:: The special effects of using `$(MAKE)'. +* Variables/Recursion:: How to communicate variables to a sub-`make'. +* Options/Recursion:: How to communicate options to a sub-`make'. +* -w Option:: How the `-w' or `--print-directory' option + helps debug use of recursive `make' commands. + +How to Use Variables + +* Reference:: How to use the value of a variable. +* Flavors:: Variables come in two flavors. +* Advanced:: Advanced features for referencing a variable. +* Values:: All the ways variables get their values. +* Setting:: How to set a variable in the makefile. +* Appending:: How to append more text to the old value + of a variable. +* Override Directive:: How to set a variable in the makefile even if + the user has set it with a command argument. +* Multi-Line:: An alternate way to set a variable + to a multi-line string. +* Environment:: Variable values can come from the environment. +* Target-specific:: Variable values can be defined on a per-target + basis. +* Pattern-specific:: Target-specific variable values can be applied + to a group of targets that match a pattern. +* Suppressing Inheritance:: Suppress inheritance of variables. +* Special Variables:: Variables with special meaning or behavior. + +Advanced Features for Reference to Variables + +* Substitution Refs:: Referencing a variable with + substitutions on the value. +* Computed Names:: Computing the name of the variable to refer to. + +Conditional Parts of Makefiles + +* Conditional Example:: Example of a conditional +* Conditional Syntax:: The syntax of conditionals. +* Testing Flags:: Conditionals that test flags. + +Functions for Transforming Text + +* Syntax of Functions:: How to write a function call. +* Text Functions:: General-purpose text manipulation functions. +* File Name Functions:: Functions for manipulating file names. +* Conditional Functions:: Functions that implement conditions. +* Foreach Function:: Repeat some text with controlled variation. +* Call Function:: Expand a user-defined function. +* Value Function:: Return the un-expanded value of a variable. +* Eval Function:: Evaluate the arguments as makefile syntax. +* Origin Function:: Find where a variable got its value. +* Flavor Function:: Find out the flavor of a variable. +* Shell Function:: Substitute the output of a shell command. +* Make Control Functions:: Functions that control how make runs. + +How to Run `make' + +* Makefile Arguments:: How to specify which makefile to use. +* Goals:: How to use goal arguments to specify which + parts of the makefile to use. +* Instead of Execution:: How to use mode flags to specify what + kind of thing to do with the recipes + in the makefile other than simply + execute them. +* Avoiding Compilation:: How to avoid recompiling certain files. +* Overriding:: How to override a variable to specify + an alternate compiler and other things. +* Testing:: How to proceed past some errors, to + test compilation. +* Options Summary:: Summary of Options + +Using Implicit Rules + +* Using Implicit:: How to use an existing implicit rule + to get the recipe for updating a file. +* Catalogue of Rules:: A list of built-in implicit rules. +* Implicit Variables:: How to change what predefined rules do. +* Chained Rules:: How to use a chain of implicit rules. +* Pattern Rules:: How to define new implicit rules. +* Last Resort:: How to define a recipe for rules which + cannot find any. +* Suffix Rules:: The old-fashioned style of implicit rule. +* Implicit Rule Search:: The precise algorithm for applying + implicit rules. + +Defining and Redefining Pattern Rules + +* Pattern Intro:: An introduction to pattern rules. +* Pattern Examples:: Examples of pattern rules. +* Automatic Variables:: How to use automatic variables in the + recipe of implicit rules. +* Pattern Match:: How patterns match. +* Match-Anything Rules:: Precautions you should take prior to + defining rules that can match any + target file whatever. +* Canceling Rules:: How to override or cancel built-in rules. + +Using `make' to Update Archive Files + +* Archive Members:: Archive members as targets. +* Archive Update:: The implicit rule for archive member targets. +* Archive Pitfalls:: Dangers to watch out for when using archives. +* Archive Suffix Rules:: You can write a special kind of suffix rule + for updating archives. + +Implicit Rule for Archive Member Targets + +* Archive Symbols:: How to update archive symbol directories. + + +File: make.info, Node: Overview, Next: Introduction, Prev: Top, Up: Top + +1 Overview of `make' +******************** + +The `make' utility automatically determines which pieces of a large +program need to be recompiled, and issues commands to recompile them. +This manual describes GNU `make', which was implemented by Richard +Stallman and Roland McGrath. Development since Version 3.76 has been +handled by Paul D. Smith. + + GNU `make' conforms to section 6.2 of `IEEE Standard 1003.2-1992' +(POSIX.2). + + Our examples show C programs, since they are most common, but you +can use `make' with any programming language whose compiler can be run +with a shell command. Indeed, `make' is not limited to programs. You +can use it to describe any task where some files must be updated +automatically from others whenever the others change. + +* Menu: + +* Preparing:: Preparing and Running Make +* Reading:: On Reading this Text +* Bugs:: Problems and Bugs + + +File: make.info, Node: Preparing, Next: Reading, Prev: Overview, Up: Overview + +Preparing and Running Make +========================== + + To prepare to use `make', you must write a file called the +"makefile" that describes the relationships among files in your program +and provides commands for updating each file. In a program, typically, +the executable file is updated from object files, which are in turn +made by compiling source files. + + Once a suitable makefile exists, each time you change some source +files, this simple shell command: + + make + +suffices to perform all necessary recompilations. The `make' program +uses the makefile data base and the last-modification times of the +files to decide which of the files need to be updated. For each of +those files, it issues the recipes recorded in the data base. + + You can provide command line arguments to `make' to control which +files should be recompiled, or how. *Note How to Run `make': Running. + + +File: make.info, Node: Reading, Next: Bugs, Prev: Preparing, Up: Overview + +1.1 How to Read This Manual +=========================== + +If you are new to `make', or are looking for a general introduction, +read the first few sections of each chapter, skipping the later +sections. In each chapter, the first few sections contain introductory +or general information and the later sections contain specialized or +technical information. The exception is the second chapter, *note An +Introduction to Makefiles: Introduction, all of which is introductory. + + If you are familiar with other `make' programs, see *note Features +of GNU `make': Features, which lists the enhancements GNU `make' has, +and *note Incompatibilities and Missing Features: Missing, which +explains the few things GNU `make' lacks that others have. + + For a quick summary, see *note Options Summary::, *note Quick +Reference::, and *note Special Targets::. + + +File: make.info, Node: Bugs, Prev: Reading, Up: Overview + +1.2 Problems and Bugs +===================== + +If you have problems with GNU `make' or think you've found a bug, +please report it to the developers; we cannot promise to do anything but +we might well want to fix it. + + Before reporting a bug, make sure you've actually found a real bug. +Carefully reread the documentation and see if it really says you can do +what you're trying to do. If it's not clear whether you should be able +to do something or not, report that too; it's a bug in the +documentation! + + Before reporting a bug or trying to fix it yourself, try to isolate +it to the smallest possible makefile that reproduces the problem. Then +send us the makefile and the exact results `make' gave you, including +any error or warning messages. Please don't paraphrase these messages: +it's best to cut and paste them into your report. When generating this +small makefile, be sure to not use any non-free or unusual tools in +your recipes: you can almost always emulate what such a tool would do +with simple shell commands. Finally, be sure to explain what you +expected to occur; this will help us decide whether the problem was +really in the documentation. + + Once you have a precise problem you can report it in one of two ways. +Either send electronic mail to: + + bug-make@gnu.org + +or use our Web-based project management tool, at: + + http://savannah.gnu.org/projects/make/ + +In addition to the information above, please be careful to include the +version number of `make' you are using. You can get this information +with the command `make --version'. Be sure also to include the type of +machine and operating system you are using. One way to obtain this +information is by looking at the final lines of output from the command +`make --help'. + + +File: make.info, Node: Introduction, Next: Makefiles, Prev: Overview, Up: Top + +2 An Introduction to Makefiles +****************************** + +You need a file called a "makefile" to tell `make' what to do. Most +often, the makefile tells `make' how to compile and link a program. + + In this chapter, we will discuss a simple makefile that describes +how to compile and link a text editor which consists of eight C source +files and three header files. The makefile can also tell `make' how to +run miscellaneous commands when explicitly asked (for example, to remove +certain files as a clean-up operation). To see a more complex example +of a makefile, see *note Complex Makefile::. + + When `make' recompiles the editor, each changed C source file must +be recompiled. If a header file has changed, each C source file that +includes the header file must be recompiled to be safe. Each +compilation produces an object file corresponding to the source file. +Finally, if any source file has been recompiled, all the object files, +whether newly made or saved from previous compilations, must be linked +together to produce the new executable editor. + +* Menu: + +* Rule Introduction:: What a rule looks like. +* Simple Makefile:: A Simple Makefile +* How Make Works:: How `make' Processes This Makefile +* Variables Simplify:: Variables Make Makefiles Simpler +* make Deduces:: Letting `make' Deduce the Recipes +* Combine By Prerequisite:: Another Style of Makefile +* Cleanup:: Rules for Cleaning the Directory + + +File: make.info, Node: Rule Introduction, Next: Simple Makefile, Prev: Introduction, Up: Introduction + +2.1 What a Rule Looks Like +========================== + +A simple makefile consists of "rules" with the following shape: + + TARGET ... : PREREQUISITES ... + RECIPE + ... + ... + + A "target" is usually the name of a file that is generated by a +program; examples of targets are executable or object files. A target +can also be the name of an action to carry out, such as `clean' (*note +Phony Targets::). + + A "prerequisite" is a file that is used as input to create the +target. A target often depends on several files. + + A "recipe" is an action that `make' carries out. A recipe may have +more than one command, either on the same line or each on its own line. +*Please note:* you need to put a tab character at the beginning of +every recipe line! This is an obscurity that catches the unwary. If +you prefer to prefix your recipes with a character other than tab, you +can set the `.RECIPEPREFIX' variable to an alternate character (*note +Special Variables::). + + Usually a recipe is in a rule with prerequisites and serves to +create a target file if any of the prerequisites change. However, the +rule that specifies a recipe for the target need not have +prerequisites. For example, the rule containing the delete command +associated with the target `clean' does not have prerequisites. + + A "rule", then, explains how and when to remake certain files which +are the targets of the particular rule. `make' carries out the recipe +on the prerequisites to create or update the target. A rule can also +explain how and when to carry out an action. *Note Writing Rules: +Rules. + + A makefile may contain other text besides rules, but a simple +makefile need only contain rules. Rules may look somewhat more +complicated than shown in this template, but all fit the pattern more +or less. + + +File: make.info, Node: Simple Makefile, Next: How Make Works, Prev: Rule Introduction, Up: Introduction + +2.2 A Simple Makefile +===================== + +Here is a straightforward makefile that describes the way an executable +file called `edit' depends on eight object files which, in turn, depend +on eight C source and three header files. + + In this example, all the C files include `defs.h', but only those +defining editing commands include `command.h', and only low level files +that change the editor buffer include `buffer.h'. + + edit : main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + cc -o edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + main.o : main.c defs.h + cc -c main.c + kbd.o : kbd.c defs.h command.h + cc -c kbd.c + command.o : command.c defs.h command.h + cc -c command.c + display.o : display.c defs.h buffer.h + cc -c display.c + insert.o : insert.c defs.h buffer.h + cc -c insert.c + search.o : search.c defs.h buffer.h + cc -c search.c + files.o : files.c defs.h buffer.h command.h + cc -c files.c + utils.o : utils.c defs.h + cc -c utils.c + clean : + rm edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +We split each long line into two lines using backslash-newline; this is +like using one long line, but is easier to read. + + To use this makefile to create the executable file called `edit', +type: + + make + + To use this makefile to delete the executable file and all the object +files from the directory, type: + + make clean + + In the example makefile, the targets include the executable file +`edit', and the object files `main.o' and `kbd.o'. The prerequisites +are files such as `main.c' and `defs.h'. In fact, each `.o' file is +both a target and a prerequisite. Recipes include `cc -c main.c' and +`cc -c kbd.c'. + + When a target is a file, it needs to be recompiled or relinked if any +of its prerequisites change. In addition, any prerequisites that are +themselves automatically generated should be updated first. In this +example, `edit' depends on each of the eight object files; the object +file `main.o' depends on the source file `main.c' and on the header +file `defs.h'. + + A recipe may follow each line that contains a target and +prerequisites. These recipes say how to update the target file. A tab +character (or whatever character is specified by the `.RECIPEPREFIX' +variable; *note Special Variables::) must come at the beginning of +every line in the recipe to distinguish recipes from other lines in the +makefile. (Bear in mind that `make' does not know anything about how +the recipes work. It is up to you to supply recipes that will update +the target file properly. All `make' does is execute the recipe you +have specified when the target file needs to be updated.) + + The target `clean' is not a file, but merely the name of an action. +Since you normally do not want to carry out the actions in this rule, +`clean' is not a prerequisite of any other rule. Consequently, `make' +never does anything with it unless you tell it specifically. Note that +this rule not only is not a prerequisite, it also does not have any +prerequisites, so the only purpose of the rule is to run the specified +recipe. Targets that do not refer to files but are just actions are +called "phony targets". *Note Phony Targets::, for information about +this kind of target. *Note Errors in Recipes: Errors, to see how to +cause `make' to ignore errors from `rm' or any other command. + + +File: make.info, Node: How Make Works, Next: Variables Simplify, Prev: Simple Makefile, Up: Introduction + +2.3 How `make' Processes a Makefile +=================================== + +By default, `make' starts with the first target (not targets whose +names start with `.'). This is called the "default goal". ("Goals" +are the targets that `make' strives ultimately to update. You can +override this behavior using the command line (*note Arguments to +Specify the Goals: Goals.) or with the `.DEFAULT_GOAL' special variable +(*note Other Special Variables: Special Variables.). + + In the simple example of the previous section, the default goal is to +update the executable program `edit'; therefore, we put that rule first. + + Thus, when you give the command: + + make + +`make' reads the makefile in the current directory and begins by +processing the first rule. In the example, this rule is for relinking +`edit'; but before `make' can fully process this rule, it must process +the rules for the files that `edit' depends on, which in this case are +the object files. Each of these files is processed according to its +own rule. These rules say to update each `.o' file by compiling its +source file. The recompilation must be done if the source file, or any +of the header files named as prerequisites, is more recent than the +object file, or if the object file does not exist. + + The other rules are processed because their targets appear as +prerequisites of the goal. If some other rule is not depended on by the +goal (or anything it depends on, etc.), that rule is not processed, +unless you tell `make' to do so (with a command such as `make clean'). + + Before recompiling an object file, `make' considers updating its +prerequisites, the source file and header files. This makefile does not +specify anything to be done for them--the `.c' and `.h' files are not +the targets of any rules--so `make' does nothing for these files. But +`make' would update automatically generated C programs, such as those +made by Bison or Yacc, by their own rules at this time. + + After recompiling whichever object files need it, `make' decides +whether to relink `edit'. This must be done if the file `edit' does +not exist, or if any of the object files are newer than it. If an +object file was just recompiled, it is now newer than `edit', so `edit' +is relinked. + + Thus, if we change the file `insert.c' and run `make', `make' will +compile that file to update `insert.o', and then link `edit'. If we +change the file `command.h' and run `make', `make' will recompile the +object files `kbd.o', `command.o' and `files.o' and then link the file +`edit'. + + +File: make.info, Node: Variables Simplify, Next: make Deduces, Prev: How Make Works, Up: Introduction + +2.4 Variables Make Makefiles Simpler +==================================== + +In our example, we had to list all the object files twice in the rule +for `edit' (repeated here): + + edit : main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + cc -o edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + Such duplication is error-prone; if a new object file is added to the +system, we might add it to one list and forget the other. We can +eliminate the risk and simplify the makefile by using a variable. +"Variables" allow a text string to be defined once and substituted in +multiple places later (*note How to Use Variables: Using Variables.). + + It is standard practice for every makefile to have a variable named +`objects', `OBJECTS', `objs', `OBJS', `obj', or `OBJ' which is a list +of all object file names. We would define such a variable `objects' +with a line like this in the makefile: + + objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +Then, each place we want to put a list of the object file names, we can +substitute the variable's value by writing `$(objects)' (*note How to +Use Variables: Using Variables.). + + Here is how the complete simple makefile looks when you use a +variable for the object files: + + objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + edit : $(objects) + cc -o edit $(objects) + main.o : main.c defs.h + cc -c main.c + kbd.o : kbd.c defs.h command.h + cc -c kbd.c + command.o : command.c defs.h command.h + cc -c command.c + display.o : display.c defs.h buffer.h + cc -c display.c + insert.o : insert.c defs.h buffer.h + cc -c insert.c + search.o : search.c defs.h buffer.h + cc -c search.c + files.o : files.c defs.h buffer.h command.h + cc -c files.c + utils.o : utils.c defs.h + cc -c utils.c + clean : + rm edit $(objects) + + +File: make.info, Node: make Deduces, Next: Combine By Prerequisite, Prev: Variables Simplify, Up: Introduction + +2.5 Letting `make' Deduce the Recipes +===================================== + +It is not necessary to spell out the recipes for compiling the +individual C source files, because `make' can figure them out: it has an +"implicit rule" for updating a `.o' file from a correspondingly named +`.c' file using a `cc -c' command. For example, it will use the recipe +`cc -c main.c -o main.o' to compile `main.c' into `main.o'. We can +therefore omit the recipes from the rules for the object files. *Note +Using Implicit Rules: Implicit Rules. + + When a `.c' file is used automatically in this way, it is also +automatically added to the list of prerequisites. We can therefore omit +the `.c' files from the prerequisites, provided we omit the recipe. + + Here is the entire example, with both of these changes, and a +variable `objects' as suggested above: + + objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + edit : $(objects) + cc -o edit $(objects) + + main.o : defs.h + kbd.o : defs.h command.h + command.o : defs.h command.h + display.o : defs.h buffer.h + insert.o : defs.h buffer.h + search.o : defs.h buffer.h + files.o : defs.h buffer.h command.h + utils.o : defs.h + + .PHONY : clean + clean : + rm edit $(objects) + +This is how we would write the makefile in actual practice. (The +complications associated with `clean' are described elsewhere. See +*note Phony Targets::, and *note Errors in Recipes: Errors.) + + Because implicit rules are so convenient, they are important. You +will see them used frequently. + + +File: make.info, Node: Combine By Prerequisite, Next: Cleanup, Prev: make Deduces, Up: Introduction + +2.6 Another Style of Makefile +============================= + +When the objects of a makefile are created only by implicit rules, an +alternative style of makefile is possible. In this style of makefile, +you group entries by their prerequisites instead of by their targets. +Here is what one looks like: + + objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + + edit : $(objects) + cc -o edit $(objects) + + $(objects) : defs.h + kbd.o command.o files.o : command.h + display.o insert.o search.o files.o : buffer.h + +Here `defs.h' is given as a prerequisite of all the object files; +`command.h' and `buffer.h' are prerequisites of the specific object +files listed for them. + + Whether this is better is a matter of taste: it is more compact, but +some people dislike it because they find it clearer to put all the +information about each target in one place. + + +File: make.info, Node: Cleanup, Prev: Combine By Prerequisite, Up: Introduction + +2.7 Rules for Cleaning the Directory +==================================== + +Compiling a program is not the only thing you might want to write rules +for. Makefiles commonly tell how to do a few other things besides +compiling a program: for example, how to delete all the object files +and executables so that the directory is `clean'. + + Here is how we could write a `make' rule for cleaning our example +editor: + + clean: + rm edit $(objects) + + In practice, we might want to write the rule in a somewhat more +complicated manner to handle unanticipated situations. We would do +this: + + .PHONY : clean + clean : + -rm edit $(objects) + +This prevents `make' from getting confused by an actual file called +`clean' and causes it to continue in spite of errors from `rm'. (See +*note Phony Targets::, and *note Errors in Recipes: Errors.) + +A rule such as this should not be placed at the beginning of the +makefile, because we do not want it to run by default! Thus, in the +example makefile, we want the rule for `edit', which recompiles the +editor, to remain the default goal. + + Since `clean' is not a prerequisite of `edit', this rule will not +run at all if we give the command `make' with no arguments. In order +to make the rule run, we have to type `make clean'. *Note How to Run +`make': Running. + + +File: make.info, Node: Makefiles, Next: Rules, Prev: Introduction, Up: Top + +3 Writing Makefiles +******************* + +The information that tells `make' how to recompile a system comes from +reading a data base called the "makefile". + +* Menu: + +* Makefile Contents:: What makefiles contain. +* Makefile Names:: How to name your makefile. +* Include:: How one makefile can use another makefile. +* MAKEFILES Variable:: The environment can specify extra makefiles. +* Remaking Makefiles:: How makefiles get remade. +* Overriding Makefiles:: How to override part of one makefile + with another makefile. +* Reading Makefiles:: How makefiles are parsed. +* Secondary Expansion:: How and when secondary expansion is performed. + + +File: make.info, Node: Makefile Contents, Next: Makefile Names, Prev: Makefiles, Up: Makefiles + +3.1 What Makefiles Contain +========================== + +Makefiles contain five kinds of things: "explicit rules", "implicit +rules", "variable definitions", "directives", and "comments". Rules, +variables, and directives are described at length in later chapters. + + * An "explicit rule" says when and how to remake one or more files, + called the rule's "targets". It lists the other files that the + targets depend on, called the "prerequisites" of the target, and + may also give a recipe to use to create or update the targets. + *Note Writing Rules: Rules. + + * An "implicit rule" says when and how to remake a class of files + based on their names. It describes how a target may depend on a + file with a name similar to the target and gives a recipe to + create or update such a target. *Note Using Implicit Rules: + Implicit Rules. + + * A "variable definition" is a line that specifies a text string + value for a variable that can be substituted into the text later. + The simple makefile example shows a variable definition for + `objects' as a list of all object files (*note Variables Make + Makefiles Simpler: Variables Simplify.). + + * A "directive" is an instruction for `make' to do something special + while reading the makefile. These include: + + * Reading another makefile (*note Including Other Makefiles: + Include.). + + * Deciding (based on the values of variables) whether to use or + ignore a part of the makefile (*note Conditional Parts of + Makefiles: Conditionals.). + + * Defining a variable from a verbatim string containing + multiple lines (*note Defining Multi-Line Variables: + Multi-Line.). + + * `#' in a line of a makefile starts a "comment". It and the rest + of the line are ignored, except that a trailing backslash not + escaped by another backslash will continue the comment across + multiple lines. A line containing just a comment (with perhaps + spaces before it) is effectively blank, and is ignored. If you + want a literal `#', escape it with a backslash (e.g., `\#'). + Comments may appear on any line in the makefile, although they are + treated specially in certain situations. + + You cannot use comments within variable references or function + calls: any instance of `#' will be treated literally (rather than + as the start of a comment) inside a variable reference or function + call. + + Comments within a recipe are passed to the shell, just as with any + other recipe text. The shell decides how to interpret it: whether + or not this is a comment is up to the shell. + + Within a `define' directive, comments are not ignored during the + definition of the variable, but rather kept intact in the value of + the variable. When the variable is expanded they will either be + treated as `make' comments or as recipe text, depending on the + context in which the variable is evaluated. + + +File: make.info, Node: Makefile Names, Next: Include, Prev: Makefile Contents, Up: Makefiles + +3.2 What Name to Give Your Makefile +=================================== + +By default, when `make' looks for the makefile, it tries the following +names, in order: `GNUmakefile', `makefile' and `Makefile'. + + Normally you should call your makefile either `makefile' or +`Makefile'. (We recommend `Makefile' because it appears prominently +near the beginning of a directory listing, right near other important +files such as `README'.) The first name checked, `GNUmakefile', is not +recommended for most makefiles. You should use this name if you have a +makefile that is specific to GNU `make', and will not be understood by +other versions of `make'. Other `make' programs look for `makefile' and +`Makefile', but not `GNUmakefile'. + + If `make' finds none of these names, it does not use any makefile. +Then you must specify a goal with a command argument, and `make' will +attempt to figure out how to remake it using only its built-in implicit +rules. *Note Using Implicit Rules: Implicit Rules. + + If you want to use a nonstandard name for your makefile, you can +specify the makefile name with the `-f' or `--file' option. The +arguments `-f NAME' or `--file=NAME' tell `make' to read the file NAME +as the makefile. If you use more than one `-f' or `--file' option, you +can specify several makefiles. All the makefiles are effectively +concatenated in the order specified. The default makefile names +`GNUmakefile', `makefile' and `Makefile' are not checked automatically +if you specify `-f' or `--file'. + + +File: make.info, Node: Include, Next: MAKEFILES Variable, Prev: Makefile Names, Up: Makefiles + +3.3 Including Other Makefiles +============================= + +The `include' directive tells `make' to suspend reading the current +makefile and read one or more other makefiles before continuing. The +directive is a line in the makefile that looks like this: + + include FILENAMES... + +FILENAMES can contain shell file name patterns. If FILENAMES is empty, +nothing is included and no error is printed. + + Extra spaces are allowed and ignored at the beginning of the line, +but the first character must not be a tab (or the value of +`.RECIPEPREFIX')--if the line begins with a tab, it will be considered +a recipe line. Whitespace is required between `include' and the file +names, and between file names; extra whitespace is ignored there and at +the end of the directive. A comment starting with `#' is allowed at +the end of the line. If the file names contain any variable or +function references, they are expanded. *Note How to Use Variables: +Using Variables. + + For example, if you have three `.mk' files, `a.mk', `b.mk', and +`c.mk', and `$(bar)' expands to `bish bash', then the following +expression + + include foo *.mk $(bar) + + is equivalent to + + include foo a.mk b.mk c.mk bish bash + + When `make' processes an `include' directive, it suspends reading of +the containing makefile and reads from each listed file in turn. When +that is finished, `make' resumes reading the makefile in which the +directive appears. + + One occasion for using `include' directives is when several programs, +handled by individual makefiles in various directories, need to use a +common set of variable definitions (*note Setting Variables: Setting.) +or pattern rules (*note Defining and Redefining Pattern Rules: Pattern +Rules.). + + Another such occasion is when you want to generate prerequisites from +source files automatically; the prerequisites can be put in a file that +is included by the main makefile. This practice is generally cleaner +than that of somehow appending the prerequisites to the end of the main +makefile as has been traditionally done with other versions of `make'. +*Note Automatic Prerequisites::. + + If the specified name does not start with a slash, and the file is +not found in the current directory, several other directories are +searched. First, any directories you have specified with the `-I' or +`--include-dir' option are searched (*note Summary of Options: Options +Summary.). Then the following directories (if they exist) are +searched, in this order: `PREFIX/include' (normally `/usr/local/include' +(1)) `/usr/gnu/include', `/usr/local/include', `/usr/include'. + + If an included makefile cannot be found in any of these directories, +a warning message is generated, but it is not an immediately fatal +error; processing of the makefile containing the `include' continues. +Once it has finished reading makefiles, `make' will try to remake any +that are out of date or don't exist. *Note How Makefiles Are Remade: +Remaking Makefiles. Only after it has tried to find a way to remake a +makefile and failed, will `make' diagnose the missing makefile as a +fatal error. + + If you want `make' to simply ignore a makefile which does not exist +or cannot be remade, with no error message, use the `-include' +directive instead of `include', like this: + + -include FILENAMES... + + This acts like `include' in every way except that there is no error +(not even a warning) if any of the FILENAMES (or any prerequisites of +any of the FILENAMES) do not exist or cannot be remade. + + For compatibility with some other `make' implementations, `sinclude' +is another name for `-include'. + + ---------- Footnotes ---------- + + (1) GNU Make compiled for MS-DOS and MS-Windows behaves as if PREFIX +has been defined to be the root of the DJGPP tree hierarchy. + + +File: make.info, Node: MAKEFILES Variable, Next: Remaking Makefiles, Prev: Include, Up: Makefiles + +3.4 The Variable `MAKEFILES' +============================ + +If the environment variable `MAKEFILES' is defined, `make' considers +its value as a list of names (separated by whitespace) of additional +makefiles to be read before the others. This works much like the +`include' directive: various directories are searched for those files +(*note Including Other Makefiles: Include.). In addition, the default +goal is never taken from one of these makefiles (or any makefile +included by them) and it is not an error if the files listed in +`MAKEFILES' are not found. + + The main use of `MAKEFILES' is in communication between recursive +invocations of `make' (*note Recursive Use of `make': Recursion.). It +usually is not desirable to set the environment variable before a +top-level invocation of `make', because it is usually better not to +mess with a makefile from outside. However, if you are running `make' +without a specific makefile, a makefile in `MAKEFILES' can do useful +things to help the built-in implicit rules work better, such as +defining search paths (*note Directory Search::). + + Some users are tempted to set `MAKEFILES' in the environment +automatically on login, and program makefiles to expect this to be done. +This is a very bad idea, because such makefiles will fail to work if +run by anyone else. It is much better to write explicit `include' +directives in the makefiles. *Note Including Other Makefiles: Include. + + +File: make.info, Node: Remaking Makefiles, Next: Overriding Makefiles, Prev: MAKEFILES Variable, Up: Makefiles + +3.5 How Makefiles Are Remade +============================ + +Sometimes makefiles can be remade from other files, such as RCS or SCCS +files. If a makefile can be remade from other files, you probably want +`make' to get an up-to-date version of the makefile to read in. + + To this end, after reading in all makefiles, `make' will consider +each as a goal target and attempt to update it. If a makefile has a +rule which says how to update it (found either in that very makefile or +in another one) or if an implicit rule applies to it (*note Using +Implicit Rules: Implicit Rules.), it will be updated if necessary. +After all makefiles have been checked, if any have actually been +changed, `make' starts with a clean slate and reads all the makefiles +over again. (It will also attempt to update each of them over again, +but normally this will not change them again, since they are already up +to date.) + + If you know that one or more of your makefiles cannot be remade and +you want to keep `make' from performing an implicit rule search on +them, perhaps for efficiency reasons, you can use any normal method of +preventing implicit rule lookup to do so. For example, you can write +an explicit rule with the makefile as the target, and an empty recipe +(*note Using Empty Recipes: Empty Recipes.). + + If the makefiles specify a double-colon rule to remake a file with a +recipe but no prerequisites, that file will always be remade (*note +Double-Colon::). In the case of makefiles, a makefile that has a +double-colon rule with a recipe but no prerequisites will be remade +every time `make' is run, and then again after `make' starts over and +reads the makefiles in again. This would cause an infinite loop: +`make' would constantly remake the makefile, and never do anything +else. So, to avoid this, `make' will *not* attempt to remake makefiles +which are specified as targets of a double-colon rule with a recipe but +no prerequisites. + + If you do not specify any makefiles to be read with `-f' or `--file' +options, `make' will try the default makefile names; *note What Name to +Give Your Makefile: Makefile Names. Unlike makefiles explicitly +requested with `-f' or `--file' options, `make' is not certain that +these makefiles should exist. However, if a default makefile does not +exist but can be created by running `make' rules, you probably want the +rules to be run so that the makefile can be used. + + Therefore, if none of the default makefiles exists, `make' will try +to make each of them in the same order in which they are searched for +(*note What Name to Give Your Makefile: Makefile Names.) until it +succeeds in making one, or it runs out of names to try. Note that it +is not an error if `make' cannot find or make any makefile; a makefile +is not always necessary. + + When you use the `-t' or `--touch' option (*note Instead of +Executing Recipes: Instead of Execution.), you would not want to use an +out-of-date makefile to decide which targets to touch. So the `-t' +option has no effect on updating makefiles; they are really updated +even if `-t' is specified. Likewise, `-q' (or `--question') and `-n' +(or `--just-print') do not prevent updating of makefiles, because an +out-of-date makefile would result in the wrong output for other targets. +Thus, `make -f mfile -n foo' will update `mfile', read it in, and then +print the recipe to update `foo' and its prerequisites without running +it. The recipe printed for `foo' will be the one specified in the +updated contents of `mfile'. + + However, on occasion you might actually wish to prevent updating of +even the makefiles. You can do this by specifying the makefiles as +goals in the command line as well as specifying them as makefiles. +When the makefile name is specified explicitly as a goal, the options +`-t' and so on do apply to them. + + Thus, `make -f mfile -n mfile foo' would read the makefile `mfile', +print the recipe needed to update it without actually running it, and +then print the recipe needed to update `foo' without running that. The +recipe for `foo' will be the one specified by the existing contents of +`mfile'. + + +File: make.info, Node: Overriding Makefiles, Next: Reading Makefiles, Prev: Remaking Makefiles, Up: Makefiles + +3.6 Overriding Part of Another Makefile +======================================= + +Sometimes it is useful to have a makefile that is mostly just like +another makefile. You can often use the `include' directive to include +one in the other, and add more targets or variable definitions. +However, it is illegal for two makefiles to give different recipes for +the same target. But there is another way. + + In the containing makefile (the one that wants to include the other), +you can use a match-anything pattern rule to say that to remake any +target that cannot be made from the information in the containing +makefile, `make' should look in another makefile. *Note Pattern +Rules::, for more information on pattern rules. + + For example, if you have a makefile called `Makefile' that says how +to make the target `foo' (and other targets), you can write a makefile +called `GNUmakefile' that contains: + + foo: + frobnicate > foo + + %: force + @$(MAKE) -f Makefile $@ + force: ; + + If you say `make foo', `make' will find `GNUmakefile', read it, and +see that to make `foo', it needs to run the recipe `frobnicate > foo'. +If you say `make bar', `make' will find no way to make `bar' in +`GNUmakefile', so it will use the recipe from the pattern rule: `make +-f Makefile bar'. If `Makefile' provides a rule for updating `bar', +`make' will apply the rule. And likewise for any other target that +`GNUmakefile' does not say how to make. + + The way this works is that the pattern rule has a pattern of just +`%', so it matches any target whatever. The rule specifies a +prerequisite `force', to guarantee that the recipe will be run even if +the target file already exists. We give the `force' target an empty +recipe to prevent `make' from searching for an implicit rule to build +it--otherwise it would apply the same match-anything rule to `force' +itself and create a prerequisite loop! + + +File: make.info, Node: Reading Makefiles, Next: Secondary Expansion, Prev: Overriding Makefiles, Up: Makefiles + +3.7 How `make' Reads a Makefile +=============================== + +GNU `make' does its work in two distinct phases. During the first +phase it reads all the makefiles, included makefiles, etc. and +internalizes all the variables and their values, implicit and explicit +rules, and constructs a dependency graph of all the targets and their +prerequisites. During the second phase, `make' uses these internal +structures to determine what targets will need to be rebuilt and to +invoke the rules necessary to do so. + + It's important to understand this two-phase approach because it has a +direct impact on how variable and function expansion happens; this is +often a source of some confusion when writing makefiles. Here we will +present a summary of the phases in which expansion happens for different +constructs within the makefile. We say that expansion is "immediate" +if it happens during the first phase: in this case `make' will expand +any variables or functions in that section of a construct as the +makefile is parsed. We say that expansion is "deferred" if expansion +is not performed immediately. Expansion of a deferred construct is not +performed until either the construct appears later in an immediate +context, or until the second phase. + + You may not be familiar with some of these constructs yet. You can +reference this section as you become familiar with them, in later +chapters. + +Variable Assignment +------------------- + +Variable definitions are parsed as follows: + + IMMEDIATE = DEFERRED + IMMEDIATE ?= DEFERRED + IMMEDIATE := IMMEDIATE + IMMEDIATE += DEFERRED or IMMEDIATE + + define IMMEDIATE + DEFERRED + endef + + define IMMEDIATE = + DEFERRED + endef + + define IMMEDIATE ?= + DEFERRED + endef + + define IMMEDIATE := + IMMEDIATE + endef + + define IMMEDIATE += + DEFERRED or IMMEDIATE + endef + + For the append operator, `+=', the right-hand side is considered +immediate if the variable was previously set as a simple variable +(`:='), and deferred otherwise. + +Conditional Directives +---------------------- + +Conditional directives are parsed immediately. This means, for +example, that automatic variables cannot be used in conditional +directives, as automatic variables are not set until the recipe for +that rule is invoked. If you need to use automatic variables in a +conditional directive you _must_ move the condition into the recipe and +use shell conditional syntax instead. + +Rule Definition +--------------- + +A rule is always expanded the same way, regardless of the form: + + IMMEDIATE : IMMEDIATE ; DEFERRED + DEFERRED + + That is, the target and prerequisite sections are expanded +immediately, and the recipe used to construct the target is always +deferred. This general rule is true for explicit rules, pattern rules, +suffix rules, static pattern rules, and simple prerequisite definitions. + + +File: make.info, Node: Secondary Expansion, Prev: Reading Makefiles, Up: Makefiles + +3.8 Secondary Expansion +======================= + +In the previous section we learned that GNU `make' works in two +distinct phases: a read-in phase and a target-update phase (*note How +`make' Reads a Makefile: Reading Makefiles.). GNU make also has the +ability to enable a _second expansion_ of the prerequisites (only) for +some or all targets defined in the makefile. In order for this second +expansion to occur, the special target `.SECONDEXPANSION' must be +defined before the first prerequisite list that makes use of this +feature. + + If that special target is defined then in between the two phases +mentioned above, right at the end of the read-in phase, all the +prerequisites of the targets defined after the special target are +expanded a _second time_. In most circumstances this secondary +expansion will have no effect, since all variable and function +references will have been expanded during the initial parsing of the +makefiles. In order to take advantage of the secondary expansion phase +of the parser, then, it's necessary to _escape_ the variable or +function reference in the makefile. In this case the first expansion +merely un-escapes the reference but doesn't expand it, and expansion is +left to the secondary expansion phase. For example, consider this +makefile: + + .SECONDEXPANSION: + ONEVAR = onefile + TWOVAR = twofile + myfile: $(ONEVAR) $$(TWOVAR) + + After the first expansion phase the prerequisites list of the +`myfile' target will be `onefile' and `$(TWOVAR)'; the first +(unescaped) variable reference to ONEVAR is expanded, while the second +(escaped) variable reference is simply unescaped, without being +recognized as a variable reference. Now during the secondary expansion +the first word is expanded again but since it contains no variable or +function references it remains the static value `onefile', while the +second word is now a normal reference to the variable TWOVAR, which is +expanded to the value `twofile'. The final result is that there are +two prerequisites, `onefile' and `twofile'. + + Obviously, this is not a very interesting case since the same result +could more easily have been achieved simply by having both variables +appear, unescaped, in the prerequisites list. One difference becomes +apparent if the variables are reset; consider this example: + + .SECONDEXPANSION: + AVAR = top + onefile: $(AVAR) + twofile: $$(AVAR) + AVAR = bottom + + Here the prerequisite of `onefile' will be expanded immediately, and +resolve to the value `top', while the prerequisite of `twofile' will +not be full expanded until the secondary expansion and yield a value of +`bottom'. + + This is marginally more exciting, but the true power of this feature +only becomes apparent when you discover that secondary expansions +always take place within the scope of the automatic variables for that +target. This means that you can use variables such as `$@', `$*', etc. +during the second expansion and they will have their expected values, +just as in the recipe. All you have to do is defer the expansion by +escaping the `$'. Also, secondary expansion occurs for both explicit +and implicit (pattern) rules. Knowing this, the possible uses for this +feature increase dramatically. For example: + + .SECONDEXPANSION: + main_OBJS := main.o try.o test.o + lib_OBJS := lib.o api.o + + main lib: $$($$@_OBJS) + + Here, after the initial expansion the prerequisites of both the +`main' and `lib' targets will be `$($@_OBJS)'. During the secondary +expansion, the `$@' variable is set to the name of the target and so +the expansion for the `main' target will yield `$(main_OBJS)', or +`main.o try.o test.o', while the secondary expansion for the `lib' +target will yield `$(lib_OBJS)', or `lib.o api.o'. + + You can also mix in functions here, as long as they are properly +escaped: + + main_SRCS := main.c try.c test.c + lib_SRCS := lib.c api.c + + .SECONDEXPANSION: + main lib: $$(patsubst %.c,%.o,$$($$@_SRCS)) + + This version allows users to specify source files rather than object +files, but gives the same resulting prerequisites list as the previous +example. + + Evaluation of automatic variables during the secondary expansion +phase, especially of the target name variable `$$@', behaves similarly +to evaluation within recipes. However, there are some subtle +differences and "corner cases" which come into play for the different +types of rule definitions that `make' understands. The subtleties of +using the different automatic variables are described below. + +Secondary Expansion of Explicit Rules +------------------------------------- + +During the secondary expansion of explicit rules, `$$@' and `$$%' +evaluate, respectively, to the file name of the target and, when the +target is an archive member, the target member name. The `$$<' +variable evaluates to the first prerequisite in the first rule for this +target. `$$^' and `$$+' evaluate to the list of all prerequisites of +rules _that have already appeared_ for the same target (`$$+' with +repetitions and `$$^' without). The following example will help +illustrate these behaviors: + + .SECONDEXPANSION: + + foo: foo.1 bar.1 $$< $$^ $$+ # line #1 + + foo: foo.2 bar.2 $$< $$^ $$+ # line #2 + + foo: foo.3 bar.3 $$< $$^ $$+ # line #3 + + In the first prerequisite list, all three variables (`$$<', `$$^', +and `$$+') expand to the empty string. In the second, they will have +values `foo.1', `foo.1 bar.1', and `foo.1 bar.1' respectively. In the +third they will have values `foo.1', `foo.1 bar.1 foo.2 bar.2', and +`foo.1 bar.1 foo.2 bar.2 foo.1 foo.1 bar.1 foo.1 bar.1' respectively. + + Rules undergo secondary expansion in makefile order, except that the +rule with the recipe is always evaluated last. + + The variables `$$?' and `$$*' are not available and expand to the +empty string. + +Secondary Expansion of Static Pattern Rules +------------------------------------------- + +Rules for secondary expansion of static pattern rules are identical to +those for explicit rules, above, with one exception: for static pattern +rules the `$$*' variable is set to the pattern stem. As with explicit +rules, `$$?' is not available and expands to the empty string. + +Secondary Expansion of Implicit Rules +------------------------------------- + +As `make' searches for an implicit rule, it substitutes the stem and +then performs secondary expansion for every rule with a matching target +pattern. The value of the automatic variables is derived in the same +fashion as for static pattern rules. As an example: + + .SECONDEXPANSION: + + foo: bar + + foo foz: fo%: bo% + + %oo: $$< $$^ $$+ $$* + + When the implicit rule is tried for target `foo', `$$<' expands to +`bar', `$$^' expands to `bar boo', `$$+' also expands to `bar boo', and +`$$*' expands to `f'. + + Note that the directory prefix (D), as described in *note Implicit +Rule Search Algorithm: Implicit Rule Search, is appended (after +expansion) to all the patterns in the prerequisites list. As an +example: + + .SECONDEXPANSION: + + /tmp/foo.o: + + %.o: $$(addsuffix /%.c,foo bar) foo.h + + The prerequisite list after the secondary expansion and directory +prefix reconstruction will be `/tmp/foo/foo.c /tmp/var/bar/foo.c +foo.h'. If you are not interested in this reconstruction, you can use +`$$*' instead of `%' in the prerequisites list. + + +File: make.info, Node: Rules, Next: Recipes, Prev: Makefiles, Up: Top + +4 Writing Rules +*************** + +A "rule" appears in the makefile and says when and how to remake +certain files, called the rule's "targets" (most often only one per +rule). It lists the other files that are the "prerequisites" of the +target, and the "recipe" to use to create or update the target. + + The order of rules is not significant, except for determining the +"default goal": the target for `make' to consider, if you do not +otherwise specify one. The default goal is the target of the first +rule in the first makefile. If the first rule has multiple targets, +only the first target is taken as the default. There are two +exceptions: a target starting with a period is not a default unless it +contains one or more slashes, `/', as well; and, a target that defines +a pattern rule has no effect on the default goal. (*Note Defining and +Redefining Pattern Rules: Pattern Rules.) + + Therefore, we usually write the makefile so that the first rule is +the one for compiling the entire program or all the programs described +by the makefile (often with a target called `all'). *Note Arguments to +Specify the Goals: Goals. + +* Menu: + +* Rule Example:: An example explained. +* Rule Syntax:: General syntax explained. +* Prerequisite Types:: There are two types of prerequisites. +* Wildcards:: Using wildcard characters such as `*'. +* Directory Search:: Searching other directories for source files. +* Phony Targets:: Using a target that is not a real file's name. +* Force Targets:: You can use a target without recipes + or prerequisites to mark other targets + as phony. +* Empty Targets:: When only the date matters and the + files are empty. +* Special Targets:: Targets with special built-in meanings. +* Multiple Targets:: When to make use of several targets in a rule. +* Multiple Rules:: How to use several rules with the same target. +* Static Pattern:: Static pattern rules apply to multiple targets + and can vary the prerequisites according to + the target name. +* Double-Colon:: How to use a special kind of rule to allow + several independent rules for one target. +* Automatic Prerequisites:: How to automatically generate rules giving + prerequisites from source files themselves. + + +File: make.info, Node: Rule Example, Next: Rule Syntax, Prev: Rules, Up: Rules + +4.1 Rule Example +================ + +Here is an example of a rule: + + foo.o : foo.c defs.h # module for twiddling the frobs + cc -c -g foo.c + + Its target is `foo.o' and its prerequisites are `foo.c' and +`defs.h'. It has one command in the recipe: `cc -c -g foo.c'. The +recipe starts with a tab to identify it as a recipe. + + This rule says two things: + + * How to decide whether `foo.o' is out of date: it is out of date if + it does not exist, or if either `foo.c' or `defs.h' is more recent + than it. + + * How to update the file `foo.o': by running `cc' as stated. The + recipe does not explicitly mention `defs.h', but we presume that + `foo.c' includes it, and that that is why `defs.h' was added to + the prerequisites. + + +File: make.info, Node: Rule Syntax, Next: Prerequisite Types, Prev: Rule Example, Up: Rules + +4.2 Rule Syntax +=============== + +In general, a rule looks like this: + + TARGETS : PREREQUISITES + RECIPE + ... + +or like this: + + TARGETS : PREREQUISITES ; RECIPE + RECIPE + ... + + The TARGETS are file names, separated by spaces. Wildcard +characters may be used (*note Using Wildcard Characters in File Names: +Wildcards.) and a name of the form `A(M)' represents member M in +archive file A (*note Archive Members as Targets: Archive Members.). +Usually there is only one target per rule, but occasionally there is a +reason to have more (*note Multiple Targets in a Rule: Multiple +Targets.). + + The RECIPE lines start with a tab character (or the first character +in the value of the `.RECIPEPREFIX' variable; *note Special +Variables::). The first recipe line may appear on the line after the +prerequisites, with a tab character, or may appear on the same line, +with a semicolon. Either way, the effect is the same. There are other +differences in the syntax of recipes. *Note Writing Recipes in Rules: +Recipes. + + Because dollar signs are used to start `make' variable references, +if you really want a dollar sign in a target or prerequisite you must +write two of them, `$$' (*note How to Use Variables: Using Variables.). +If you have enabled secondary expansion (*note Secondary Expansion::) +and you want a literal dollar sign in the prerequisites list, you must +actually write _four_ dollar signs (`$$$$'). + + You may split a long line by inserting a backslash followed by a +newline, but this is not required, as `make' places no limit on the +length of a line in a makefile. + + A rule tells `make' two things: when the targets are out of date, +and how to update them when necessary. + + The criterion for being out of date is specified in terms of the +PREREQUISITES, which consist of file names separated by spaces. +(Wildcards and archive members (*note Archives::) are allowed here too.) +A target is out of date if it does not exist or if it is older than any +of the prerequisites (by comparison of last-modification times). The +idea is that the contents of the target file are computed based on +information in the prerequisites, so if any of the prerequisites +changes, the contents of the existing target file are no longer +necessarily valid. + + How to update is specified by a RECIPE. This is one or more lines +to be executed by the shell (normally `sh'), but with some extra +features (*note Writing Recipes in Rules: Recipes.). + + +File: make.info, Node: Prerequisite Types, Next: Wildcards, Prev: Rule Syntax, Up: Rules + +4.3 Types of Prerequisites +========================== + +There are actually two different types of prerequisites understood by +GNU `make': normal prerequisites such as described in the previous +section, and "order-only" prerequisites. A normal prerequisite makes +two statements: first, it imposes an order in which recipes will be +invoked: the recipes for all prerequisites of a target will be +completed before the recipe for the target is run. Second, it imposes +a dependency relationship: if any prerequisite is newer than the +target, then the target is considered out-of-date and must be rebuilt. + + Normally, this is exactly what you want: if a target's prerequisite +is updated, then the target should also be updated. + + Occasionally, however, you have a situation where you want to impose +a specific ordering on the rules to be invoked _without_ forcing the +target to be updated if one of those rules is executed. In that case, +you want to define "order-only" prerequisites. Order-only +prerequisites can be specified by placing a pipe symbol (`|') in the +prerequisites list: any prerequisites to the left of the pipe symbol +are normal; any prerequisites to the right are order-only: + + TARGETS : NORMAL-PREREQUISITES | ORDER-ONLY-PREREQUISITES + + The normal prerequisites section may of course be empty. Also, you +may still declare multiple lines of prerequisites for the same target: +they are appended appropriately (normal prerequisites are appended to +the list of normal prerequisites; order-only prerequisites are appended +to the list of order-only prerequisites). Note that if you declare the +same file to be both a normal and an order-only prerequisite, the +normal prerequisite takes precedence (since they have a strict superset +of the behavior of an order-only prerequisite). + + Consider an example where your targets are to be placed in a separate +directory, and that directory might not exist before `make' is run. In +this situation, you want the directory to be created before any targets +are placed into it but, because the timestamps on directories change +whenever a file is added, removed, or renamed, we certainly don't want +to rebuild all the targets whenever the directory's timestamp changes. +One way to manage this is with order-only prerequisites: make the +directory an order-only prerequisite on all the targets: + + OBJDIR := objdir + OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o) + + $(OBJDIR)/%.o : %.c + $(COMPILE.c) $(OUTPUT_OPTION) $< + + all: $(OBJS) + + $(OBJS): | $(OBJDIR) + + $(OBJDIR): + mkdir $(OBJDIR) + + Now the rule to create the `objdir' directory will be run, if +needed, before any `.o' is built, but no `.o' will be built because the +`objdir' directory timestamp changed. + + +File: make.info, Node: Wildcards, Next: Directory Search, Prev: Prerequisite Types, Up: Rules + +4.4 Using Wildcard Characters in File Names +=========================================== + +A single file name can specify many files using "wildcard characters". +The wildcard characters in `make' are `*', `?' and `[...]', the same as +in the Bourne shell. For example, `*.c' specifies a list of all the +files (in the working directory) whose names end in `.c'. + + The character `~' at the beginning of a file name also has special +significance. If alone, or followed by a slash, it represents your home +directory. For example `~/bin' expands to `/home/you/bin'. If the `~' +is followed by a word, the string represents the home directory of the +user named by that word. For example `~john/bin' expands to +`/home/john/bin'. On systems which don't have a home directory for +each user (such as MS-DOS or MS-Windows), this functionality can be +simulated by setting the environment variable HOME. + + Wildcard expansion is performed by `make' automatically in targets +and in prerequisites. In recipes, the shell is responsible for +wildcard expansion. In other contexts, wildcard expansion happens only +if you request it explicitly with the `wildcard' function. + + The special significance of a wildcard character can be turned off by +preceding it with a backslash. Thus, `foo\*bar' would refer to a +specific file whose name consists of `foo', an asterisk, and `bar'. + +* Menu: + +* Wildcard Examples:: Several examples +* Wildcard Pitfall:: Problems to avoid. +* Wildcard Function:: How to cause wildcard expansion where + it does not normally take place. + + +File: make.info, Node: Wildcard Examples, Next: Wildcard Pitfall, Prev: Wildcards, Up: Wildcards + +4.4.1 Wildcard Examples +----------------------- + +Wildcards can be used in the recipe of a rule, where they are expanded +by the shell. For example, here is a rule to delete all the object +files: + + clean: + rm -f *.o + + Wildcards are also useful in the prerequisites of a rule. With the +following rule in the makefile, `make print' will print all the `.c' +files that have changed since the last time you printed them: + + print: *.c + lpr -p $? + touch print + +This rule uses `print' as an empty target file; see *note Empty Target +Files to Record Events: Empty Targets. (The automatic variable `$?' is +used to print only those files that have changed; see *note Automatic +Variables::.) + + Wildcard expansion does not happen when you define a variable. +Thus, if you write this: + + objects = *.o + +then the value of the variable `objects' is the actual string `*.o'. +However, if you use the value of `objects' in a target or prerequisite, +wildcard expansion will take place there. If you use the value of +`objects' in a recipe, the shell may perform wildcard expansion when +the recipe runs. To set `objects' to the expansion, instead use: + + objects := $(wildcard *.o) + +*Note Wildcard Function::. + + +File: make.info, Node: Wildcard Pitfall, Next: Wildcard Function, Prev: Wildcard Examples, Up: Wildcards + +4.4.2 Pitfalls of Using Wildcards +--------------------------------- + +Now here is an example of a naive way of using wildcard expansion, that +does not do what you would intend. Suppose you would like to say that +the executable file `foo' is made from all the object files in the +directory, and you write this: + + objects = *.o + + foo : $(objects) + cc -o foo $(CFLAGS) $(objects) + +The value of `objects' is the actual string `*.o'. Wildcard expansion +happens in the rule for `foo', so that each _existing_ `.o' file +becomes a prerequisite of `foo' and will be recompiled if necessary. + + But what if you delete all the `.o' files? When a wildcard matches +no files, it is left as it is, so then `foo' will depend on the +oddly-named file `*.o'. Since no such file is likely to exist, `make' +will give you an error saying it cannot figure out how to make `*.o'. +This is not what you want! + + Actually it is possible to obtain the desired result with wildcard +expansion, but you need more sophisticated techniques, including the +`wildcard' function and string substitution. *Note The Function +`wildcard': Wildcard Function. + + Microsoft operating systems (MS-DOS and MS-Windows) use backslashes +to separate directories in pathnames, like so: + + c:\foo\bar\baz.c + + This is equivalent to the Unix-style `c:/foo/bar/baz.c' (the `c:' +part is the so-called drive letter). When `make' runs on these +systems, it supports backslashes as well as the Unix-style forward +slashes in pathnames. However, this support does _not_ include the +wildcard expansion, where backslash is a quote character. Therefore, +you _must_ use Unix-style slashes in these cases. + + +File: make.info, Node: Wildcard Function, Prev: Wildcard Pitfall, Up: Wildcards + +4.4.3 The Function `wildcard' +----------------------------- + +Wildcard expansion happens automatically in rules. But wildcard +expansion does not normally take place when a variable is set, or +inside the arguments of a function. If you want to do wildcard +expansion in such places, you need to use the `wildcard' function, like +this: + + $(wildcard PATTERN...) + +This string, used anywhere in a makefile, is replaced by a +space-separated list of names of existing files that match one of the +given file name patterns. If no existing file name matches a pattern, +then that pattern is omitted from the output of the `wildcard' +function. Note that this is different from how unmatched wildcards +behave in rules, where they are used verbatim rather than ignored +(*note Wildcard Pitfall::). + + One use of the `wildcard' function is to get a list of all the C +source files in a directory, like this: + + $(wildcard *.c) + + We can change the list of C source files into a list of object files +by replacing the `.c' suffix with `.o' in the result, like this: + + $(patsubst %.c,%.o,$(wildcard *.c)) + +(Here we have used another function, `patsubst'. *Note Functions for +String Substitution and Analysis: Text Functions.) + + Thus, a makefile to compile all C source files in the directory and +then link them together could be written as follows: + + objects := $(patsubst %.c,%.o,$(wildcard *.c)) + + foo : $(objects) + cc -o foo $(objects) + +(This takes advantage of the implicit rule for compiling C programs, so +there is no need to write explicit rules for compiling the files. +*Note The Two Flavors of Variables: Flavors, for an explanation of +`:=', which is a variant of `='.) + + +File: make.info, Node: Directory Search, Next: Phony Targets, Prev: Wildcards, Up: Rules + +4.5 Searching Directories for Prerequisites +=========================================== + +For large systems, it is often desirable to put sources in a separate +directory from the binaries. The "directory search" features of `make' +facilitate this by searching several directories automatically to find +a prerequisite. When you redistribute the files among directories, you +do not need to change the individual rules, just the search paths. + +* Menu: + +* General Search:: Specifying a search path that applies + to every prerequisite. +* Selective Search:: Specifying a search path + for a specified class of names. +* Search Algorithm:: When and how search paths are applied. +* Recipes/Search:: How to write recipes that work together + with search paths. +* Implicit/Search:: How search paths affect implicit rules. +* Libraries/Search:: Directory search for link libraries. + + +File: make.info, Node: General Search, Next: Selective Search, Prev: Directory Search, Up: Directory Search + +4.5.1 `VPATH': Search Path for All Prerequisites +------------------------------------------------ + +The value of the `make' variable `VPATH' specifies a list of +directories that `make' should search. Most often, the directories are +expected to contain prerequisite files that are not in the current +directory; however, `make' uses `VPATH' as a search list for both +prerequisites and targets of rules. + + Thus, if a file that is listed as a target or prerequisite does not +exist in the current directory, `make' searches the directories listed +in `VPATH' for a file with that name. If a file is found in one of +them, that file may become the prerequisite (see below). Rules may then +specify the names of files in the prerequisite list as if they all +existed in the current directory. *Note Writing Recipes with Directory +Search: Recipes/Search. + + In the `VPATH' variable, directory names are separated by colons or +blanks. The order in which directories are listed is the order followed +by `make' in its search. (On MS-DOS and MS-Windows, semi-colons are +used as separators of directory names in `VPATH', since the colon can +be used in the pathname itself, after the drive letter.) + + For example, + + VPATH = src:../headers + +specifies a path containing two directories, `src' and `../headers', +which `make' searches in that order. + + With this value of `VPATH', the following rule, + + foo.o : foo.c + +is interpreted as if it were written like this: + + foo.o : src/foo.c + +assuming the file `foo.c' does not exist in the current directory but +is found in the directory `src'. + + +File: make.info, Node: Selective Search, Next: Search Algorithm, Prev: General Search, Up: Directory Search + +4.5.2 The `vpath' Directive +--------------------------- + +Similar to the `VPATH' variable, but more selective, is the `vpath' +directive (note lower case), which allows you to specify a search path +for a particular class of file names: those that match a particular +pattern. Thus you can supply certain search directories for one class +of file names and other directories (or none) for other file names. + + There are three forms of the `vpath' directive: + +`vpath PATTERN DIRECTORIES' + Specify the search path DIRECTORIES for file names that match + PATTERN. + + The search path, DIRECTORIES, is a list of directories to be + searched, separated by colons (semi-colons on MS-DOS and + MS-Windows) or blanks, just like the search path used in the + `VPATH' variable. + +`vpath PATTERN' + Clear out the search path associated with PATTERN. + +`vpath' + Clear all search paths previously specified with `vpath' + directives. + + A `vpath' pattern is a string containing a `%' character. The +string must match the file name of a prerequisite that is being searched +for, the `%' character matching any sequence of zero or more characters +(as in pattern rules; *note Defining and Redefining Pattern Rules: +Pattern Rules.). For example, `%.h' matches files that end in `.h'. +(If there is no `%', the pattern must match the prerequisite exactly, +which is not useful very often.) + + `%' characters in a `vpath' directive's pattern can be quoted with +preceding backslashes (`\'). Backslashes that would otherwise quote +`%' characters can be quoted with more backslashes. Backslashes that +quote `%' characters or other backslashes are removed from the pattern +before it is compared to file names. Backslashes that are not in +danger of quoting `%' characters go unmolested. + + When a prerequisite fails to exist in the current directory, if the +PATTERN in a `vpath' directive matches the name of the prerequisite +file, then the DIRECTORIES in that directive are searched just like +(and before) the directories in the `VPATH' variable. + + For example, + + vpath %.h ../headers + +tells `make' to look for any prerequisite whose name ends in `.h' in +the directory `../headers' if the file is not found in the current +directory. + + If several `vpath' patterns match the prerequisite file's name, then +`make' processes each matching `vpath' directive one by one, searching +all the directories mentioned in each directive. `make' handles +multiple `vpath' directives in the order in which they appear in the +makefile; multiple directives with the same pattern are independent of +each other. + + Thus, + + vpath %.c foo + vpath % blish + vpath %.c bar + +will look for a file ending in `.c' in `foo', then `blish', then `bar', +while + + vpath %.c foo:bar + vpath % blish + +will look for a file ending in `.c' in `foo', then `bar', then `blish'. + + +File: make.info, Node: Search Algorithm, Next: Recipes/Search, Prev: Selective Search, Up: Directory Search + +4.5.3 How Directory Searches are Performed +------------------------------------------ + +When a prerequisite is found through directory search, regardless of +type (general or selective), the pathname located may not be the one +that `make' actually provides you in the prerequisite list. Sometimes +the path discovered through directory search is thrown away. + + The algorithm `make' uses to decide whether to keep or abandon a +path found via directory search is as follows: + + 1. If a target file does not exist at the path specified in the + makefile, directory search is performed. + + 2. If the directory search is successful, that path is kept and this + file is tentatively stored as the target. + + 3. All prerequisites of this target are examined using this same + method. + + 4. After processing the prerequisites, the target may or may not need + to be rebuilt: + + a. If the target does _not_ need to be rebuilt, the path to the + file found during directory search is used for any + prerequisite lists which contain this target. In short, if + `make' doesn't need to rebuild the target then you use the + path found via directory search. + + b. If the target _does_ need to be rebuilt (is out-of-date), the + pathname found during directory search is _thrown away_, and + the target is rebuilt using the file name specified in the + makefile. In short, if `make' must rebuild, then the target + is rebuilt locally, not in the directory found via directory + search. + + This algorithm may seem complex, but in practice it is quite often +exactly what you want. + + Other versions of `make' use a simpler algorithm: if the file does +not exist, and it is found via directory search, then that pathname is +always used whether or not the target needs to be built. Thus, if the +target is rebuilt it is created at the pathname discovered during +directory search. + + If, in fact, this is the behavior you want for some or all of your +directories, you can use the `GPATH' variable to indicate this to +`make'. + + `GPATH' has the same syntax and format as `VPATH' (that is, a space- +or colon-delimited list of pathnames). If an out-of-date target is +found by directory search in a directory that also appears in `GPATH', +then that pathname is not thrown away. The target is rebuilt using the +expanded path. + + +File: make.info, Node: Recipes/Search, Next: Implicit/Search, Prev: Search Algorithm, Up: Directory Search + +4.5.4 Writing Recipes with Directory Search +------------------------------------------- + +When a prerequisite is found in another directory through directory +search, this cannot change the recipe of the rule; they will execute as +written. Therefore, you must write the recipe with care so that it +will look for the prerequisite in the directory where `make' finds it. + + This is done with the "automatic variables" such as `$^' (*note +Automatic Variables::). For instance, the value of `$^' is a list of +all the prerequisites of the rule, including the names of the +directories in which they were found, and the value of `$@' is the +target. Thus: + + foo.o : foo.c + cc -c $(CFLAGS) $^ -o $@ + +(The variable `CFLAGS' exists so you can specify flags for C +compilation by implicit rules; we use it here for consistency so it will +affect all C compilations uniformly; *note Variables Used by Implicit +Rules: Implicit Variables.) + + Often the prerequisites include header files as well, which you do +not want to mention in the recipe. The automatic variable `$<' is just +the first prerequisite: + + VPATH = src:../headers + foo.o : foo.c defs.h hack.h + cc -c $(CFLAGS) $< -o $@ + + +File: make.info, Node: Implicit/Search, Next: Libraries/Search, Prev: Recipes/Search, Up: Directory Search + +4.5.5 Directory Search and Implicit Rules +----------------------------------------- + +The search through the directories specified in `VPATH' or with `vpath' +also happens during consideration of implicit rules (*note Using +Implicit Rules: Implicit Rules.). + + For example, when a file `foo.o' has no explicit rule, `make' +considers implicit rules, such as the built-in rule to compile `foo.c' +if that file exists. If such a file is lacking in the current +directory, the appropriate directories are searched for it. If `foo.c' +exists (or is mentioned in the makefile) in any of the directories, the +implicit rule for C compilation is applied. + + The recipes of implicit rules normally use automatic variables as a +matter of necessity; consequently they will use the file names found by +directory search with no extra effort. + + +File: make.info, Node: Libraries/Search, Prev: Implicit/Search, Up: Directory Search + +4.5.6 Directory Search for Link Libraries +----------------------------------------- + +Directory search applies in a special way to libraries used with the +linker. This special feature comes into play when you write a +prerequisite whose name is of the form `-lNAME'. (You can tell +something strange is going on here because the prerequisite is normally +the name of a file, and the _file name_ of a library generally looks +like `libNAME.a', not like `-lNAME'.) + + When a prerequisite's name has the form `-lNAME', `make' handles it +specially by searching for the file `libNAME.so', and, if it is not +found, for the file `libNAME.a' in the current directory, in +directories specified by matching `vpath' search paths and the `VPATH' +search path, and then in the directories `/lib', `/usr/lib', and +`PREFIX/lib' (normally `/usr/local/lib', but MS-DOS/MS-Windows versions +of `make' behave as if PREFIX is defined to be the root of the DJGPP +installation tree). + + For example, if there is a `/usr/lib/libcurses.a' library on your +system (and no `/usr/lib/libcurses.so' file), then + + foo : foo.c -lcurses + cc $^ -o $@ + +would cause the command `cc foo.c /usr/lib/libcurses.a -o foo' to be +executed when `foo' is older than `foo.c' or than +`/usr/lib/libcurses.a'. + + Although the default set of files to be searched for is `libNAME.so' +and `libNAME.a', this is customizable via the `.LIBPATTERNS' variable. +Each word in the value of this variable is a pattern string. When a +prerequisite like `-lNAME' is seen, `make' will replace the percent in +each pattern in the list with NAME and perform the above directory +searches using each library filename. + + The default value for `.LIBPATTERNS' is `lib%.so lib%.a', which +provides the default behavior described above. + + You can turn off link library expansion completely by setting this +variable to an empty value. + + +File: make.info, Node: Phony Targets, Next: Force Targets, Prev: Directory Search, Up: Rules + +4.6 Phony Targets +================= + +A phony target is one that is not really the name of a file; rather it +is just a name for a recipe to be executed when you make an explicit +request. There are two reasons to use a phony target: to avoid a +conflict with a file of the same name, and to improve performance. + + If you write a rule whose recipe will not create the target file, the +recipe will be executed every time the target comes up for remaking. +Here is an example: + + clean: + rm *.o temp + +Because the `rm' command does not create a file named `clean', probably +no such file will ever exist. Therefore, the `rm' command will be +executed every time you say `make clean'. + + The phony target will cease to work if anything ever does create a +file named `clean' in this directory. Since it has no prerequisites, +the file `clean' would inevitably be considered up to date, and its +recipe would not be executed. To avoid this problem, you can explicitly +declare the target to be phony, using the special target `.PHONY' +(*note Special Built-in Target Names: Special Targets.) as follows: + + .PHONY : clean + +Once this is done, `make clean' will run the recipe regardless of +whether there is a file named `clean'. + + Since it knows that phony targets do not name actual files that +could be remade from other files, `make' skips the implicit rule search +for phony targets (*note Implicit Rules::). This is why declaring a +target phony is good for performance, even if you are not worried about +the actual file existing. + + Thus, you first write the line that states that `clean' is a phony +target, then you write the rule, like this: + + .PHONY: clean + clean: + rm *.o temp + + Another example of the usefulness of phony targets is in conjunction +with recursive invocations of `make' (for more information, see *note +Recursive Use of `make': Recursion.). In this case the makefile will +often contain a variable which lists a number of subdirectories to be +built. One way to handle this is with one rule whose recipe is a shell +loop over the subdirectories, like this: + + SUBDIRS = foo bar baz + + subdirs: + for dir in $(SUBDIRS); do \ + $(MAKE) -C $$dir; \ + done + + There are problems with this method, however. First, any error +detected in a submake is ignored by this rule, so it will continue to +build the rest of the directories even when one fails. This can be +overcome by adding shell commands to note the error and exit, but then +it will do so even if `make' is invoked with the `-k' option, which is +unfortunate. Second, and perhaps more importantly, you cannot take +advantage of `make''s ability to build targets in parallel (*note +Parallel Execution: Parallel.), since there is only one rule. + + By declaring the subdirectories as phony targets (you must do this as +the subdirectory obviously always exists; otherwise it won't be built) +you can remove these problems: + + SUBDIRS = foo bar baz + + .PHONY: subdirs $(SUBDIRS) + + subdirs: $(SUBDIRS) + + $(SUBDIRS): + $(MAKE) -C $@ + + foo: baz + + Here we've also declared that the `foo' subdirectory cannot be built +until after the `baz' subdirectory is complete; this kind of +relationship declaration is particularly important when attempting +parallel builds. + + A phony target should not be a prerequisite of a real target file; +if it is, its recipe will be run every time `make' goes to update that +file. As long as a phony target is never a prerequisite of a real +target, the phony target recipe will be executed only when the phony +target is a specified goal (*note Arguments to Specify the Goals: +Goals.). + + Phony targets can have prerequisites. When one directory contains +multiple programs, it is most convenient to describe all of the +programs in one makefile `./Makefile'. Since the target remade by +default will be the first one in the makefile, it is common to make +this a phony target named `all' and give it, as prerequisites, all the +individual programs. For example: + + all : prog1 prog2 prog3 + .PHONY : all + + prog1 : prog1.o utils.o + cc -o prog1 prog1.o utils.o + + prog2 : prog2.o + cc -o prog2 prog2.o + + prog3 : prog3.o sort.o utils.o + cc -o prog3 prog3.o sort.o utils.o + +Now you can say just `make' to remake all three programs, or specify as +arguments the ones to remake (as in `make prog1 prog3'). Phoniness is +not inherited: the prerequisites of a phony target are not themselves +phony, unless explicitly declared to be so. + + When one phony target is a prerequisite of another, it serves as a +subroutine of the other. For example, here `make cleanall' will delete +the object files, the difference files, and the file `program': + + .PHONY: cleanall cleanobj cleandiff + + cleanall : cleanobj cleandiff + rm program + + cleanobj : + rm *.o + + cleandiff : + rm *.diff + + +File: make.info, Node: Force Targets, Next: Empty Targets, Prev: Phony Targets, Up: Rules + +4.7 Rules without Recipes or Prerequisites +========================================== + +If a rule has no prerequisites or recipe, and the target of the rule is +a nonexistent file, then `make' imagines this target to have been +updated whenever its rule is run. This implies that all targets +depending on this one will always have their recipe run. + + An example will illustrate this: + + clean: FORCE + rm $(objects) + FORCE: + + Here the target `FORCE' satisfies the special conditions, so the +target `clean' that depends on it is forced to run its recipe. There +is nothing special about the name `FORCE', but that is one name +commonly used this way. + + As you can see, using `FORCE' this way has the same results as using +`.PHONY: clean'. + + Using `.PHONY' is more explicit and more efficient. However, other +versions of `make' do not support `.PHONY'; thus `FORCE' appears in +many makefiles. *Note Phony Targets::. + + +File: make.info, Node: Empty Targets, Next: Special Targets, Prev: Force Targets, Up: Rules + +4.8 Empty Target Files to Record Events +======================================= + +The "empty target" is a variant of the phony target; it is used to hold +recipes for an action that you request explicitly from time to time. +Unlike a phony target, this target file can really exist; but the file's +contents do not matter, and usually are empty. + + The purpose of the empty target file is to record, with its +last-modification time, when the rule's recipe was last executed. It +does so because one of the commands in the recipe is a `touch' command +to update the target file. + + The empty target file should have some prerequisites (otherwise it +doesn't make sense). When you ask to remake the empty target, the +recipe is executed if any prerequisite is more recent than the target; +in other words, if a prerequisite has changed since the last time you +remade the target. Here is an example: + + print: foo.c bar.c + lpr -p $? + touch print + +With this rule, `make print' will execute the `lpr' command if either +source file has changed since the last `make print'. The automatic +variable `$?' is used to print only those files that have changed +(*note Automatic Variables::). + + +File: make.info, Node: Special Targets, Next: Multiple Targets, Prev: Empty Targets, Up: Rules + +4.9 Special Built-in Target Names +================================= + +Certain names have special meanings if they appear as targets. + +`.PHONY' + The prerequisites of the special target `.PHONY' are considered to + be phony targets. When it is time to consider such a target, + `make' will run its recipe unconditionally, regardless of whether + a file with that name exists or what its last-modification time + is. *Note Phony Targets: Phony Targets. + +`.SUFFIXES' + The prerequisites of the special target `.SUFFIXES' are the list + of suffixes to be used in checking for suffix rules. *Note + Old-Fashioned Suffix Rules: Suffix Rules. + +`.DEFAULT' + The recipe specified for `.DEFAULT' is used for any target for + which no rules are found (either explicit rules or implicit rules). + *Note Last Resort::. If a `.DEFAULT' recipe is specified, every + file mentioned as a prerequisite, but not as a target in a rule, + will have that recipe executed on its behalf. *Note Implicit Rule + Search Algorithm: Implicit Rule Search. + +`.PRECIOUS' + The targets which `.PRECIOUS' depends on are given the following + special treatment: if `make' is killed or interrupted during the + execution of their recipes, the target is not deleted. *Note + Interrupting or Killing `make': Interrupts. Also, if the target + is an intermediate file, it will not be deleted after it is no + longer needed, as is normally done. *Note Chains of Implicit + Rules: Chained Rules. In this latter respect it overlaps with the + `.SECONDARY' special target. + + You can also list the target pattern of an implicit rule (such as + `%.o') as a prerequisite file of the special target `.PRECIOUS' to + preserve intermediate files created by rules whose target patterns + match that file's name. + +`.INTERMEDIATE' + The targets which `.INTERMEDIATE' depends on are treated as + intermediate files. *Note Chains of Implicit Rules: Chained Rules. + `.INTERMEDIATE' with no prerequisites has no effect. + +`.SECONDARY' + The targets which `.SECONDARY' depends on are treated as + intermediate files, except that they are never automatically + deleted. *Note Chains of Implicit Rules: Chained Rules. + + `.SECONDARY' with no prerequisites causes all targets to be treated + as secondary (i.e., no target is removed because it is considered + intermediate). + +`.SECONDEXPANSION' + If `.SECONDEXPANSION' is mentioned as a target anywhere in the + makefile, then all prerequisite lists defined _after_ it appears + will be expanded a second time after all makefiles have been read + in. *Note Secondary Expansion: Secondary Expansion. + +`.DELETE_ON_ERROR' + If `.DELETE_ON_ERROR' is mentioned as a target anywhere in the + makefile, then `make' will delete the target of a rule if it has + changed and its recipe exits with a nonzero exit status, just as it + does when it receives a signal. *Note Errors in Recipes: Errors. + +`.IGNORE' + If you specify prerequisites for `.IGNORE', then `make' will + ignore errors in execution of the recipe for those particular + files. The recipe for `.IGNORE' (if any) is ignored. + + If mentioned as a target with no prerequisites, `.IGNORE' says to + ignore errors in execution of recipes for all files. This usage of + `.IGNORE' is supported only for historical compatibility. Since + this affects every recipe in the makefile, it is not very useful; + we recommend you use the more selective ways to ignore errors in + specific recipes. *Note Errors in Recipes: Errors. + +`.LOW_RESOLUTION_TIME' + If you specify prerequisites for `.LOW_RESOLUTION_TIME', `make' + assumes that these files are created by commands that generate low + resolution time stamps. The recipe for the `.LOW_RESOLUTION_TIME' + target are ignored. + + The high resolution file time stamps of many modern file systems + lessen the chance of `make' incorrectly concluding that a file is + up to date. Unfortunately, some hosts do not provide a way to set + a high resolution file time stamp, so commands like `cp -p' that + explicitly set a file's time stamp must discard its subsecond part. + If a file is created by such a command, you should list it as a + prerequisite of `.LOW_RESOLUTION_TIME' so that `make' does not + mistakenly conclude that the file is out of date. For example: + + .LOW_RESOLUTION_TIME: dst + dst: src + cp -p src dst + + Since `cp -p' discards the subsecond part of `src''s time stamp, + `dst' is typically slightly older than `src' even when it is up to + date. The `.LOW_RESOLUTION_TIME' line causes `make' to consider + `dst' to be up to date if its time stamp is at the start of the + same second that `src''s time stamp is in. + + Due to a limitation of the archive format, archive member time + stamps are always low resolution. You need not list archive + members as prerequisites of `.LOW_RESOLUTION_TIME', as `make' does + this automatically. + +`.SILENT' + If you specify prerequisites for `.SILENT', then `make' will not + print the recipe used to remake those particular files before + executing them. The recipe for `.SILENT' is ignored. + + If mentioned as a target with no prerequisites, `.SILENT' says not + to print any recipes before executing them. This usage of + `.SILENT' is supported only for historical compatibility. We + recommend you use the more selective ways to silence specific + recipes. *Note Recipe Echoing: Echoing. If you want to silence + all recipes for a particular run of `make', use the `-s' or + `--silent' option (*note Options Summary::). + +`.EXPORT_ALL_VARIABLES' + Simply by being mentioned as a target, this tells `make' to export + all variables to child processes by default. *Note Communicating + Variables to a Sub-`make': Variables/Recursion. + +`.NOTPARALLEL' + If `.NOTPARALLEL' is mentioned as a target, then this invocation + of `make' will be run serially, even if the `-j' option is given. + Any recursively invoked `make' command will still run recipes in + parallel (unless its makefile also contains this target). Any + prerequisites on this target are ignored. + +`.ONESHELL' + If `.ONESHELL' is mentioned as a target, then when a target is + built all lines of the recipe will be given to a single invocation + of the shell rather than each line being invoked separately (*note + Recipe Execution: Execution.). + +`.POSIX' + If `.POSIX' is mentioned as a target, then the makefile will be + parsed and run in POSIX-conforming mode. This does _not_ mean + that only POSIX-conforming makefiles will be accepted: all advanced + GNU `make' features are still available. Rather, this target + causes `make' to behave as required by POSIX in those areas where + `make''s default behavior differs. + + In particular, if this target is mentioned then recipes will be + invoked as if the shell had been passed the `-e' flag: the first + failing command in a recipe will cause the recipe to fail + immediately. + + Any defined implicit rule suffix also counts as a special target if +it appears as a target, and so does the concatenation of two suffixes, +such as `.c.o'. These targets are suffix rules, an obsolete way of +defining implicit rules (but a way still widely used). In principle, +any target name could be special in this way if you break it in two and +add both pieces to the suffix list. In practice, suffixes normally +begin with `.', so these special target names also begin with `.'. +*Note Old-Fashioned Suffix Rules: Suffix Rules. + + +File: make.info, Node: Multiple Targets, Next: Multiple Rules, Prev: Special Targets, Up: Rules + +4.10 Multiple Targets in a Rule +=============================== + +A rule with multiple targets is equivalent to writing many rules, each +with one target, and all identical aside from that. The same recipe +applies to all the targets, but its effect may vary because you can +substitute the actual target name into the recipe using `$@'. The rule +contributes the same prerequisites to all the targets also. + + This is useful in two cases. + + * You want just prerequisites, no recipe. For example: + + kbd.o command.o files.o: command.h + + gives an additional prerequisite to each of the three object files + mentioned. + + * Similar recipes work for all the targets. The recipes do not need + to be absolutely identical, since the automatic variable `$@' can + be used to substitute the particular target to be remade into the + commands (*note Automatic Variables::). For example: + + bigoutput littleoutput : text.g + generate text.g -$(subst output,,$@) > $@ + + is equivalent to + + bigoutput : text.g + generate text.g -big > bigoutput + littleoutput : text.g + generate text.g -little > littleoutput + + Here we assume the hypothetical program `generate' makes two types + of output, one if given `-big' and one if given `-little'. *Note + Functions for String Substitution and Analysis: Text Functions, + for an explanation of the `subst' function. + + Suppose you would like to vary the prerequisites according to the +target, much as the variable `$@' allows you to vary the recipe. You +cannot do this with multiple targets in an ordinary rule, but you can +do it with a "static pattern rule". *Note Static Pattern Rules: Static +Pattern. + + +File: make.info, Node: Multiple Rules, Next: Static Pattern, Prev: Multiple Targets, Up: Rules + +4.11 Multiple Rules for One Target +================================== + +One file can be the target of several rules. All the prerequisites +mentioned in all the rules are merged into one list of prerequisites for +the target. If the target is older than any prerequisite from any rule, +the recipe is executed. + + There can only be one recipe to be executed for a file. If more than +one rule gives a recipe for the same file, `make' uses the last one +given and prints an error message. (As a special case, if the file's +name begins with a dot, no error message is printed. This odd behavior +is only for compatibility with other implementations of `make'... you +should avoid using it). Occasionally it is useful to have the same +target invoke multiple recipes which are defined in different parts of +your makefile; you can use "double-colon rules" (*note Double-Colon::) +for this. + + An extra rule with just prerequisites can be used to give a few extra +prerequisites to many files at once. For example, makefiles often have +a variable, such as `objects', containing a list of all the compiler +output files in the system being made. An easy way to say that all of +them must be recompiled if `config.h' changes is to write the following: + + objects = foo.o bar.o + foo.o : defs.h + bar.o : defs.h test.h + $(objects) : config.h + + This could be inserted or taken out without changing the rules that +really specify how to make the object files, making it a convenient +form to use if you wish to add the additional prerequisite +intermittently. + + Another wrinkle is that the additional prerequisites could be +specified with a variable that you set with a command line argument to +`make' (*note Overriding Variables: Overriding.). For example, + + extradeps= + $(objects) : $(extradeps) + +means that the command `make extradeps=foo.h' will consider `foo.h' as +a prerequisite of each object file, but plain `make' will not. + + If none of the explicit rules for a target has a recipe, then `make' +searches for an applicable implicit rule to find one *note Using +Implicit Rules: Implicit Rules.). + + +File: make.info, Node: Static Pattern, Next: Double-Colon, Prev: Multiple Rules, Up: Rules + +4.12 Static Pattern Rules +========================= + +"Static pattern rules" are rules which specify multiple targets and +construct the prerequisite names for each target based on the target +name. They are more general than ordinary rules with multiple targets +because the targets do not have to have identical prerequisites. Their +prerequisites must be _analogous_, but not necessarily _identical_. + +* Menu: + +* Static Usage:: The syntax of static pattern rules. +* Static versus Implicit:: When are they better than implicit rules? + + +File: make.info, Node: Static Usage, Next: Static versus Implicit, Prev: Static Pattern, Up: Static Pattern + +4.12.1 Syntax of Static Pattern Rules +------------------------------------- + +Here is the syntax of a static pattern rule: + + TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS ... + RECIPE + ... + +The TARGETS list specifies the targets that the rule applies to. The +targets can contain wildcard characters, just like the targets of +ordinary rules (*note Using Wildcard Characters in File Names: +Wildcards.). + + The TARGET-PATTERN and PREREQ-PATTERNS say how to compute the +prerequisites of each target. Each target is matched against the +TARGET-PATTERN to extract a part of the target name, called the "stem". +This stem is substituted into each of the PREREQ-PATTERNS to make the +prerequisite names (one from each PREREQ-PATTERN). + + Each pattern normally contains the character `%' just once. When the +TARGET-PATTERN matches a target, the `%' can match any part of the +target name; this part is called the "stem". The rest of the pattern +must match exactly. For example, the target `foo.o' matches the +pattern `%.o', with `foo' as the stem. The targets `foo.c' and +`foo.out' do not match that pattern. + + The prerequisite names for each target are made by substituting the +stem for the `%' in each prerequisite pattern. For example, if one +prerequisite pattern is `%.c', then substitution of the stem `foo' +gives the prerequisite name `foo.c'. It is legitimate to write a +prerequisite pattern that does not contain `%'; then this prerequisite +is the same for all targets. + + `%' characters in pattern rules can be quoted with preceding +backslashes (`\'). Backslashes that would otherwise quote `%' +characters can be quoted with more backslashes. Backslashes that quote +`%' characters or other backslashes are removed from the pattern before +it is compared to file names or has a stem substituted into it. +Backslashes that are not in danger of quoting `%' characters go +unmolested. For example, the pattern `the\%weird\\%pattern\\' has +`the%weird\' preceding the operative `%' character, and `pattern\\' +following it. The final two backslashes are left alone because they +cannot affect any `%' character. + + Here is an example, which compiles each of `foo.o' and `bar.o' from +the corresponding `.c' file: + + objects = foo.o bar.o + + all: $(objects) + + $(objects): %.o: %.c + $(CC) -c $(CFLAGS) $< -o $@ + +Here `$<' is the automatic variable that holds the name of the +prerequisite and `$@' is the automatic variable that holds the name of +the target; see *note Automatic Variables::. + + Each target specified must match the target pattern; a warning is +issued for each target that does not. If you have a list of files, +only some of which will match the pattern, you can use the `filter' +function to remove nonmatching file names (*note Functions for String +Substitution and Analysis: Text Functions.): + + files = foo.elc bar.o lose.o + + $(filter %.o,$(files)): %.o: %.c + $(CC) -c $(CFLAGS) $< -o $@ + $(filter %.elc,$(files)): %.elc: %.el + emacs -f batch-byte-compile $< + +In this example the result of `$(filter %.o,$(files))' is `bar.o +lose.o', and the first static pattern rule causes each of these object +files to be updated by compiling the corresponding C source file. The +result of `$(filter %.elc,$(files))' is `foo.elc', so that file is made +from `foo.el'. + + Another example shows how to use `$*' in static pattern rules: + + bigoutput littleoutput : %output : text.g + generate text.g -$* > $@ + +When the `generate' command is run, `$*' will expand to the stem, +either `big' or `little'. + + +File: make.info, Node: Static versus Implicit, Prev: Static Usage, Up: Static Pattern + +4.12.2 Static Pattern Rules versus Implicit Rules +------------------------------------------------- + +A static pattern rule has much in common with an implicit rule defined +as a pattern rule (*note Defining and Redefining Pattern Rules: Pattern +Rules.). Both have a pattern for the target and patterns for +constructing the names of prerequisites. The difference is in how +`make' decides _when_ the rule applies. + + An implicit rule _can_ apply to any target that matches its pattern, +but it _does_ apply only when the target has no recipe otherwise +specified, and only when the prerequisites can be found. If more than +one implicit rule appears applicable, only one applies; the choice +depends on the order of rules. + + By contrast, a static pattern rule applies to the precise list of +targets that you specify in the rule. It cannot apply to any other +target and it invariably does apply to each of the targets specified. +If two conflicting rules apply, and both have recipes, that's an error. + + The static pattern rule can be better than an implicit rule for these +reasons: + + * You may wish to override the usual implicit rule for a few files + whose names cannot be categorized syntactically but can be given + in an explicit list. + + * If you cannot be sure of the precise contents of the directories + you are using, you may not be sure which other irrelevant files + might lead `make' to use the wrong implicit rule. The choice + might depend on the order in which the implicit rule search is + done. With static pattern rules, there is no uncertainty: each + rule applies to precisely the targets specified. + + +File: make.info, Node: Double-Colon, Next: Automatic Prerequisites, Prev: Static Pattern, Up: Rules + +4.13 Double-Colon Rules +======================= + +"Double-colon" rules are explicit rules written with `::' instead of +`:' after the target names. They are handled differently from ordinary +rules when the same target appears in more than one rule. Pattern +rules with double-colons have an entirely different meaning (*note +Match-Anything Rules::). + + When a target appears in multiple rules, all the rules must be the +same type: all ordinary, or all double-colon. If they are +double-colon, each of them is independent of the others. Each +double-colon rule's recipe is executed if the target is older than any +prerequisites of that rule. If there are no prerequisites for that +rule, its recipe is always executed (even if the target already +exists). This can result in executing none, any, or all of the +double-colon rules. + + Double-colon rules with the same target are in fact completely +separate from one another. Each double-colon rule is processed +individually, just as rules with different targets are processed. + + The double-colon rules for a target are executed in the order they +appear in the makefile. However, the cases where double-colon rules +really make sense are those where the order of executing the recipes +would not matter. + + Double-colon rules are somewhat obscure and not often very useful; +they provide a mechanism for cases in which the method used to update a +target differs depending on which prerequisite files caused the update, +and such cases are rare. + + Each double-colon rule should specify a recipe; if it does not, an +implicit rule will be used if one applies. *Note Using Implicit Rules: +Implicit Rules. + + +File: make.info, Node: Automatic Prerequisites, Prev: Double-Colon, Up: Rules + +4.14 Generating Prerequisites Automatically +=========================================== + +In the makefile for a program, many of the rules you need to write often +say only that some object file depends on some header file. For +example, if `main.c' uses `defs.h' via an `#include', you would write: + + main.o: defs.h + +You need this rule so that `make' knows that it must remake `main.o' +whenever `defs.h' changes. You can see that for a large program you +would have to write dozens of such rules in your makefile. And, you +must always be very careful to update the makefile every time you add +or remove an `#include'. + + To avoid this hassle, most modern C compilers can write these rules +for you, by looking at the `#include' lines in the source files. +Usually this is done with the `-M' option to the compiler. For +example, the command: + + cc -M main.c + +generates the output: + + main.o : main.c defs.h + +Thus you no longer have to write all those rules yourself. The +compiler will do it for you. + + Note that such a prerequisite constitutes mentioning `main.o' in a +makefile, so it can never be considered an intermediate file by implicit +rule search. This means that `make' won't ever remove the file after +using it; *note Chains of Implicit Rules: Chained Rules. + + With old `make' programs, it was traditional practice to use this +compiler feature to generate prerequisites on demand with a command like +`make depend'. That command would create a file `depend' containing +all the automatically-generated prerequisites; then the makefile could +use `include' to read them in (*note Include::). + + In GNU `make', the feature of remaking makefiles makes this practice +obsolete--you need never tell `make' explicitly to regenerate the +prerequisites, because it always regenerates any makefile that is out +of date. *Note Remaking Makefiles::. + + The practice we recommend for automatic prerequisite generation is +to have one makefile corresponding to each source file. For each +source file `NAME.c' there is a makefile `NAME.d' which lists what +files the object file `NAME.o' depends on. That way only the source +files that have changed need to be rescanned to produce the new +prerequisites. + + Here is the pattern rule to generate a file of prerequisites (i.e., +a makefile) called `NAME.d' from a C source file called `NAME.c': + + %.d: %.c + @set -e; rm -f $@; \ + $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +*Note Pattern Rules::, for information on defining pattern rules. The +`-e' flag to the shell causes it to exit immediately if the `$(CC)' +command (or any other command) fails (exits with a nonzero status). + + With the GNU C compiler, you may wish to use the `-MM' flag instead +of `-M'. This omits prerequisites on system header files. *Note +Options Controlling the Preprocessor: (gcc.info)Preprocessor Options, +for details. + + The purpose of the `sed' command is to translate (for example): + + main.o : main.c defs.h + +into: + + main.o main.d : main.c defs.h + +This makes each `.d' file depend on all the source and header files +that the corresponding `.o' file depends on. `make' then knows it must +regenerate the prerequisites whenever any of the source or header files +changes. + + Once you've defined the rule to remake the `.d' files, you then use +the `include' directive to read them all in. *Note Include::. For +example: + + sources = foo.c bar.c + + include $(sources:.c=.d) + +(This example uses a substitution variable reference to translate the +list of source files `foo.c bar.c' into a list of prerequisite +makefiles, `foo.d bar.d'. *Note Substitution Refs::, for full +information on substitution references.) Since the `.d' files are +makefiles like any others, `make' will remake them as necessary with no +further work from you. *Note Remaking Makefiles::. + + Note that the `.d' files contain target definitions; you should be +sure to place the `include' directive _after_ the first, default goal +in your makefiles or run the risk of having a random object file become +the default goal. *Note How Make Works::. + + +File: make.info, Node: Recipes, Next: Using Variables, Prev: Rules, Up: Top + +5 Writing Recipes in Rules +************************** + +The recipe of a rule consists of one or more shell command lines to be +executed, one at a time, in the order they appear. Typically, the +result of executing these commands is that the target of the rule is +brought up to date. + + Users use many different shell programs, but recipes in makefiles are +always interpreted by `/bin/sh' unless the makefile specifies +otherwise. *Note Recipe Execution: Execution. + +* Menu: + +* Recipe Syntax:: Recipe syntax features and pitfalls. +* Echoing:: How to control when recipes are echoed. +* Execution:: How recipes are executed. +* Parallel:: How recipes can be executed in parallel. +* Errors:: What happens after a recipe execution error. +* Interrupts:: What happens when a recipe is interrupted. +* Recursion:: Invoking `make' from makefiles. +* Canned Recipes:: Defining canned recipes. +* Empty Recipes:: Defining useful, do-nothing recipes. + + +File: make.info, Node: Recipe Syntax, Next: Echoing, Prev: Recipes, Up: Recipes + +5.1 Recipe Syntax +================= + +Makefiles have the unusual property that there are really two distinct +syntaxes in one file. Most of the makefile uses `make' syntax (*note +Writing Makefiles: Makefiles.). However, recipes are meant to be +interpreted by the shell and so they are written using shell syntax. +The `make' program does not try to understand shell syntax: it performs +only a very few specific translations on the content of the recipe +before handing it to the shell. + + Each line in the recipe must start with a tab (or the first character +in the value of the `.RECIPEPREFIX' variable; *note Special +Variables::), except that the first recipe line may be attached to the +target-and-prerequisites line with a semicolon in between. _Any_ line +in the makefile that begins with a tab and appears in a "rule context" +(that is, after a rule has been started until another rule or variable +definition) will be considered part of a recipe for that rule. Blank +lines and lines of just comments may appear among the recipe lines; +they are ignored. + + Some consequences of these rules include: + + * A blank line that begins with a tab is not blank: it's an empty + recipe (*note Empty Recipes::). + + * A comment in a recipe is not a `make' comment; it will be passed + to the shell as-is. Whether the shell treats it as a comment or + not depends on your shell. + + * A variable definition in a "rule context" which is indented by a + tab as the first character on the line, will be considered part of + a recipe, not a `make' variable definition, and passed to the + shell. + + * A conditional expression (`ifdef', `ifeq', etc. *note Syntax of + Conditionals: Conditional Syntax.) in a "rule context" which is + indented by a tab as the first character on the line, will be + considered part of a recipe and be passed to the shell. + + +* Menu: + +* Splitting Lines:: Breaking long recipe lines for readability. +* Variables in Recipes:: Using `make' variables in recipes. + + +File: make.info, Node: Splitting Lines, Next: Variables in Recipes, Prev: Recipe Syntax, Up: Recipe Syntax + +5.1.1 Splitting Recipe Lines +---------------------------- + +One of the few ways in which `make' does interpret recipes is checking +for a backslash just before the newline. As in normal makefile syntax, +a single logical recipe line can be split into multiple physical lines +in the makefile by placing a backslash before each newline. A sequence +of lines like this is considered a single recipe line, and one instance +of the shell will be invoked to run it. + + However, in contrast to how they are treated in other places in a +makefile, backslash-newline pairs are _not_ removed from the recipe. +Both the backslash and the newline characters are preserved and passed +to the shell. How the backslash-newline is interpreted depends on your +shell. If the first character of the next line after the +backslash-newline is the recipe prefix character (a tab by default; +*note Special Variables::), then that character (and only that +character) is removed. Whitespace is never added to the recipe. + + For example, the recipe for the all target in this makefile: + + all : + @echo no\ + space + @echo no\ + space + @echo one \ + space + @echo one\ + space + +consists of four separate shell commands where the output is: + + nospace + nospace + one space + one space + + As a more complex example, this makefile: + + all : ; @echo 'hello \ + world' ; echo "hello \ + world" + +will invoke one shell with a command of: + + echo 'hello \ + world' ; echo "hello \ + world" + +which, according to shell quoting rules, will yield the following +output: + + hello \ + world + hello world + +Notice how the backslash/newline pair was removed inside the string +quoted with double quotes (`"..."'), but not from the string quoted +with single quotes (`'...''). This is the way the default shell +(`/bin/sh') handles backslash/newline pairs. If you specify a +different shell in your makefiles it may treat them differently. + + Sometimes you want to split a long line inside of single quotes, but +you don't want the backslash-newline to appear in the quoted content. +This is often the case when passing scripts to languages such as Perl, +where extraneous backslashes inside the script can change its meaning +or even be a syntax error. One simple way of handling this is to place +the quoted string, or even the entire command, into a `make' variable +then use the variable in the recipe. In this situation the newline +quoting rules for makefiles will be used, and the backslash-newline +will be removed. If we rewrite our example above using this method: + + HELLO = 'hello \ + world' + + all : ; @echo $(HELLO) + +we will get output like this: + + hello world + + If you like, you can also use target-specific variables (*note +Target-specific Variable Values: Target-specific.) to obtain a tighter +correspondence between the variable and the recipe that uses it. + + +File: make.info, Node: Variables in Recipes, Prev: Splitting Lines, Up: Recipe Syntax + +5.1.2 Using Variables in Recipes +-------------------------------- + +The other way in which `make' processes recipes is by expanding any +variable references in them (*note Basics of Variable References: +Reference.). This occurs after make has finished reading all the +makefiles and the target is determined to be out of date; so, the +recipes for targets which are not rebuilt are never expanded. + + Variable and function references in recipes have identical syntax and +semantics to references elsewhere in the makefile. They also have the +same quoting rules: if you want a dollar sign to appear in your recipe, +you must double it (`$$'). For shells like the default shell, that use +dollar signs to introduce variables, it's important to keep clear in +your mind whether the variable you want to reference is a `make' +variable (use a single dollar sign) or a shell variable (use two dollar +signs). For example: + + LIST = one two three + all: + for i in $(LIST); do \ + echo $$i; \ + done + +results in the following command being passed to the shell: + + for i in one two three; do \ + echo $i; \ + done + +which generates the expected result: + + one + two + three + + +File: make.info, Node: Echoing, Next: Execution, Prev: Recipe Syntax, Up: Recipes + +5.2 Recipe Echoing +================== + +Normally `make' prints each line of the recipe before it is executed. +We call this "echoing" because it gives the appearance that you are +typing the lines yourself. + + When a line starts with `@', the echoing of that line is suppressed. +The `@' is discarded before the line is passed to the shell. Typically +you would use this for a command whose only effect is to print +something, such as an `echo' command to indicate progress through the +makefile: + + @echo About to make distribution files + + When `make' is given the flag `-n' or `--just-print' it only echoes +most recipes, without executing them. *Note Summary of Options: +Options Summary. In this case even the recipe lines starting with `@' +are printed. This flag is useful for finding out which recipes `make' +thinks are necessary without actually doing them. + + The `-s' or `--silent' flag to `make' prevents all echoing, as if +all recipes started with `@'. A rule in the makefile for the special +target `.SILENT' without prerequisites has the same effect (*note +Special Built-in Target Names: Special Targets.). `.SILENT' is +essentially obsolete since `@' is more flexible. + + +File: make.info, Node: Execution, Next: Parallel, Prev: Echoing, Up: Recipes + +5.3 Recipe Execution +==================== + +When it is time to execute recipes to update a target, they are +executed by invoking a new subshell for each line of the recipe, unless +the `.ONESHELL' special target is in effect (*note Using One Shell: One +Shell.) (In practice, `make' may take shortcuts that do not affect the +results.) + + *Please note:* this implies that setting shell variables and +invoking shell commands such as `cd' that set a context local to each +process will not affect the following lines in the recipe.(1) If you +want to use `cd' to affect the next statement, put both statements in a +single recipe line. Then `make' will invoke one shell to run the +entire line, and the shell will execute the statements in sequence. +For example: + + foo : bar/lose + cd $(@D) && gobble $(@F) > ../$@ + +Here we use the shell AND operator (`&&') so that if the `cd' command +fails, the script will fail without trying to invoke the `gobble' +command in the wrong directory, which could cause problems (in this +case it would certainly cause `../foo' to be truncated, at least). + +* Menu: + +* One Shell:: One shell for all lines in a recipe +* Choosing the Shell:: How `make' chooses the shell used + to run recipes. + + ---------- Footnotes ---------- + + (1) On MS-DOS, the value of current working directory is *global*, so +changing it _will_ affect the following recipe lines on those systems. + + +File: make.info, Node: One Shell, Next: Choosing the Shell, Prev: Execution, Up: Execution + +5.3.1 Using One Shell +--------------------- + +Sometimes you would prefer that all the lines in the recipe be passed +to a single invocation of the shell. There are generally two +situations where this is useful: first, it can improve performance in +makefiles where recipes consist of many command lines, by avoiding +extra processes. Second, you might want newlines to be included in +your recipe command (for example perhaps you are using a very different +interpreter as your `SHELL'). If the `.ONESHELL' special target +appears anywhere in the makefile then _all_ recipe lines for each +target will be provided to a single invocation of the shell. Newlines +between recipe lines will be preserved. For example: + + .ONESHELL: + foo : bar/lose + cd $(@D) + gobble $(@F) > ../$@ + +would now work as expected even though the commands are on different +recipe lines. + + If `.ONESHELL' is provided, then only the first line of the recipe +will be checked for the special prefix characters (`@', `-', and `+'). +Subsequent lines will include the special characters in the recipe line +when the `SHELL' is invoked. If you want your recipe to start with one +of these special characters you'll need to arrange for them to not be +the first characters on the first line, perhaps by adding a comment or +similar. For example, this would be a syntax error in Perl because the +first `@' is removed by make: + + .ONESHELL: + SHELL = /usr/bin/perl + .SHELLFLAGS = -e + show : + @f = qw(a b c); + print "@f\n"; + +However, either of these alternatives would work properly: + + .ONESHELL: + SHELL = /usr/bin/perl + .SHELLFLAGS = -e + show : + # Make sure "@" is not the first character on the first line + @f = qw(a b c); + print "@f\n"; + +or + + .ONESHELL: + SHELL = /usr/bin/perl + .SHELLFLAGS = -e + show : + my @f = qw(a b c); + print "@f\n"; + + As a special feature, if `SHELL' is determined to be a POSIX-style +shell, the special prefix characters in "internal" recipe lines will +_removed_ before the recipe is processed. This feature is intended to +allow existing makefiles to add the `.ONESHELL' special target and +still run properly without extensive modifications. Since the special +prefix characters are not legal at the beginning of a line in a POSIX +shell script this is not a loss in functionality. For example, this +works as expected: + + .ONESHELL: + foo : bar/lose + @cd $(@D) + @gobble $(@F) > ../$@ + + Even with this special feature, however, makefiles with `.ONESHELL' +will behave differently in ways that could be noticeable. For example, +normally if any line in the recipe fails, that causes the rule to fail +and no more recipe lines are processed. Under `.ONESHELL' a failure of +any but the final recipe line will not be noticed by `make'. You can +modify `.SHELLFLAGS' to add the `-e' option to the shell which will +cause any failure anywhere in the command line to cause the shell to +fail, but this could itself cause your recipe to behave differently. +Ultimately you may need to harden your recipe lines to allow them to +work with `.ONESHELL'. + + +File: make.info, Node: Choosing the Shell, Prev: One Shell, Up: Execution + +5.3.2 Choosing the Shell +------------------------ + +The program used as the shell is taken from the variable `SHELL'. If +this variable is not set in your makefile, the program `/bin/sh' is +used as the shell. The argument(s) passed to the shell are taken from +the variable `.SHELLFLAGS'. The default value of `.SHELLFLAGS' is `-c' +normally, or `-ec' in POSIX-conforming mode. + + Unlike most variables, the variable `SHELL' is never set from the +environment. This is because the `SHELL' environment variable is used +to specify your personal choice of shell program for interactive use. +It would be very bad for personal choices like this to affect the +functioning of makefiles. *Note Variables from the Environment: +Environment. + + Furthermore, when you do set `SHELL' in your makefile that value is +_not_ exported in the environment to recipe lines that `make' invokes. +Instead, the value inherited from the user's environment, if any, is +exported. You can override this behavior by explicitly exporting +`SHELL' (*note Communicating Variables to a Sub-`make': +Variables/Recursion.), forcing it to be passed in the environment to +recipe lines. + + However, on MS-DOS and MS-Windows the value of `SHELL' in the +environment *is* used, since on those systems most users do not set +this variable, and therefore it is most likely set specifically to be +used by `make'. On MS-DOS, if the setting of `SHELL' is not suitable +for `make', you can set the variable `MAKESHELL' to the shell that +`make' should use; if set it will be used as the shell instead of the +value of `SHELL'. + +Choosing a Shell in DOS and Windows +................................... + +Choosing a shell in MS-DOS and MS-Windows is much more complex than on +other systems. + + On MS-DOS, if `SHELL' is not set, the value of the variable +`COMSPEC' (which is always set) is used instead. + + The processing of lines that set the variable `SHELL' in Makefiles +is different on MS-DOS. The stock shell, `command.com', is +ridiculously limited in its functionality and many users of `make' tend +to install a replacement shell. Therefore, on MS-DOS, `make' examines +the value of `SHELL', and changes its behavior based on whether it +points to a Unix-style or DOS-style shell. This allows reasonable +functionality even if `SHELL' points to `command.com'. + + If `SHELL' points to a Unix-style shell, `make' on MS-DOS +additionally checks whether that shell can indeed be found; if not, it +ignores the line that sets `SHELL'. In MS-DOS, GNU `make' searches for +the shell in the following places: + + 1. In the precise place pointed to by the value of `SHELL'. For + example, if the makefile specifies `SHELL = /bin/sh', `make' will + look in the directory `/bin' on the current drive. + + 2. In the current directory. + + 3. In each of the directories in the `PATH' variable, in order. + + + In every directory it examines, `make' will first look for the +specific file (`sh' in the example above). If this is not found, it +will also look in that directory for that file with one of the known +extensions which identify executable files. For example `.exe', +`.com', `.bat', `.btm', `.sh', and some others. + + If any of these attempts is successful, the value of `SHELL' will be +set to the full pathname of the shell as found. However, if none of +these is found, the value of `SHELL' will not be changed, and thus the +line that sets it will be effectively ignored. This is so `make' will +only support features specific to a Unix-style shell if such a shell is +actually installed on the system where `make' runs. + + Note that this extended search for the shell is limited to the cases +where `SHELL' is set from the Makefile; if it is set in the environment +or command line, you are expected to set it to the full pathname of the +shell, exactly as things are on Unix. + + The effect of the above DOS-specific processing is that a Makefile +that contains `SHELL = /bin/sh' (as many Unix makefiles do), will work +on MS-DOS unaltered if you have e.g. `sh.exe' installed in some +directory along your `PATH'. + + +File: make.info, Node: Parallel, Next: Errors, Prev: Execution, Up: Recipes + +5.4 Parallel Execution +====================== + +GNU `make' knows how to execute several recipes at once. Normally, +`make' will execute only one recipe at a time, waiting for it to finish +before executing the next. However, the `-j' or `--jobs' option tells +`make' to execute many recipes simultaneously. You can inhibit +parallelism in a particular makefile with the `.NOTPARALLEL' +pseudo-target (*note Special Built-in Target Names: Special Targets.). + + On MS-DOS, the `-j' option has no effect, since that system doesn't +support multi-processing. + + If the `-j' option is followed by an integer, this is the number of +recipes to execute at once; this is called the number of "job slots". +If there is nothing looking like an integer after the `-j' option, +there is no limit on the number of job slots. The default number of job +slots is one, which means serial execution (one thing at a time). + + One unpleasant consequence of running several recipes simultaneously +is that output generated by the recipes appears whenever each recipe +sends it, so messages from different recipes may be interspersed. + + Another problem is that two processes cannot both take input from the +same device; so to make sure that only one recipe tries to take input +from the terminal at once, `make' will invalidate the standard input +streams of all but one running recipe. This means that attempting to +read from standard input will usually be a fatal error (a `Broken pipe' +signal) for most child processes if there are several. + + It is unpredictable which recipe will have a valid standard input +stream (which will come from the terminal, or wherever you redirect the +standard input of `make'). The first recipe run will always get it +first, and the first recipe started after that one finishes will get it +next, and so on. + + We will change how this aspect of `make' works if we find a better +alternative. In the mean time, you should not rely on any recipe using +standard input at all if you are using the parallel execution feature; +but if you are not using this feature, then standard input works +normally in all recipes. + + Finally, handling recursive `make' invocations raises issues. For +more information on this, see *note Communicating Options to a +Sub-`make': Options/Recursion. + + If a recipe fails (is killed by a signal or exits with a nonzero +status), and errors are not ignored for that recipe (*note Errors in +Recipes: Errors.), the remaining recipe lines to remake the same target +will not be run. If a recipe fails and the `-k' or `--keep-going' +option was not given (*note Summary of Options: Options Summary.), +`make' aborts execution. If make terminates for any reason (including +a signal) with child processes running, it waits for them to finish +before actually exiting. + + When the system is heavily loaded, you will probably want to run +fewer jobs than when it is lightly loaded. You can use the `-l' option +to tell `make' to limit the number of jobs to run at once, based on the +load average. The `-l' or `--max-load' option is followed by a +floating-point number. For example, + + -l 2.5 + +will not let `make' start more than one job if the load average is +above 2.5. The `-l' option with no following number removes the load +limit, if one was given with a previous `-l' option. + + More precisely, when `make' goes to start up a job, and it already +has at least one job running, it checks the current load average; if it +is not lower than the limit given with `-l', `make' waits until the load +average goes below that limit, or until all the other jobs finish. + + By default, there is no load limit. + + +File: make.info, Node: Errors, Next: Interrupts, Prev: Parallel, Up: Recipes + +5.5 Errors in Recipes +===================== + +After each shell invocation returns, `make' looks at its exit status. +If the shell completed successfully (the exit status is zero), the next +line in the recipe is executed in a new shell; after the last line is +finished, the rule is finished. + + If there is an error (the exit status is nonzero), `make' gives up on +the current rule, and perhaps on all rules. + + Sometimes the failure of a certain recipe line does not indicate a +problem. For example, you may use the `mkdir' command to ensure that a +directory exists. If the directory already exists, `mkdir' will report +an error, but you probably want `make' to continue regardless. + + To ignore errors in a recipe line, write a `-' at the beginning of +the line's text (after the initial tab). The `-' is discarded before +the line is passed to the shell for execution. + + For example, + + clean: + -rm -f *.o + +This causes `make' to continue even if `rm' is unable to remove a file. + + When you run `make' with the `-i' or `--ignore-errors' flag, errors +are ignored in all recipes of all rules. A rule in the makefile for +the special target `.IGNORE' has the same effect, if there are no +prerequisites. These ways of ignoring errors are obsolete because `-' +is more flexible. + + When errors are to be ignored, because of either a `-' or the `-i' +flag, `make' treats an error return just like success, except that it +prints out a message that tells you the status code the shell exited +with, and says that the error has been ignored. + + When an error happens that `make' has not been told to ignore, it +implies that the current target cannot be correctly remade, and neither +can any other that depends on it either directly or indirectly. No +further recipes will be executed for these targets, since their +preconditions have not been achieved. + + Normally `make' gives up immediately in this circumstance, returning +a nonzero status. However, if the `-k' or `--keep-going' flag is +specified, `make' continues to consider the other prerequisites of the +pending targets, remaking them if necessary, before it gives up and +returns nonzero status. For example, after an error in compiling one +object file, `make -k' will continue compiling other object files even +though it already knows that linking them will be impossible. *Note +Summary of Options: Options Summary. + + The usual behavior assumes that your purpose is to get the specified +targets up to date; once `make' learns that this is impossible, it +might as well report the failure immediately. The `-k' option says +that the real purpose is to test as many of the changes made in the +program as possible, perhaps to find several independent problems so +that you can correct them all before the next attempt to compile. This +is why Emacs' `compile' command passes the `-k' flag by default. + + Usually when a recipe line fails, if it has changed the target file +at all, the file is corrupted and cannot be used--or at least it is not +completely updated. Yet the file's time stamp says that it is now up to +date, so the next time `make' runs, it will not try to update that +file. The situation is just the same as when the shell is killed by a +signal; *note Interrupts::. So generally the right thing to do is to +delete the target file if the recipe fails after beginning to change +the file. `make' will do this if `.DELETE_ON_ERROR' appears as a +target. This is almost always what you want `make' to do, but it is +not historical practice; so for compatibility, you must explicitly +request it. + + +File: make.info, Node: Interrupts, Next: Recursion, Prev: Errors, Up: Recipes + +5.6 Interrupting or Killing `make' +================================== + +If `make' gets a fatal signal while a shell is executing, it may delete +the target file that the recipe was supposed to update. This is done +if the target file's last-modification time has changed since `make' +first checked it. + + The purpose of deleting the target is to make sure that it is remade +from scratch when `make' is next run. Why is this? Suppose you type +`Ctrl-c' while a compiler is running, and it has begun to write an +object file `foo.o'. The `Ctrl-c' kills the compiler, resulting in an +incomplete file whose last-modification time is newer than the source +file `foo.c'. But `make' also receives the `Ctrl-c' signal and deletes +this incomplete file. If `make' did not do this, the next invocation +of `make' would think that `foo.o' did not require updating--resulting +in a strange error message from the linker when it tries to link an +object file half of which is missing. + + You can prevent the deletion of a target file in this way by making +the special target `.PRECIOUS' depend on it. Before remaking a target, +`make' checks to see whether it appears on the prerequisites of +`.PRECIOUS', and thereby decides whether the target should be deleted +if a signal happens. Some reasons why you might do this are that the +target is updated in some atomic fashion, or exists only to record a +modification-time (its contents do not matter), or must exist at all +times to prevent other sorts of trouble. + + +File: make.info, Node: Recursion, Next: Canned Recipes, Prev: Interrupts, Up: Recipes + +5.7 Recursive Use of `make' +=========================== + +Recursive use of `make' means using `make' as a command in a makefile. +This technique is useful when you want separate makefiles for various +subsystems that compose a larger system. For example, suppose you have +a subdirectory `subdir' which has its own makefile, and you would like +the containing directory's makefile to run `make' on the subdirectory. +You can do it by writing this: + + subsystem: + cd subdir && $(MAKE) + +or, equivalently, this (*note Summary of Options: Options Summary.): + + subsystem: + $(MAKE) -C subdir + + You can write recursive `make' commands just by copying this example, +but there are many things to know about how they work and why, and about +how the sub-`make' relates to the top-level `make'. You may also find +it useful to declare targets that invoke recursive `make' commands as +`.PHONY' (for more discussion on when this is useful, see *note Phony +Targets::). + + For your convenience, when GNU `make' starts (after it has processed +any `-C' options) it sets the variable `CURDIR' to the pathname of the +current working directory. This value is never touched by `make' +again: in particular note that if you include files from other +directories the value of `CURDIR' does not change. The value has the +same precedence it would have if it were set in the makefile (by +default, an environment variable `CURDIR' will not override this +value). Note that setting this variable has no impact on the operation +of `make' (it does not cause `make' to change its working directory, +for example). + +* Menu: + +* MAKE Variable:: The special effects of using `$(MAKE)'. +* Variables/Recursion:: How to communicate variables to a sub-`make'. +* Options/Recursion:: How to communicate options to a sub-`make'. +* -w Option:: How the `-w' or `--print-directory' option + helps debug use of recursive `make' commands. + + +File: make.info, Node: MAKE Variable, Next: Variables/Recursion, Prev: Recursion, Up: Recursion + +5.7.1 How the `MAKE' Variable Works +----------------------------------- + +Recursive `make' commands should always use the variable `MAKE', not +the explicit command name `make', as shown here: + + subsystem: + cd subdir && $(MAKE) + + The value of this variable is the file name with which `make' was +invoked. If this file name was `/bin/make', then the recipe executed +is `cd subdir && /bin/make'. If you use a special version of `make' to +run the top-level makefile, the same special version will be executed +for recursive invocations. + + As a special feature, using the variable `MAKE' in the recipe of a +rule alters the effects of the `-t' (`--touch'), `-n' (`--just-print'), +or `-q' (`--question') option. Using the `MAKE' variable has the same +effect as using a `+' character at the beginning of the recipe line. +*Note Instead of Executing the Recipes: Instead of Execution. This +special feature is only enabled if the `MAKE' variable appears directly +in the recipe: it does not apply if the `MAKE' variable is referenced +through expansion of another variable. In the latter case you must use +the `+' token to get these special effects. + + Consider the command `make -t' in the above example. (The `-t' +option marks targets as up to date without actually running any +recipes; see *note Instead of Execution::.) Following the usual +definition of `-t', a `make -t' command in the example would create a +file named `subsystem' and do nothing else. What you really want it to +do is run `cd subdir && make -t'; but that would require executing the +recipe, and `-t' says not to execute recipes. + + The special feature makes this do what you want: whenever a recipe +line of a rule contains the variable `MAKE', the flags `-t', `-n' and +`-q' do not apply to that line. Recipe lines containing `MAKE' are +executed normally despite the presence of a flag that causes most +recipes not to be run. The usual `MAKEFLAGS' mechanism passes the +flags to the sub-`make' (*note Communicating Options to a Sub-`make': +Options/Recursion.), so your request to touch the files, or print the +recipes, is propagated to the subsystem. + + +File: make.info, Node: Variables/Recursion, Next: Options/Recursion, Prev: MAKE Variable, Up: Recursion + +5.7.2 Communicating Variables to a Sub-`make' +--------------------------------------------- + +Variable values of the top-level `make' can be passed to the sub-`make' +through the environment by explicit request. These variables are +defined in the sub-`make' as defaults, but do not override what is +specified in the makefile used by the sub-`make' makefile unless you +use the `-e' switch (*note Summary of Options: Options Summary.). + + To pass down, or "export", a variable, `make' adds the variable and +its value to the environment for running each line of the recipe. The +sub-`make', in turn, uses the environment to initialize its table of +variable values. *Note Variables from the Environment: Environment. + + Except by explicit request, `make' exports a variable only if it is +either defined in the environment initially or set on the command line, +and if its name consists only of letters, numbers, and underscores. +Some shells cannot cope with environment variable names consisting of +characters other than letters, numbers, and underscores. + + The value of the `make' variable `SHELL' is not exported. Instead, +the value of the `SHELL' variable from the invoking environment is +passed to the sub-`make'. You can force `make' to export its value for +`SHELL' by using the `export' directive, described below. *Note +Choosing the Shell::. + + The special variable `MAKEFLAGS' is always exported (unless you +unexport it). `MAKEFILES' is exported if you set it to anything. + + `make' automatically passes down variable values that were defined +on the command line, by putting them in the `MAKEFLAGS' variable. +*Note Options/Recursion::. + + Variables are _not_ normally passed down if they were created by +default by `make' (*note Variables Used by Implicit Rules: Implicit +Variables.). The sub-`make' will define these for itself. + + If you want to export specific variables to a sub-`make', use the +`export' directive, like this: + + export VARIABLE ... + +If you want to _prevent_ a variable from being exported, use the +`unexport' directive, like this: + + unexport VARIABLE ... + +In both of these forms, the arguments to `export' and `unexport' are +expanded, and so could be variables or functions which expand to a +(list of) variable names to be (un)exported. + + As a convenience, you can define a variable and export it at the same +time by doing: + + export VARIABLE = value + +has the same result as: + + VARIABLE = value + export VARIABLE + +and + + export VARIABLE := value + +has the same result as: + + VARIABLE := value + export VARIABLE + + Likewise, + + export VARIABLE += value + +is just like: + + VARIABLE += value + export VARIABLE + +*Note Appending More Text to Variables: Appending. + + You may notice that the `export' and `unexport' directives work in +`make' in the same way they work in the shell, `sh'. + + If you want all variables to be exported by default, you can use +`export' by itself: + + export + +This tells `make' that variables which are not explicitly mentioned in +an `export' or `unexport' directive should be exported. Any variable +given in an `unexport' directive will still _not_ be exported. If you +use `export' by itself to export variables by default, variables whose +names contain characters other than alphanumerics and underscores will +not be exported unless specifically mentioned in an `export' directive. + + The behavior elicited by an `export' directive by itself was the +default in older versions of GNU `make'. If your makefiles depend on +this behavior and you want to be compatible with old versions of +`make', you can write a rule for the special target +`.EXPORT_ALL_VARIABLES' instead of using the `export' directive. This +will be ignored by old `make's, while the `export' directive will cause +a syntax error. + + Likewise, you can use `unexport' by itself to tell `make' _not_ to +export variables by default. Since this is the default behavior, you +would only need to do this if `export' had been used by itself earlier +(in an included makefile, perhaps). You *cannot* use `export' and +`unexport' by themselves to have variables exported for some recipes +and not for others. The last `export' or `unexport' directive that +appears by itself determines the behavior for the entire run of `make'. + + As a special feature, the variable `MAKELEVEL' is changed when it is +passed down from level to level. This variable's value is a string +which is the depth of the level as a decimal number. The value is `0' +for the top-level `make'; `1' for a sub-`make', `2' for a +sub-sub-`make', and so on. The incrementation happens when `make' sets +up the environment for a recipe. + + The main use of `MAKELEVEL' is to test it in a conditional directive +(*note Conditional Parts of Makefiles: Conditionals.); this way you can +write a makefile that behaves one way if run recursively and another +way if run directly by you. + + You can use the variable `MAKEFILES' to cause all sub-`make' +commands to use additional makefiles. The value of `MAKEFILES' is a +whitespace-separated list of file names. This variable, if defined in +the outer-level makefile, is passed down through the environment; then +it serves as a list of extra makefiles for the sub-`make' to read +before the usual or specified ones. *Note The Variable `MAKEFILES': +MAKEFILES Variable. + + +File: make.info, Node: Options/Recursion, Next: -w Option, Prev: Variables/Recursion, Up: Recursion + +5.7.3 Communicating Options to a Sub-`make' +------------------------------------------- + +Flags such as `-s' and `-k' are passed automatically to the sub-`make' +through the variable `MAKEFLAGS'. This variable is set up +automatically by `make' to contain the flag letters that `make' +received. Thus, if you do `make -ks' then `MAKEFLAGS' gets the value +`ks'. + + As a consequence, every sub-`make' gets a value for `MAKEFLAGS' in +its environment. In response, it takes the flags from that value and +processes them as if they had been given as arguments. *Note Summary +of Options: Options Summary. + + Likewise variables defined on the command line are passed to the +sub-`make' through `MAKEFLAGS'. Words in the value of `MAKEFLAGS' that +contain `=', `make' treats as variable definitions just as if they +appeared on the command line. *Note Overriding Variables: Overriding. + + The options `-C', `-f', `-o', and `-W' are not put into `MAKEFLAGS'; +these options are not passed down. + + The `-j' option is a special case (*note Parallel Execution: +Parallel.). If you set it to some numeric value `N' and your operating +system supports it (most any UNIX system will; others typically won't), +the parent `make' and all the sub-`make's will communicate to ensure +that there are only `N' jobs running at the same time between them all. +Note that any job that is marked recursive (*note Instead of Executing +Recipes: Instead of Execution.) doesn't count against the total jobs +(otherwise we could get `N' sub-`make's running and have no slots left +over for any real work!) + + If your operating system doesn't support the above communication, +then `-j 1' is always put into `MAKEFLAGS' instead of the value you +specified. This is because if the `-j' option were passed down to +sub-`make's, you would get many more jobs running in parallel than you +asked for. If you give `-j' with no numeric argument, meaning to run +as many jobs as possible in parallel, this is passed down, since +multiple infinities are no more than one. + + If you do not want to pass the other flags down, you must change the +value of `MAKEFLAGS', like this: + + subsystem: + cd subdir && $(MAKE) MAKEFLAGS= + + The command line variable definitions really appear in the variable +`MAKEOVERRIDES', and `MAKEFLAGS' contains a reference to this variable. +If you do want to pass flags down normally, but don't want to pass down +the command line variable definitions, you can reset `MAKEOVERRIDES' to +empty, like this: + + MAKEOVERRIDES = + +This is not usually useful to do. However, some systems have a small +fixed limit on the size of the environment, and putting so much +information into the value of `MAKEFLAGS' can exceed it. If you see +the error message `Arg list too long', this may be the problem. (For +strict compliance with POSIX.2, changing `MAKEOVERRIDES' does not +affect `MAKEFLAGS' if the special target `.POSIX' appears in the +makefile. You probably do not care about this.) + + A similar variable `MFLAGS' exists also, for historical +compatibility. It has the same value as `MAKEFLAGS' except that it +does not contain the command line variable definitions, and it always +begins with a hyphen unless it is empty (`MAKEFLAGS' begins with a +hyphen only when it begins with an option that has no single-letter +version, such as `--warn-undefined-variables'). `MFLAGS' was +traditionally used explicitly in the recursive `make' command, like +this: + + subsystem: + cd subdir && $(MAKE) $(MFLAGS) + +but now `MAKEFLAGS' makes this usage redundant. If you want your +makefiles to be compatible with old `make' programs, use this +technique; it will work fine with more modern `make' versions too. + + The `MAKEFLAGS' variable can also be useful if you want to have +certain options, such as `-k' (*note Summary of Options: Options +Summary.), set each time you run `make'. You simply put a value for +`MAKEFLAGS' in your environment. You can also set `MAKEFLAGS' in a +makefile, to specify additional flags that should also be in effect for +that makefile. (Note that you cannot use `MFLAGS' this way. That +variable is set only for compatibility; `make' does not interpret a +value you set for it in any way.) + + When `make' interprets the value of `MAKEFLAGS' (either from the +environment or from a makefile), it first prepends a hyphen if the value +does not already begin with one. Then it chops the value into words +separated by blanks, and parses these words as if they were options +given on the command line (except that `-C', `-f', `-h', `-o', `-W', +and their long-named versions are ignored; and there is no error for an +invalid option). + + If you do put `MAKEFLAGS' in your environment, you should be sure not +to include any options that will drastically affect the actions of +`make' and undermine the purpose of makefiles and of `make' itself. +For instance, the `-t', `-n', and `-q' options, if put in one of these +variables, could have disastrous consequences and would certainly have +at least surprising and probably annoying effects. + + +File: make.info, Node: -w Option, Prev: Options/Recursion, Up: Recursion + +5.7.4 The `--print-directory' Option +------------------------------------ + +If you use several levels of recursive `make' invocations, the `-w' or +`--print-directory' option can make the output a lot easier to +understand by showing each directory as `make' starts processing it and +as `make' finishes processing it. For example, if `make -w' is run in +the directory `/u/gnu/make', `make' will print a line of the form: + + make: Entering directory `/u/gnu/make'. + +before doing anything else, and a line of the form: + + make: Leaving directory `/u/gnu/make'. + +when processing is completed. + + Normally, you do not need to specify this option because `make' does +it for you: `-w' is turned on automatically when you use the `-C' +option, and in sub-`make's. `make' will not automatically turn on `-w' +if you also use `-s', which says to be silent, or if you use +`--no-print-directory' to explicitly disable it. + + +File: make.info, Node: Canned Recipes, Next: Empty Recipes, Prev: Recursion, Up: Recipes + +5.8 Defining Canned Recipes +=========================== + +When the same sequence of commands is useful in making various targets, +you can define it as a canned sequence with the `define' directive, and +refer to the canned sequence from the recipes for those targets. The +canned sequence is actually a variable, so the name must not conflict +with other variable names. + + Here is an example of defining a canned recipe: + + define run-yacc = + yacc $(firstword $^) + mv y.tab.c $@ + endef + +Here `run-yacc' is the name of the variable being defined; `endef' +marks the end of the definition; the lines in between are the commands. +The `define' directive does not expand variable references and function +calls in the canned sequence; the `$' characters, parentheses, variable +names, and so on, all become part of the value of the variable you are +defining. *Note Defining Multi-Line Variables: Multi-Line, for a +complete explanation of `define'. + + The first command in this example runs Yacc on the first +prerequisite of whichever rule uses the canned sequence. The output +file from Yacc is always named `y.tab.c'. The second command moves the +output to the rule's target file name. + + To use the canned sequence, substitute the variable into the recipe +of a rule. You can substitute it like any other variable (*note Basics +of Variable References: Reference.). Because variables defined by +`define' are recursively expanded variables, all the variable +references you wrote inside the `define' are expanded now. For example: + + foo.c : foo.y + $(run-yacc) + +`foo.y' will be substituted for the variable `$^' when it occurs in +`run-yacc''s value, and `foo.c' for `$@'. + + This is a realistic example, but this particular one is not needed in +practice because `make' has an implicit rule to figure out these +commands based on the file names involved (*note Using Implicit Rules: +Implicit Rules.). + + In recipe execution, each line of a canned sequence is treated just +as if the line appeared on its own in the rule, preceded by a tab. In +particular, `make' invokes a separate subshell for each line. You can +use the special prefix characters that affect command lines (`@', `-', +and `+') on each line of a canned sequence. *Note Writing Recipes in +Rules: Recipes. For example, using this canned sequence: + + define frobnicate = + @echo "frobnicating target $@" + frob-step-1 $< -o $@-step-1 + frob-step-2 $@-step-1 -o $@ + endef + +`make' will not echo the first line, the `echo' command. But it _will_ +echo the following two recipe lines. + + On the other hand, prefix characters on the recipe line that refers +to a canned sequence apply to every line in the sequence. So the rule: + + frob.out: frob.in + @$(frobnicate) + +does not echo _any_ recipe lines. (*Note Recipe Echoing: Echoing, for +a full explanation of `@'.) + + +File: make.info, Node: Empty Recipes, Prev: Canned Recipes, Up: Recipes + +5.9 Using Empty Recipes +======================= + +It is sometimes useful to define recipes which do nothing. This is done +simply by giving a recipe that consists of nothing but whitespace. For +example: + + target: ; + +defines an empty recipe for `target'. You could also use a line +beginning with a recipe prefix character to define an empty recipe, but +this would be confusing because such a line looks empty. + + You may be wondering why you would want to define a recipe that does +nothing. The only reason this is useful is to prevent a target from +getting implicit recipes (from implicit rules or the `.DEFAULT' special +target; *note Implicit Rules:: and *note Defining Last-Resort Default +Rules: Last Resort.). + + You may be inclined to define empty recipes for targets that are not +actual files, but only exist so that their prerequisites can be remade. +However, this is not the best way to do that, because the prerequisites +may not be remade properly if the target file actually does exist. +*Note Phony Targets: Phony Targets, for a better way to do this. + + +File: make.info, Node: Using Variables, Next: Conditionals, Prev: Recipes, Up: Top + +6 How to Use Variables +********************** + +A "variable" is a name defined in a makefile to represent a string of +text, called the variable's "value". These values are substituted by +explicit request into targets, prerequisites, recipes, and other parts +of the makefile. (In some other versions of `make', variables are +called "macros".) + + Variables and functions in all parts of a makefile are expanded when +read, except for in recipes, the right-hand sides of variable +definitions using `=', and the bodies of variable definitions using the +`define' directive. + + Variables can represent lists of file names, options to pass to +compilers, programs to run, directories to look in for source files, +directories to write output in, or anything else you can imagine. + + A variable name may be any sequence of characters not containing `:', +`#', `=', or leading or trailing whitespace. However, variable names +containing characters other than letters, numbers, and underscores +should be avoided, as they may be given special meanings in the future, +and with some shells they cannot be passed through the environment to a +sub-`make' (*note Communicating Variables to a Sub-`make': +Variables/Recursion.). + + Variable names are case-sensitive. The names `foo', `FOO', and +`Foo' all refer to different variables. + + It is traditional to use upper case letters in variable names, but we +recommend using lower case letters for variable names that serve +internal purposes in the makefile, and reserving upper case for +parameters that control implicit rules or for parameters that the user +should override with command options (*note Overriding Variables: +Overriding.). + + A few variables have names that are a single punctuation character or +just a few characters. These are the "automatic variables", and they +have particular specialized uses. *Note Automatic Variables::. + +* Menu: + +* Reference:: How to use the value of a variable. +* Flavors:: Variables come in two flavors. +* Advanced:: Advanced features for referencing a variable. +* Values:: All the ways variables get their values. +* Setting:: How to set a variable in the makefile. +* Appending:: How to append more text to the old value + of a variable. +* Override Directive:: How to set a variable in the makefile even if + the user has set it with a command argument. +* Multi-Line:: An alternate way to set a variable + to a multi-line string. +* Undefine Directive:: How to undefine a variable so that it appears + as if it was never set. +* Environment:: Variable values can come from the environment. +* Target-specific:: Variable values can be defined on a per-target + basis. +* Pattern-specific:: Target-specific variable values can be applied + to a group of targets that match a pattern. +* Suppressing Inheritance:: Suppress inheritance of variables. +* Special Variables:: Variables with special meaning or behavior. + + +File: make.info, Node: Reference, Next: Flavors, Prev: Using Variables, Up: Using Variables + +6.1 Basics of Variable References +================================= + +To substitute a variable's value, write a dollar sign followed by the +name of the variable in parentheses or braces: either `$(foo)' or +`${foo}' is a valid reference to the variable `foo'. This special +significance of `$' is why you must write `$$' to have the effect of a +single dollar sign in a file name or recipe. + + Variable references can be used in any context: targets, +prerequisites, recipes, most directives, and new variable values. Here +is an example of a common case, where a variable holds the names of all +the object files in a program: + + objects = program.o foo.o utils.o + program : $(objects) + cc -o program $(objects) + + $(objects) : defs.h + + Variable references work by strict textual substitution. Thus, the +rule + + foo = c + prog.o : prog.$(foo) + $(foo)$(foo) -$(foo) prog.$(foo) + +could be used to compile a C program `prog.c'. Since spaces before the +variable value are ignored in variable assignments, the value of `foo' +is precisely `c'. (Don't actually write your makefiles this way!) + + A dollar sign followed by a character other than a dollar sign, +open-parenthesis or open-brace treats that single character as the +variable name. Thus, you could reference the variable `x' with `$x'. +However, this practice is strongly discouraged, except in the case of +the automatic variables (*note Automatic Variables::). + + +File: make.info, Node: Flavors, Next: Advanced, Prev: Reference, Up: Using Variables + +6.2 The Two Flavors of Variables +================================ + +There are two ways that a variable in GNU `make' can have a value; we +call them the two "flavors" of variables. The two flavors are +distinguished in how they are defined and in what they do when expanded. + + The first flavor of variable is a "recursively expanded" variable. +Variables of this sort are defined by lines using `=' (*note Setting +Variables: Setting.) or by the `define' directive (*note Defining +Multi-Line Variables: Multi-Line.). The value you specify is installed +verbatim; if it contains references to other variables, these +references are expanded whenever this variable is substituted (in the +course of expanding some other string). When this happens, it is +called "recursive expansion". + + For example, + + foo = $(bar) + bar = $(ugh) + ugh = Huh? + + all:;echo $(foo) + +will echo `Huh?': `$(foo)' expands to `$(bar)' which expands to +`$(ugh)' which finally expands to `Huh?'. + + This flavor of variable is the only sort supported by other versions +of `make'. It has its advantages and its disadvantages. An advantage +(most would say) is that: + + CFLAGS = $(include_dirs) -O + include_dirs = -Ifoo -Ibar + +will do what was intended: when `CFLAGS' is expanded in a recipe, it +will expand to `-Ifoo -Ibar -O'. A major disadvantage is that you +cannot append something on the end of a variable, as in + + CFLAGS = $(CFLAGS) -O + +because it will cause an infinite loop in the variable expansion. +(Actually `make' detects the infinite loop and reports an error.) + + Another disadvantage is that any functions (*note Functions for +Transforming Text: Functions.) referenced in the definition will be +executed every time the variable is expanded. This makes `make' run +slower; worse, it causes the `wildcard' and `shell' functions to give +unpredictable results because you cannot easily control when they are +called, or even how many times. + + To avoid all the problems and inconveniences of recursively expanded +variables, there is another flavor: simply expanded variables. + + "Simply expanded variables" are defined by lines using `:=' (*note +Setting Variables: Setting.). The value of a simply expanded variable +is scanned once and for all, expanding any references to other +variables and functions, when the variable is defined. The actual +value of the simply expanded variable is the result of expanding the +text that you write. It does not contain any references to other +variables; it contains their values _as of the time this variable was +defined_. Therefore, + + x := foo + y := $(x) bar + x := later + +is equivalent to + + y := foo bar + x := later + + When a simply expanded variable is referenced, its value is +substituted verbatim. + + Here is a somewhat more complicated example, illustrating the use of +`:=' in conjunction with the `shell' function. (*Note The `shell' +Function: Shell Function.) This example also shows use of the variable +`MAKELEVEL', which is changed when it is passed down from level to +level. (*Note Communicating Variables to a Sub-`make': +Variables/Recursion, for information about `MAKELEVEL'.) + + ifeq (0,${MAKELEVEL}) + whoami := $(shell whoami) + host-type := $(shell arch) + MAKE := ${MAKE} host-type=${host-type} whoami=${whoami} + endif + +An advantage of this use of `:=' is that a typical `descend into a +directory' recipe then looks like this: + + ${subdirs}: + ${MAKE} -C $@ all + + Simply expanded variables generally make complicated makefile +programming more predictable because they work like variables in most +programming languages. They allow you to redefine a variable using its +own value (or its value processed in some way by one of the expansion +functions) and to use the expansion functions much more efficiently +(*note Functions for Transforming Text: Functions.). + + You can also use them to introduce controlled leading whitespace into +variable values. Leading whitespace characters are discarded from your +input before substitution of variable references and function calls; +this means you can include leading spaces in a variable value by +protecting them with variable references, like this: + + nullstring := + space := $(nullstring) # end of the line + +Here the value of the variable `space' is precisely one space. The +comment `# end of the line' is included here just for clarity. Since +trailing space characters are _not_ stripped from variable values, just +a space at the end of the line would have the same effect (but be +rather hard to read). If you put whitespace at the end of a variable +value, it is a good idea to put a comment like that at the end of the +line to make your intent clear. Conversely, if you do _not_ want any +whitespace characters at the end of your variable value, you must +remember not to put a random comment on the end of the line after some +whitespace, such as this: + + dir := /foo/bar # directory to put the frobs in + +Here the value of the variable `dir' is `/foo/bar ' (with four +trailing spaces), which was probably not the intention. (Imagine +something like `$(dir)/file' with this definition!) + + There is another assignment operator for variables, `?='. This is +called a conditional variable assignment operator, because it only has +an effect if the variable is not yet defined. This statement: + + FOO ?= bar + +is exactly equivalent to this (*note The `origin' Function: Origin +Function.): + + ifeq ($(origin FOO), undefined) + FOO = bar + endif + + Note that a variable set to an empty value is still defined, so `?=' +will not set that variable. + + +File: make.info, Node: Advanced, Next: Values, Prev: Flavors, Up: Using Variables + +6.3 Advanced Features for Reference to Variables +================================================ + +This section describes some advanced features you can use to reference +variables in more flexible ways. + +* Menu: + +* Substitution Refs:: Referencing a variable with + substitutions on the value. +* Computed Names:: Computing the name of the variable to refer to. + + +File: make.info, Node: Substitution Refs, Next: Computed Names, Prev: Advanced, Up: Advanced + +6.3.1 Substitution References +----------------------------- + +A "substitution reference" substitutes the value of a variable with +alterations that you specify. It has the form `$(VAR:A=B)' (or +`${VAR:A=B}') and its meaning is to take the value of the variable VAR, +replace every A at the end of a word with B in that value, and +substitute the resulting string. + + When we say "at the end of a word", we mean that A must appear +either followed by whitespace or at the end of the value in order to be +replaced; other occurrences of A in the value are unaltered. For +example: + + foo := a.o b.o c.o + bar := $(foo:.o=.c) + +sets `bar' to `a.c b.c c.c'. *Note Setting Variables: Setting. + + A substitution reference is actually an abbreviation for use of the +`patsubst' expansion function (*note Functions for String Substitution +and Analysis: Text Functions.). We provide substitution references as +well as `patsubst' for compatibility with other implementations of +`make'. + + Another type of substitution reference lets you use the full power of +the `patsubst' function. It has the same form `$(VAR:A=B)' described +above, except that now A must contain a single `%' character. This +case is equivalent to `$(patsubst A,B,$(VAR))'. *Note Functions for +String Substitution and Analysis: Text Functions, for a description of +the `patsubst' function. + +For example: + + foo := a.o b.o c.o + bar := $(foo:%.o=%.c) + +sets `bar' to `a.c b.c c.c'. + + +File: make.info, Node: Computed Names, Prev: Substitution Refs, Up: Advanced + +6.3.2 Computed Variable Names +----------------------------- + +Computed variable names are a complicated concept needed only for +sophisticated makefile programming. For most purposes you need not +consider them, except to know that making a variable with a dollar sign +in its name might have strange results. However, if you are the type +that wants to understand everything, or you are actually interested in +what they do, read on. + + Variables may be referenced inside the name of a variable. This is +called a "computed variable name" or a "nested variable reference". +For example, + + x = y + y = z + a := $($(x)) + +defines `a' as `z': the `$(x)' inside `$($(x))' expands to `y', so +`$($(x))' expands to `$(y)' which in turn expands to `z'. Here the +name of the variable to reference is not stated explicitly; it is +computed by expansion of `$(x)'. The reference `$(x)' here is nested +within the outer variable reference. + + The previous example shows two levels of nesting, but any number of +levels is possible. For example, here are three levels: + + x = y + y = z + z = u + a := $($($(x))) + +Here the innermost `$(x)' expands to `y', so `$($(x))' expands to +`$(y)' which in turn expands to `z'; now we have `$(z)', which becomes +`u'. + + References to recursively-expanded variables within a variable name +are reexpanded in the usual fashion. For example: + + x = $(y) + y = z + z = Hello + a := $($(x)) + +defines `a' as `Hello': `$($(x))' becomes `$($(y))' which becomes +`$(z)' which becomes `Hello'. + + Nested variable references can also contain modified references and +function invocations (*note Functions for Transforming Text: +Functions.), just like any other reference. For example, using the +`subst' function (*note Functions for String Substitution and Analysis: +Text Functions.): + + x = variable1 + variable2 := Hello + y = $(subst 1,2,$(x)) + z = y + a := $($($(z))) + +eventually defines `a' as `Hello'. It is doubtful that anyone would +ever want to write a nested reference as convoluted as this one, but it +works: `$($($(z)))' expands to `$($(y))' which becomes `$($(subst +1,2,$(x)))'. This gets the value `variable1' from `x' and changes it +by substitution to `variable2', so that the entire string becomes +`$(variable2)', a simple variable reference whose value is `Hello'. + + A computed variable name need not consist entirely of a single +variable reference. It can contain several variable references, as +well as some invariant text. For example, + + a_dirs := dira dirb + 1_dirs := dir1 dir2 + + a_files := filea fileb + 1_files := file1 file2 + + ifeq "$(use_a)" "yes" + a1 := a + else + a1 := 1 + endif + + ifeq "$(use_dirs)" "yes" + df := dirs + else + df := files + endif + + dirs := $($(a1)_$(df)) + +will give `dirs' the same value as `a_dirs', `1_dirs', `a_files' or +`1_files' depending on the settings of `use_a' and `use_dirs'. + + Computed variable names can also be used in substitution references: + + a_objects := a.o b.o c.o + 1_objects := 1.o 2.o 3.o + + sources := $($(a1)_objects:.o=.c) + +defines `sources' as either `a.c b.c c.c' or `1.c 2.c 3.c', depending +on the value of `a1'. + + The only restriction on this sort of use of nested variable +references is that they cannot specify part of the name of a function +to be called. This is because the test for a recognized function name +is done before the expansion of nested references. For example, + + ifdef do_sort + func := sort + else + func := strip + endif + + bar := a d b g q c + + foo := $($(func) $(bar)) + +attempts to give `foo' the value of the variable `sort a d b g q c' or +`strip a d b g q c', rather than giving `a d b g q c' as the argument +to either the `sort' or the `strip' function. This restriction could +be removed in the future if that change is shown to be a good idea. + + You can also use computed variable names in the left-hand side of a +variable assignment, or in a `define' directive, as in: + + dir = foo + $(dir)_sources := $(wildcard $(dir)/*.c) + define $(dir)_print = + lpr $($(dir)_sources) + endef + +This example defines the variables `dir', `foo_sources', and +`foo_print'. + + Note that "nested variable references" are quite different from +"recursively expanded variables" (*note The Two Flavors of Variables: +Flavors.), though both are used together in complex ways when doing +makefile programming. + + +File: make.info, Node: Values, Next: Setting, Prev: Advanced, Up: Using Variables + +6.4 How Variables Get Their Values +================================== + +Variables can get values in several different ways: + + * You can specify an overriding value when you run `make'. *Note + Overriding Variables: Overriding. + + * You can specify a value in the makefile, either with an assignment + (*note Setting Variables: Setting.) or with a verbatim definition + (*note Defining Multi-Line Variables: Multi-Line.). + + * Variables in the environment become `make' variables. *Note + Variables from the Environment: Environment. + + * Several "automatic" variables are given new values for each rule. + Each of these has a single conventional use. *Note Automatic + Variables::. + + * Several variables have constant initial values. *Note Variables + Used by Implicit Rules: Implicit Variables. + + +File: make.info, Node: Setting, Next: Appending, Prev: Values, Up: Using Variables + +6.5 Setting Variables +===================== + +To set a variable from the makefile, write a line starting with the +variable name followed by `=' or `:='. Whatever follows the `=' or +`:=' on the line becomes the value. For example, + + objects = main.o foo.o bar.o utils.o + +defines a variable named `objects'. Whitespace around the variable +name and immediately after the `=' is ignored. + + Variables defined with `=' are "recursively expanded" variables. +Variables defined with `:=' are "simply expanded" variables; these +definitions can contain variable references which will be expanded +before the definition is made. *Note The Two Flavors of Variables: +Flavors. + + The variable name may contain function and variable references, which +are expanded when the line is read to find the actual variable name to +use. + + There is no limit on the length of the value of a variable except the +amount of swapping space on the computer. When a variable definition is +long, it is a good idea to break it into several lines by inserting +backslash-newline at convenient places in the definition. This will not +affect the functioning of `make', but it will make the makefile easier +to read. + + Most variable names are considered to have the empty string as a +value if you have never set them. Several variables have built-in +initial values that are not empty, but you can set them in the usual +ways (*note Variables Used by Implicit Rules: Implicit Variables.). +Several special variables are set automatically to a new value for each +rule; these are called the "automatic" variables (*note Automatic +Variables::). + + If you'd like a variable to be set to a value only if it's not +already set, then you can use the shorthand operator `?=' instead of +`='. These two settings of the variable `FOO' are identical (*note The +`origin' Function: Origin Function.): + + FOO ?= bar + +and + + ifeq ($(origin FOO), undefined) + FOO = bar + endif + + +File: make.info, Node: Appending, Next: Override Directive, Prev: Setting, Up: Using Variables + +6.6 Appending More Text to Variables +==================================== + +Often it is useful to add more text to the value of a variable already +defined. You do this with a line containing `+=', like this: + + objects += another.o + +This takes the value of the variable `objects', and adds the text +`another.o' to it (preceded by a single space). Thus: + + objects = main.o foo.o bar.o utils.o + objects += another.o + +sets `objects' to `main.o foo.o bar.o utils.o another.o'. + + Using `+=' is similar to: + + objects = main.o foo.o bar.o utils.o + objects := $(objects) another.o + +but differs in ways that become important when you use more complex +values. + + When the variable in question has not been defined before, `+=' acts +just like normal `=': it defines a recursively-expanded variable. +However, when there _is_ a previous definition, exactly what `+=' does +depends on what flavor of variable you defined originally. *Note The +Two Flavors of Variables: Flavors, for an explanation of the two +flavors of variables. + + When you add to a variable's value with `+=', `make' acts +essentially as if you had included the extra text in the initial +definition of the variable. If you defined it first with `:=', making +it a simply-expanded variable, `+=' adds to that simply-expanded +definition, and expands the new text before appending it to the old +value just as `:=' does (see *note Setting Variables: Setting, for a +full explanation of `:='). In fact, + + variable := value + variable += more + +is exactly equivalent to: + + + variable := value + variable := $(variable) more + + On the other hand, when you use `+=' with a variable that you defined +first to be recursively-expanded using plain `=', `make' does something +a bit different. Recall that when you define a recursively-expanded +variable, `make' does not expand the value you set for variable and +function references immediately. Instead it stores the text verbatim, +and saves these variable and function references to be expanded later, +when you refer to the new variable (*note The Two Flavors of Variables: +Flavors.). When you use `+=' on a recursively-expanded variable, it is +this unexpanded text to which `make' appends the new text you specify. + + variable = value + variable += more + +is roughly equivalent to: + + temp = value + variable = $(temp) more + +except that of course it never defines a variable called `temp'. The +importance of this comes when the variable's old value contains +variable references. Take this common example: + + CFLAGS = $(includes) -O + ... + CFLAGS += -pg # enable profiling + +The first line defines the `CFLAGS' variable with a reference to another +variable, `includes'. (`CFLAGS' is used by the rules for C +compilation; *note Catalogue of Implicit Rules: Catalogue of Rules.) +Using `=' for the definition makes `CFLAGS' a recursively-expanded +variable, meaning `$(includes) -O' is _not_ expanded when `make' +processes the definition of `CFLAGS'. Thus, `includes' need not be +defined yet for its value to take effect. It only has to be defined +before any reference to `CFLAGS'. If we tried to append to the value +of `CFLAGS' without using `+=', we might do it like this: + + CFLAGS := $(CFLAGS) -pg # enable profiling + +This is pretty close, but not quite what we want. Using `:=' redefines +`CFLAGS' as a simply-expanded variable; this means `make' expands the +text `$(CFLAGS) -pg' before setting the variable. If `includes' is not +yet defined, we get ` -O -pg', and a later definition of `includes' +will have no effect. Conversely, by using `+=' we set `CFLAGS' to the +_unexpanded_ value `$(includes) -O -pg'. Thus we preserve the +reference to `includes', so if that variable gets defined at any later +point, a reference like `$(CFLAGS)' still uses its value. + + +File: make.info, Node: Override Directive, Next: Multi-Line, Prev: Appending, Up: Using Variables + +6.7 The `override' Directive +============================ + +If a variable has been set with a command argument (*note Overriding +Variables: Overriding.), then ordinary assignments in the makefile are +ignored. If you want to set the variable in the makefile even though +it was set with a command argument, you can use an `override' +directive, which is a line that looks like this: + + override VARIABLE = VALUE + +or + + override VARIABLE := VALUE + + To append more text to a variable defined on the command line, use: + + override VARIABLE += MORE TEXT + +*Note Appending More Text to Variables: Appending. + + Variable assignments marked with the `override' flag have a higher +priority than all other assignments, except another `override'. +Subsequent assignments or appends to this variable which are not marked +`override' will be ignored. + + The `override' directive was not invented for escalation in the war +between makefiles and command arguments. It was invented so you can +alter and add to values that the user specifies with command arguments. + + For example, suppose you always want the `-g' switch when you run the +C compiler, but you would like to allow the user to specify the other +switches with a command argument just as usual. You could use this +`override' directive: + + override CFLAGS += -g + + You can also use `override' directives with `define' directives. +This is done as you might expect: + + override define foo = + bar + endef + +*Note Defining Multi-Line Variables: Multi-Line. + + +File: make.info, Node: Multi-Line, Next: Undefine Directive, Prev: Override Directive, Up: Using Variables + +6.8 Defining Multi-Line Variables +================================= + +Another way to set the value of a variable is to use the `define' +directive. This directive has an unusual syntax which allows newline +characters to be included in the value, which is convenient for +defining both canned sequences of commands (*note Defining Canned +Recipes: Canned Recipes.), and also sections of makefile syntax to use +with `eval' (*note Eval Function::). + + The `define' directive is followed on the same line by the name of +the variable being defined and an (optional) assignment operator, and +nothing more. The value to give the variable appears on the following +lines. The end of the value is marked by a line containing just the +word `endef'. Aside from this difference in syntax, `define' works +just like any other variable definition. The variable name may contain +function and variable references, which are expanded when the directive +is read to find the actual variable name to use. + + You may omit the variable assignment operator if you prefer. If +omitted, `make' assumes it to be `=' and creates a recursively-expanded +variable (*note The Two Flavors of Variables: Flavors.). When using a +`+=' operator, the value is appended to the previous value as with any +other append operation: with a single space separating the old and new +values. + + You may nest `define' directives: `make' will keep track of nested +directives and report an error if they are not all properly closed with +`endef'. Note that lines beginning with the recipe prefix character +are considered part of a recipe, so any `define' or `endef' strings +appearing on such a line will not be considered `make' directives. + + define two-lines = + echo foo + echo $(bar) + endef + + The value in an ordinary assignment cannot contain a newline; but the +newlines that separate the lines of the value in a `define' become part +of the variable's value (except for the final newline which precedes +the `endef' and is not considered part of the value). + + When used in a recipe, the previous example is functionally +equivalent to this: + + two-lines = echo foo; echo $(bar) + +since two commands separated by semicolon behave much like two separate +shell commands. However, note that using two separate lines means +`make' will invoke the shell twice, running an independent subshell for +each line. *Note Recipe Execution: Execution. + + If you want variable definitions made with `define' to take +precedence over command-line variable definitions, you can use the +`override' directive together with `define': + + override define two-lines = + foo + $(bar) + endef + +*Note The `override' Directive: Override Directive. + + +File: make.info, Node: Undefine Directive, Next: Environment, Prev: Multi-Line, Up: Using Variables + +6.9 Undefining Variables +======================== + +If you want to clear a variable, setting its value to empty is usually +sufficient. Expanding such a variable will yield the same result (empty +string) regardless of whether it was set or not. However, if you are +using the `flavor' (*note Flavor Function::) and `origin' (*note Origin +Function::) functions, there is a difference between a variable that +was never set and a variable with an empty value. In such situations +you may want to use the `undefine' directive to make a variable appear +as if it was never set. For example: + + foo := foo + bar = bar + + undefine foo + undefine bar + + $(info $(origin foo)) + $(info $(flavor bar)) + + This example will print "undefined" for both variables. + + If you want to undefine a command-line variable definition, you can +use the `override' directive together with `undefine', similar to how +this is done for variable definitions: + + override undefine CFLAGS + + +File: make.info, Node: Environment, Next: Target-specific, Prev: Undefine Directive, Up: Using Variables + +6.10 Variables from the Environment +=================================== + +Variables in `make' can come from the environment in which `make' is +run. Every environment variable that `make' sees when it starts up is +transformed into a `make' variable with the same name and value. +However, an explicit assignment in the makefile, or with a command +argument, overrides the environment. (If the `-e' flag is specified, +then values from the environment override assignments in the makefile. +*Note Summary of Options: Options Summary. But this is not recommended +practice.) + + Thus, by setting the variable `CFLAGS' in your environment, you can +cause all C compilations in most makefiles to use the compiler switches +you prefer. This is safe for variables with standard or conventional +meanings because you know that no makefile will use them for other +things. (Note this is not totally reliable; some makefiles set +`CFLAGS' explicitly and therefore are not affected by the value in the +environment.) + + When `make' runs a recipe, variables defined in the makefile are +placed into the environment of each shell. This allows you to pass +values to sub-`make' invocations (*note Recursive Use of `make': +Recursion.). By default, only variables that came from the environment +or the command line are passed to recursive invocations. You can use +the `export' directive to pass other variables. *Note Communicating +Variables to a Sub-`make': Variables/Recursion, for full details. + + Other use of variables from the environment is not recommended. It +is not wise for makefiles to depend for their functioning on +environment variables set up outside their control, since this would +cause different users to get different results from the same makefile. +This is against the whole purpose of most makefiles. + + Such problems would be especially likely with the variable `SHELL', +which is normally present in the environment to specify the user's +choice of interactive shell. It would be very undesirable for this +choice to affect `make'; so, `make' handles the `SHELL' environment +variable in a special way; see *note Choosing the Shell::. + + +File: make.info, Node: Target-specific, Next: Pattern-specific, Prev: Environment, Up: Using Variables + +6.11 Target-specific Variable Values +==================================== + +Variable values in `make' are usually global; that is, they are the +same regardless of where they are evaluated (unless they're reset, of +course). One exception to that is automatic variables (*note Automatic +Variables::). + + The other exception is "target-specific variable values". This +feature allows you to define different values for the same variable, +based on the target that `make' is currently building. As with +automatic variables, these values are only available within the context +of a target's recipe (and in other target-specific assignments). + + Set a target-specific variable value like this: + + TARGET ... : VARIABLE-ASSIGNMENT + + Target-specific variable assignments can be prefixed with any or all +of the special keywords `export', `override', or `private'; these apply +their normal behavior to this instance of the variable only. + + Multiple TARGET values create a target-specific variable value for +each member of the target list individually. + + The VARIABLE-ASSIGNMENT can be any valid form of assignment; +recursive (`='), static (`:='), appending (`+='), or conditional +(`?='). All variables that appear within the VARIABLE-ASSIGNMENT are +evaluated within the context of the target: thus, any +previously-defined target-specific variable values will be in effect. +Note that this variable is actually distinct from any "global" value: +the two variables do not have to have the same flavor (recursive vs. +static). + + Target-specific variables have the same priority as any other +makefile variable. Variables provided on the command line (and in the +environment if the `-e' option is in force) will take precedence. +Specifying the `override' directive will allow the target-specific +variable value to be preferred. + + There is one more special feature of target-specific variables: when +you define a target-specific variable that variable value is also in +effect for all prerequisites of this target, and all their +prerequisites, etc. (unless those prerequisites override that variable +with their own target-specific variable value). So, for example, a +statement like this: + + prog : CFLAGS = -g + prog : prog.o foo.o bar.o + +will set `CFLAGS' to `-g' in the recipe for `prog', but it will also +set `CFLAGS' to `-g' in the recipes that create `prog.o', `foo.o', and +`bar.o', and any recipes which create their prerequisites. + + Be aware that a given prerequisite will only be built once per +invocation of make, at most. If the same file is a prerequisite of +multiple targets, and each of those targets has a different value for +the same target-specific variable, then the first target to be built +will cause that prerequisite to be built and the prerequisite will +inherit the target-specific value from the first target. It will +ignore the target-specific values from any other targets. + + +File: make.info, Node: Pattern-specific, Next: Suppressing Inheritance, Prev: Target-specific, Up: Using Variables + +6.12 Pattern-specific Variable Values +===================================== + +In addition to target-specific variable values (*note Target-specific +Variable Values: Target-specific.), GNU `make' supports +pattern-specific variable values. In this form, the variable is +defined for any target that matches the pattern specified. + + Set a pattern-specific variable value like this: + + PATTERN ... : VARIABLE-ASSIGNMENT + where PATTERN is a %-pattern. As with target-specific variable +values, multiple PATTERN values create a pattern-specific variable +value for each pattern individually. The VARIABLE-ASSIGNMENT can be +any valid form of assignment. Any command line variable setting will +take precedence, unless `override' is specified. + + For example: + + %.o : CFLAGS = -O + +will assign `CFLAGS' the value of `-O' for all targets matching the +pattern `%.o'. + + If a target matches more than one pattern, the matching +pattern-specific variables with longer stems are interpreted first. +This results in more specific variables taking precedence over the more +generic ones, for example: + + %.o: %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ + + lib/%.o: CFLAGS := -fPIC -g + %.o: CFLAGS := -g + + all: foo.o lib/bar.o + + In this example the first definition of the `CFLAGS' variable will +be used to update `lib/bar.o' even though the second one also applies +to this target. Pattern-specific variables which result in the same +stem length are considered in the order in which they were defined in +the makefile. + + Pattern-specific variables are searched after any target-specific +variables defined explicitly for that target, and before target-specific +variables defined for the parent target. + + +File: make.info, Node: Suppressing Inheritance, Next: Special Variables, Prev: Pattern-specific, Up: Using Variables + +6.13 Suppressing Inheritance +============================ + +As described in previous sections, `make' variables are inherited by +prerequisites. This capability allows you to modify the behavior of a +prerequisite based on which targets caused it to be rebuilt. For +example, you might set a target-specific variable on a `debug' target, +then running `make debug' will cause that variable to be inherited by +all prerequisites of `debug', while just running `make all' (for +example) would not have that assignment. + + Sometimes, however, you may not want a variable to be inherited. For +these situations, `make' provides the `private' modifier. Although +this modifier can be used with any variable assignment, it makes the +most sense with target- and pattern-specific variables. Any variable +marked `private' will be visible to its local target but will not be +inherited by prerequisites of that target. A global variable marked +`private' will be visible in the global scope but will not be inherited +by any target, and hence will not be visible in any recipe. + + As an example, consider this makefile: + EXTRA_CFLAGS = + + prog: private EXTRA_CFLAGS = -L/usr/local/lib + prog: a.o b.o + + Due to the `private' modifier, `a.o' and `b.o' will not inherit the +`EXTRA_CFLAGS' variable assignment from the `progs' target. + + +File: make.info, Node: Special Variables, Prev: Suppressing Inheritance, Up: Using Variables + +6.14 Other Special Variables +============================ + +GNU `make' supports some variables that have special properties. + +`MAKEFILE_LIST' + Contains the name of each makefile that is parsed by `make', in + the order in which it was parsed. The name is appended just + before `make' begins to parse the makefile. Thus, if the first + thing a makefile does is examine the last word in this variable, it + will be the name of the current makefile. Once the current + makefile has used `include', however, the last word will be the + just-included makefile. + + If a makefile named `Makefile' has this content: + + name1 := $(lastword $(MAKEFILE_LIST)) + + include inc.mk + + name2 := $(lastword $(MAKEFILE_LIST)) + + all: + @echo name1 = $(name1) + @echo name2 = $(name2) + + then you would expect to see this output: + + name1 = Makefile + name2 = inc.mk + +`.DEFAULT_GOAL' + Sets the default goal to be used if no targets were specified on + the command line (*note Arguments to Specify the Goals: Goals.). + The `.DEFAULT_GOAL' variable allows you to discover the current + default goal, restart the default goal selection algorithm by + clearing its value, or to explicitly set the default goal. The + following example illustrates these cases: + + # Query the default goal. + ifeq ($(.DEFAULT_GOAL),) + $(warning no default goal is set) + endif + + .PHONY: foo + foo: ; @echo $@ + + $(warning default goal is $(.DEFAULT_GOAL)) + + # Reset the default goal. + .DEFAULT_GOAL := + + .PHONY: bar + bar: ; @echo $@ + + $(warning default goal is $(.DEFAULT_GOAL)) + + # Set our own. + .DEFAULT_GOAL := foo + + This makefile prints: + + no default goal is set + default goal is foo + default goal is bar + foo + + Note that assigning more than one target name to `.DEFAULT_GOAL' is + illegal and will result in an error. + +`MAKE_RESTARTS' + This variable is set only if this instance of `make' has restarted + (*note How Makefiles Are Remade: Remaking Makefiles.): it will + contain the number of times this instance has restarted. Note + this is not the same as recursion (counted by the `MAKELEVEL' + variable). You should not set, modify, or export this variable. + +`.RECIPEPREFIX' + The first character of the value of this variable is used as the + character make assumes is introducing a recipe line. If the + variable is empty (as it is by default) that character is the + standard tab character. For example, this is a valid makefile: + + .RECIPEPREFIX = > + all: + > @echo Hello, world + + The value of `.RECIPEPREFIX' can be changed multiple times; once + set it stays in effect for all rules parsed until it is modified. + +`.VARIABLES' + Expands to a list of the _names_ of all global variables defined + so far. This includes variables which have empty values, as well + as built-in variables (*note Variables Used by Implicit Rules: + Implicit Variables.), but does not include any variables which are + only defined in a target-specific context. Note that any value + you assign to this variable will be ignored; it will always return + its special value. + +`.FEATURES' + Expands to a list of special features supported by this version of + `make'. Possible values include: + + `archives' + Supports `ar' (archive) files using special filename syntax. + *Note Using `make' to Update Archive Files: Archives. + + `check-symlink' + Supports the `-L' (`--check-symlink-times') flag. *Note + Summary of Options: Options Summary. + + `else-if' + Supports "else if" non-nested conditionals. *Note Syntax of + Conditionals: Conditional Syntax. + + `jobserver' + Supports "job server" enhanced parallel builds. *Note + Parallel Execution: Parallel. + + `second-expansion' + Supports secondary expansion of prerequisite lists. + + `order-only' + Supports order-only prerequisites. *Note Types of + Prerequisites: Prerequisite Types. + + `target-specific' + Supports target-specific and pattern-specific variable + assignments. *Note Target-specific Variable Values: + Target-specific. + + +`.INCLUDE_DIRS' + Expands to a list of directories that `make' searches for included + makefiles (*note Including Other Makefiles: Include.). + + + +File: make.info, Node: Conditionals, Next: Functions, Prev: Using Variables, Up: Top + +7 Conditional Parts of Makefiles +******************************** + +A "conditional" directive causes part of a makefile to be obeyed or +ignored depending on the values of variables. Conditionals can compare +the value of one variable to another, or the value of a variable to a +constant string. Conditionals control what `make' actually "sees" in +the makefile, so they _cannot_ be used to control recipes at the time +of execution. + +* Menu: + +* Conditional Example:: Example of a conditional +* Conditional Syntax:: The syntax of conditionals. +* Testing Flags:: Conditionals that test flags. + + +File: make.info, Node: Conditional Example, Next: Conditional Syntax, Prev: Conditionals, Up: Conditionals + +7.1 Example of a Conditional +============================ + +The following example of a conditional tells `make' to use one set of +libraries if the `CC' variable is `gcc', and a different set of +libraries otherwise. It works by controlling which of two recipe lines +will be used for the rule. The result is that `CC=gcc' as an argument +to `make' changes not only which compiler is used but also which +libraries are linked. + + libs_for_gcc = -lgnu + normal_libs = + + foo: $(objects) + ifeq ($(CC),gcc) + $(CC) -o foo $(objects) $(libs_for_gcc) + else + $(CC) -o foo $(objects) $(normal_libs) + endif + + This conditional uses three directives: one `ifeq', one `else' and +one `endif'. + + The `ifeq' directive begins the conditional, and specifies the +condition. It contains two arguments, separated by a comma and +surrounded by parentheses. Variable substitution is performed on both +arguments and then they are compared. The lines of the makefile +following the `ifeq' are obeyed if the two arguments match; otherwise +they are ignored. + + The `else' directive causes the following lines to be obeyed if the +previous conditional failed. In the example above, this means that the +second alternative linking command is used whenever the first +alternative is not used. It is optional to have an `else' in a +conditional. + + The `endif' directive ends the conditional. Every conditional must +end with an `endif'. Unconditional makefile text follows. + + As this example illustrates, conditionals work at the textual level: +the lines of the conditional are treated as part of the makefile, or +ignored, according to the condition. This is why the larger syntactic +units of the makefile, such as rules, may cross the beginning or the +end of the conditional. + + When the variable `CC' has the value `gcc', the above example has +this effect: + + foo: $(objects) + $(CC) -o foo $(objects) $(libs_for_gcc) + +When the variable `CC' has any other value, the effect is this: + + foo: $(objects) + $(CC) -o foo $(objects) $(normal_libs) + + Equivalent results can be obtained in another way by +conditionalizing a variable assignment and then using the variable +unconditionally: + + libs_for_gcc = -lgnu + normal_libs = + + ifeq ($(CC),gcc) + libs=$(libs_for_gcc) + else + libs=$(normal_libs) + endif + + foo: $(objects) + $(CC) -o foo $(objects) $(libs) + + +File: make.info, Node: Conditional Syntax, Next: Testing Flags, Prev: Conditional Example, Up: Conditionals + +7.2 Syntax of Conditionals +========================== + +The syntax of a simple conditional with no `else' is as follows: + + CONDITIONAL-DIRECTIVE + TEXT-IF-TRUE + endif + +The TEXT-IF-TRUE may be any lines of text, to be considered as part of +the makefile if the condition is true. If the condition is false, no +text is used instead. + + The syntax of a complex conditional is as follows: + + CONDITIONAL-DIRECTIVE + TEXT-IF-TRUE + else + TEXT-IF-FALSE + endif + + or: + + CONDITIONAL-DIRECTIVE + TEXT-IF-ONE-IS-TRUE + else CONDITIONAL-DIRECTIVE + TEXT-IF-TRUE + else + TEXT-IF-FALSE + endif + +There can be as many "`else' CONDITIONAL-DIRECTIVE" clauses as +necessary. Once a given condition is true, TEXT-IF-TRUE is used and no +other clause is used; if no condition is true then TEXT-IF-FALSE is +used. The TEXT-IF-TRUE and TEXT-IF-FALSE can be any number of lines of +text. + + The syntax of the CONDITIONAL-DIRECTIVE is the same whether the +conditional is simple or complex; after an `else' or not. There are +four different directives that test different conditions. Here is a +table of them: + +`ifeq (ARG1, ARG2)' +`ifeq 'ARG1' 'ARG2'' +`ifeq "ARG1" "ARG2"' +`ifeq "ARG1" 'ARG2'' +`ifeq 'ARG1' "ARG2"' + Expand all variable references in ARG1 and ARG2 and compare them. + If they are identical, the TEXT-IF-TRUE is effective; otherwise, + the TEXT-IF-FALSE, if any, is effective. + + Often you want to test if a variable has a non-empty value. When + the value results from complex expansions of variables and + functions, expansions you would consider empty may actually + contain whitespace characters and thus are not seen as empty. + However, you can use the `strip' function (*note Text Functions::) + to avoid interpreting whitespace as a non-empty value. For + example: + + ifeq ($(strip $(foo)),) + TEXT-IF-EMPTY + endif + + will evaluate TEXT-IF-EMPTY even if the expansion of `$(foo)' + contains whitespace characters. + +`ifneq (ARG1, ARG2)' +`ifneq 'ARG1' 'ARG2'' +`ifneq "ARG1" "ARG2"' +`ifneq "ARG1" 'ARG2'' +`ifneq 'ARG1' "ARG2"' + Expand all variable references in ARG1 and ARG2 and compare them. + If they are different, the TEXT-IF-TRUE is effective; otherwise, + the TEXT-IF-FALSE, if any, is effective. + +`ifdef VARIABLE-NAME' + The `ifdef' form takes the _name_ of a variable as its argument, + not a reference to a variable. The value of that variable has a + non-empty value, the TEXT-IF-TRUE is effective; otherwise, the + TEXT-IF-FALSE, if any, is effective. Variables that have never + been defined have an empty value. The text VARIABLE-NAME is + expanded, so it could be a variable or function that expands to + the name of a variable. For example: + + bar = true + foo = bar + ifdef $(foo) + frobozz = yes + endif + + The variable reference `$(foo)' is expanded, yielding `bar', which + is considered to be the name of a variable. The variable `bar' is + not expanded, but its value is examined to determine if it is + non-empty. + + Note that `ifdef' only tests whether a variable has a value. It + does not expand the variable to see if that value is nonempty. + Consequently, tests using `ifdef' return true for all definitions + except those like `foo ='. To test for an empty value, use + `ifeq ($(foo),)'. For example, + + bar = + foo = $(bar) + ifdef foo + frobozz = yes + else + frobozz = no + endif + + sets `frobozz' to `yes', while: + + foo = + ifdef foo + frobozz = yes + else + frobozz = no + endif + + sets `frobozz' to `no'. + +`ifndef VARIABLE-NAME' + If the variable VARIABLE-NAME has an empty value, the TEXT-IF-TRUE + is effective; otherwise, the TEXT-IF-FALSE, if any, is effective. + The rules for expansion and testing of VARIABLE-NAME are identical + to the `ifdef' directive. + + Extra spaces are allowed and ignored at the beginning of the +conditional directive line, but a tab is not allowed. (If the line +begins with a tab, it will be considered part of a recipe for a rule.) +Aside from this, extra spaces or tabs may be inserted with no effect +anywhere except within the directive name or within an argument. A +comment starting with `#' may appear at the end of the line. + + The other two directives that play a part in a conditional are `else' +and `endif'. Each of these directives is written as one word, with no +arguments. Extra spaces are allowed and ignored at the beginning of the +line, and spaces or tabs at the end. A comment starting with `#' may +appear at the end of the line. + + Conditionals affect which lines of the makefile `make' uses. If the +condition is true, `make' reads the lines of the TEXT-IF-TRUE as part +of the makefile; if the condition is false, `make' ignores those lines +completely. It follows that syntactic units of the makefile, such as +rules, may safely be split across the beginning or the end of the +conditional. + + `make' evaluates conditionals when it reads a makefile. +Consequently, you cannot use automatic variables in the tests of +conditionals because they are not defined until recipes are run (*note +Automatic Variables::). + + To prevent intolerable confusion, it is not permitted to start a +conditional in one makefile and end it in another. However, you may +write an `include' directive within a conditional, provided you do not +attempt to terminate the conditional inside the included file. + + +File: make.info, Node: Testing Flags, Prev: Conditional Syntax, Up: Conditionals + +7.3 Conditionals that Test Flags +================================ + +You can write a conditional that tests `make' command flags such as +`-t' by using the variable `MAKEFLAGS' together with the `findstring' +function (*note Functions for String Substitution and Analysis: Text +Functions.). This is useful when `touch' is not enough to make a file +appear up to date. + + The `findstring' function determines whether one string appears as a +substring of another. If you want to test for the `-t' flag, use `t' +as the first string and the value of `MAKEFLAGS' as the other. + + For example, here is how to arrange to use `ranlib -t' to finish +marking an archive file up to date: + + archive.a: ... + ifneq (,$(findstring t,$(MAKEFLAGS))) + +touch archive.a + +ranlib -t archive.a + else + ranlib archive.a + endif + +The `+' prefix marks those recipe lines as "recursive" so that they +will be executed despite use of the `-t' flag. *Note Recursive Use of +`make': Recursion. + + +File: make.info, Node: Functions, Next: Running, Prev: Conditionals, Up: Top + +8 Functions for Transforming Text +********************************* + +"Functions" allow you to do text processing in the makefile to compute +the files to operate on or the commands to use in recipes. You use a +function in a "function call", where you give the name of the function +and some text (the "arguments") for the function to operate on. The +result of the function's processing is substituted into the makefile at +the point of the call, just as a variable might be substituted. + +* Menu: + +* Syntax of Functions:: How to write a function call. +* Text Functions:: General-purpose text manipulation functions. +* File Name Functions:: Functions for manipulating file names. +* Conditional Functions:: Functions that implement conditions. +* Foreach Function:: Repeat some text with controlled variation. +* Call Function:: Expand a user-defined function. +* Value Function:: Return the un-expanded value of a variable. +* Eval Function:: Evaluate the arguments as makefile syntax. +* Origin Function:: Find where a variable got its value. +* Flavor Function:: Find out the flavor of a variable. +* Shell Function:: Substitute the output of a shell command. +* Make Control Functions:: Functions that control how make runs. + + +File: make.info, Node: Syntax of Functions, Next: Text Functions, Prev: Functions, Up: Functions + +8.1 Function Call Syntax +======================== + +A function call resembles a variable reference. It looks like this: + + $(FUNCTION ARGUMENTS) + +or like this: + + ${FUNCTION ARGUMENTS} + + Here FUNCTION is a function name; one of a short list of names that +are part of `make'. You can also essentially create your own functions +by using the `call' builtin function. + + The ARGUMENTS are the arguments of the function. They are separated +from the function name by one or more spaces or tabs, and if there is +more than one argument, then they are separated by commas. Such +whitespace and commas are not part of an argument's value. The +delimiters which you use to surround the function call, whether +parentheses or braces, can appear in an argument only in matching pairs; +the other kind of delimiters may appear singly. If the arguments +themselves contain other function calls or variable references, it is +wisest to use the same kind of delimiters for all the references; write +`$(subst a,b,$(x))', not `$(subst a,b,${x})'. This is because it is +clearer, and because only one type of delimiter is matched to find the +end of the reference. + + The text written for each argument is processed by substitution of +variables and function calls to produce the argument value, which is +the text on which the function acts. The substitution is done in the +order in which the arguments appear. + + Commas and unmatched parentheses or braces cannot appear in the text +of an argument as written; leading spaces cannot appear in the text of +the first argument as written. These characters can be put into the +argument value by variable substitution. First define variables +`comma' and `space' whose values are isolated comma and space +characters, then substitute these variables where such characters are +wanted, like this: + + comma:= , + empty:= + space:= $(empty) $(empty) + foo:= a b c + bar:= $(subst $(space),$(comma),$(foo)) + # bar is now `a,b,c'. + +Here the `subst' function replaces each space with a comma, through the +value of `foo', and substitutes the result. + + +File: make.info, Node: Text Functions, Next: File Name Functions, Prev: Syntax of Functions, Up: Functions + +8.2 Functions for String Substitution and Analysis +================================================== + +Here are some functions that operate on strings: + +`$(subst FROM,TO,TEXT)' + Performs a textual replacement on the text TEXT: each occurrence + of FROM is replaced by TO. The result is substituted for the + function call. For example, + + $(subst ee,EE,feet on the street) + + substitutes the string `fEEt on the strEEt'. + +`$(patsubst PATTERN,REPLACEMENT,TEXT)' + Finds whitespace-separated words in TEXT that match PATTERN and + replaces them with REPLACEMENT. Here PATTERN may contain a `%' + which acts as a wildcard, matching any number of any characters + within a word. If REPLACEMENT also contains a `%', the `%' is + replaced by the text that matched the `%' in PATTERN. Only the + first `%' in the PATTERN and REPLACEMENT is treated this way; any + subsequent `%' is unchanged. + + `%' characters in `patsubst' function invocations can be quoted + with preceding backslashes (`\'). Backslashes that would + otherwise quote `%' characters can be quoted with more backslashes. + Backslashes that quote `%' characters or other backslashes are + removed from the pattern before it is compared file names or has a + stem substituted into it. Backslashes that are not in danger of + quoting `%' characters go unmolested. For example, the pattern + `the\%weird\\%pattern\\' has `the%weird\' preceding the operative + `%' character, and `pattern\\' following it. The final two + backslashes are left alone because they cannot affect any `%' + character. + + Whitespace between words is folded into single space characters; + leading and trailing whitespace is discarded. + + For example, + + $(patsubst %.c,%.o,x.c.c bar.c) + + produces the value `x.c.o bar.o'. + + Substitution references (*note Substitution References: + Substitution Refs.) are a simpler way to get the effect of the + `patsubst' function: + + $(VAR:PATTERN=REPLACEMENT) + + is equivalent to + + $(patsubst PATTERN,REPLACEMENT,$(VAR)) + + The second shorthand simplifies one of the most common uses of + `patsubst': replacing the suffix at the end of file names. + + $(VAR:SUFFIX=REPLACEMENT) + + is equivalent to + + $(patsubst %SUFFIX,%REPLACEMENT,$(VAR)) + + For example, you might have a list of object files: + + objects = foo.o bar.o baz.o + + To get the list of corresponding source files, you could simply + write: + + $(objects:.o=.c) + + instead of using the general form: + + $(patsubst %.o,%.c,$(objects)) + +`$(strip STRING)' + Removes leading and trailing whitespace from STRING and replaces + each internal sequence of one or more whitespace characters with a + single space. Thus, `$(strip a b c )' results in `a b c'. + + The function `strip' can be very useful when used in conjunction + with conditionals. When comparing something with the empty string + `' using `ifeq' or `ifneq', you usually want a string of just + whitespace to match the empty string (*note Conditionals::). + + Thus, the following may fail to have the desired results: + + .PHONY: all + ifneq "$(needs_made)" "" + all: $(needs_made) + else + all:;@echo 'Nothing to make!' + endif + + Replacing the variable reference `$(needs_made)' with the function + call `$(strip $(needs_made))' in the `ifneq' directive would make + it more robust. + +`$(findstring FIND,IN)' + Searches IN for an occurrence of FIND. If it occurs, the value is + FIND; otherwise, the value is empty. You can use this function in + a conditional to test for the presence of a specific substring in + a given string. Thus, the two examples, + + $(findstring a,a b c) + $(findstring a,b c) + + produce the values `a' and `' (the empty string), respectively. + *Note Testing Flags::, for a practical application of `findstring'. + +`$(filter PATTERN...,TEXT)' + Returns all whitespace-separated words in TEXT that _do_ match any + of the PATTERN words, removing any words that _do not_ match. The + patterns are written using `%', just like the patterns used in the + `patsubst' function above. + + The `filter' function can be used to separate out different types + of strings (such as file names) in a variable. For example: + + sources := foo.c bar.c baz.s ugh.h + foo: $(sources) + cc $(filter %.c %.s,$(sources)) -o foo + + says that `foo' depends of `foo.c', `bar.c', `baz.s' and `ugh.h' + but only `foo.c', `bar.c' and `baz.s' should be specified in the + command to the compiler. + +`$(filter-out PATTERN...,TEXT)' + Returns all whitespace-separated words in TEXT that _do not_ match + any of the PATTERN words, removing the words that _do_ match one + or more. This is the exact opposite of the `filter' function. + + For example, given: + + objects=main1.o foo.o main2.o bar.o + mains=main1.o main2.o + + the following generates a list which contains all the object files + not in `mains': + + $(filter-out $(mains),$(objects)) + +`$(sort LIST)' + Sorts the words of LIST in lexical order, removing duplicate + words. The output is a list of words separated by single spaces. + Thus, + + $(sort foo bar lose) + + returns the value `bar foo lose'. + + Incidentally, since `sort' removes duplicate words, you can use it + for this purpose even if you don't care about the sort order. + +`$(word N,TEXT)' + Returns the Nth word of TEXT. The legitimate values of N start + from 1. If N is bigger than the number of words in TEXT, the + value is empty. For example, + + $(word 2, foo bar baz) + + returns `bar'. + +`$(wordlist S,E,TEXT)' + Returns the list of words in TEXT starting with word S and ending + with word E (inclusive). The legitimate values of S start from 1; + E may start from 0. If S is bigger than the number of words in + TEXT, the value is empty. If E is bigger than the number of words + in TEXT, words up to the end of TEXT are returned. If S is + greater than E, nothing is returned. For example, + + $(wordlist 2, 3, foo bar baz) + + returns `bar baz'. + +`$(words TEXT)' + Returns the number of words in TEXT. Thus, the last word of TEXT + is `$(word $(words TEXT),TEXT)'. + +`$(firstword NAMES...)' + The argument NAMES is regarded as a series of names, separated by + whitespace. The value is the first name in the series. The rest + of the names are ignored. + + For example, + + $(firstword foo bar) + + produces the result `foo'. Although `$(firstword TEXT)' is the + same as `$(word 1,TEXT)', the `firstword' function is retained for + its simplicity. + +`$(lastword NAMES...)' + The argument NAMES is regarded as a series of names, separated by + whitespace. The value is the last name in the series. + + For example, + + $(lastword foo bar) + + produces the result `bar'. Although `$(lastword TEXT)' is the + same as `$(word $(words TEXT),TEXT)', the `lastword' function was + added for its simplicity and better performance. + + Here is a realistic example of the use of `subst' and `patsubst'. +Suppose that a makefile uses the `VPATH' variable to specify a list of +directories that `make' should search for prerequisite files (*note +`VPATH' Search Path for All Prerequisites: General Search.). This +example shows how to tell the C compiler to search for header files in +the same list of directories. + + The value of `VPATH' is a list of directories separated by colons, +such as `src:../headers'. First, the `subst' function is used to +change the colons to spaces: + + $(subst :, ,$(VPATH)) + +This produces `src ../headers'. Then `patsubst' is used to turn each +directory name into a `-I' flag. These can be added to the value of +the variable `CFLAGS', which is passed automatically to the C compiler, +like this: + + override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH))) + +The effect is to append the text `-Isrc -I../headers' to the previously +given value of `CFLAGS'. The `override' directive is used so that the +new value is assigned even if the previous value of `CFLAGS' was +specified with a command argument (*note The `override' Directive: +Override Directive.). + + +File: make.info, Node: File Name Functions, Next: Conditional Functions, Prev: Text Functions, Up: Functions + +8.3 Functions for File Names +============================ + +Several of the built-in expansion functions relate specifically to +taking apart file names or lists of file names. + + Each of the following functions performs a specific transformation +on a file name. The argument of the function is regarded as a series +of file names, separated by whitespace. (Leading and trailing +whitespace is ignored.) Each file name in the series is transformed in +the same way and the results are concatenated with single spaces +between them. + +`$(dir NAMES...)' + Extracts the directory-part of each file name in NAMES. The + directory-part of the file name is everything up through (and + including) the last slash in it. If the file name contains no + slash, the directory part is the string `./'. For example, + + $(dir src/foo.c hacks) + + produces the result `src/ ./'. + +`$(notdir NAMES...)' + Extracts all but the directory-part of each file name in NAMES. + If the file name contains no slash, it is left unchanged. + Otherwise, everything through the last slash is removed from it. + + A file name that ends with a slash becomes an empty string. This + is unfortunate, because it means that the result does not always + have the same number of whitespace-separated file names as the + argument had; but we do not see any other valid alternative. + + For example, + + $(notdir src/foo.c hacks) + + produces the result `foo.c hacks'. + +`$(suffix NAMES...)' + Extracts the suffix of each file name in NAMES. If the file name + contains a period, the suffix is everything starting with the last + period. Otherwise, the suffix is the empty string. This + frequently means that the result will be empty when NAMES is not, + and if NAMES contains multiple file names, the result may contain + fewer file names. + + For example, + + $(suffix src/foo.c src-1.0/bar.c hacks) + + produces the result `.c .c'. + +`$(basename NAMES...)' + Extracts all but the suffix of each file name in NAMES. If the + file name contains a period, the basename is everything starting + up to (and not including) the last period. Periods in the + directory part are ignored. If there is no period, the basename + is the entire file name. For example, + + $(basename src/foo.c src-1.0/bar hacks) + + produces the result `src/foo src-1.0/bar hacks'. + +`$(addsuffix SUFFIX,NAMES...)' + The argument NAMES is regarded as a series of names, separated by + whitespace; SUFFIX is used as a unit. The value of SUFFIX is + appended to the end of each individual name and the resulting + larger names are concatenated with single spaces between them. + For example, + + $(addsuffix .c,foo bar) + + produces the result `foo.c bar.c'. + +`$(addprefix PREFIX,NAMES...)' + The argument NAMES is regarded as a series of names, separated by + whitespace; PREFIX is used as a unit. The value of PREFIX is + prepended to the front of each individual name and the resulting + larger names are concatenated with single spaces between them. + For example, + + $(addprefix src/,foo bar) + + produces the result `src/foo src/bar'. + +`$(join LIST1,LIST2)' + Concatenates the two arguments word by word: the two first words + (one from each argument) concatenated form the first word of the + result, the two second words form the second word of the result, + and so on. So the Nth word of the result comes from the Nth word + of each argument. If one argument has more words that the other, + the extra words are copied unchanged into the result. + + For example, `$(join a b,.c .o)' produces `a.c b.o'. + + Whitespace between the words in the lists is not preserved; it is + replaced with a single space. + + This function can merge the results of the `dir' and `notdir' + functions, to produce the original list of files which was given + to those two functions. + +`$(wildcard PATTERN)' + The argument PATTERN is a file name pattern, typically containing + wildcard characters (as in shell file name patterns). The result + of `wildcard' is a space-separated list of the names of existing + files that match the pattern. *Note Using Wildcard Characters in + File Names: Wildcards. + +`$(realpath NAMES...)' + For each file name in NAMES return the canonical absolute name. A + canonical name does not contain any `.' or `..' components, nor + any repeated path separators (`/') or symlinks. In case of a + failure the empty string is returned. Consult the `realpath(3)' + documentation for a list of possible failure causes. + +`$(abspath NAMES...)' + For each file name in NAMES return an absolute name that does not + contain any `.' or `..' components, nor any repeated path + separators (`/'). Note that, in contrast to `realpath' function, + `abspath' does not resolve symlinks and does not require the file + names to refer to an existing file or directory. Use the + `wildcard' function to test for existence. + + +File: make.info, Node: Conditional Functions, Next: Foreach Function, Prev: File Name Functions, Up: Functions + +8.4 Functions for Conditionals +============================== + +There are three functions that provide conditional expansion. A key +aspect of these functions is that not all of the arguments are expanded +initially. Only those arguments which need to be expanded, will be +expanded. + +`$(if CONDITION,THEN-PART[,ELSE-PART])' + The `if' function provides support for conditional expansion in a + functional context (as opposed to the GNU `make' makefile + conditionals such as `ifeq' (*note Syntax of Conditionals: + Conditional Syntax.). + + The first argument, CONDITION, first has all preceding and + trailing whitespace stripped, then is expanded. If it expands to + any non-empty string, then the condition is considered to be true. + If it expands to an empty string, the condition is considered to + be false. + + If the condition is true then the second argument, THEN-PART, is + evaluated and this is used as the result of the evaluation of the + entire `if' function. + + If the condition is false then the third argument, ELSE-PART, is + evaluated and this is the result of the `if' function. If there is + no third argument, the `if' function evaluates to nothing (the + empty string). + + Note that only one of the THEN-PART or the ELSE-PART will be + evaluated, never both. Thus, either can contain side-effects + (such as `shell' function calls, etc.) + +`$(or CONDITION1[,CONDITION2[,CONDITION3...]])' + The `or' function provides a "short-circuiting" OR operation. + Each argument is expanded, in order. If an argument expands to a + non-empty string the processing stops and the result of the + expansion is that string. If, after all arguments are expanded, + all of them are false (empty), then the result of the expansion is + the empty string. + +`$(and CONDITION1[,CONDITION2[,CONDITION3...]])' + The `and' function provides a "short-circuiting" AND operation. + Each argument is expanded, in order. If an argument expands to an + empty string the processing stops and the result of the expansion + is the empty string. If all arguments expand to a non-empty + string then the result of the expansion is the expansion of the + last argument. + + + +File: make.info, Node: Foreach Function, Next: Call Function, Prev: Conditional Functions, Up: Functions + +8.5 The `foreach' Function +========================== + +The `foreach' function is very different from other functions. It +causes one piece of text to be used repeatedly, each time with a +different substitution performed on it. It resembles the `for' command +in the shell `sh' and the `foreach' command in the C-shell `csh'. + + The syntax of the `foreach' function is: + + $(foreach VAR,LIST,TEXT) + +The first two arguments, VAR and LIST, are expanded before anything +else is done; note that the last argument, TEXT, is *not* expanded at +the same time. Then for each word of the expanded value of LIST, the +variable named by the expanded value of VAR is set to that word, and +TEXT is expanded. Presumably TEXT contains references to that +variable, so its expansion will be different each time. + + The result is that TEXT is expanded as many times as there are +whitespace-separated words in LIST. The multiple expansions of TEXT +are concatenated, with spaces between them, to make the result of +`foreach'. + + This simple example sets the variable `files' to the list of all +files in the directories in the list `dirs': + + dirs := a b c d + files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) + + Here TEXT is `$(wildcard $(dir)/*)'. The first repetition finds the +value `a' for `dir', so it produces the same result as `$(wildcard +a/*)'; the second repetition produces the result of `$(wildcard b/*)'; +and the third, that of `$(wildcard c/*)'. + + This example has the same result (except for setting `dirs') as the +following example: + + files := $(wildcard a/* b/* c/* d/*) + + When TEXT is complicated, you can improve readability by giving it a +name, with an additional variable: + + find_files = $(wildcard $(dir)/*) + dirs := a b c d + files := $(foreach dir,$(dirs),$(find_files)) + +Here we use the variable `find_files' this way. We use plain `=' to +define a recursively-expanding variable, so that its value contains an +actual function call to be reexpanded under the control of `foreach'; a +simply-expanded variable would not do, since `wildcard' would be called +only once at the time of defining `find_files'. + + The `foreach' function has no permanent effect on the variable VAR; +its value and flavor after the `foreach' function call are the same as +they were beforehand. The other values which are taken from LIST are +in effect only temporarily, during the execution of `foreach'. The +variable VAR is a simply-expanded variable during the execution of +`foreach'. If VAR was undefined before the `foreach' function call, it +is undefined after the call. *Note The Two Flavors of Variables: +Flavors. + + You must take care when using complex variable expressions that +result in variable names because many strange things are valid variable +names, but are probably not what you intended. For example, + + files := $(foreach Esta escrito en espanol!,b c ch,$(find_files)) + +might be useful if the value of `find_files' references the variable +whose name is `Esta escrito en espanol!' (es un nombre bastante largo, +no?), but it is more likely to be a mistake. + + +File: make.info, Node: Call Function, Next: Value Function, Prev: Foreach Function, Up: Functions + +8.6 The `call' Function +======================= + +The `call' function is unique in that it can be used to create new +parameterized functions. You can write a complex expression as the +value of a variable, then use `call' to expand it with different values. + + The syntax of the `call' function is: + + $(call VARIABLE,PARAM,PARAM,...) + + When `make' expands this function, it assigns each PARAM to +temporary variables `$(1)', `$(2)', etc. The variable `$(0)' will +contain VARIABLE. There is no maximum number of parameter arguments. +There is no minimum, either, but it doesn't make sense to use `call' +with no parameters. + + Then VARIABLE is expanded as a `make' variable in the context of +these temporary assignments. Thus, any reference to `$(1)' in the +value of VARIABLE will resolve to the first PARAM in the invocation of +`call'. + + Note that VARIABLE is the _name_ of a variable, not a _reference_ to +that variable. Therefore you would not normally use a `$' or +parentheses when writing it. (You can, however, use a variable +reference in the name if you want the name not to be a constant.) + + If VARIABLE is the name of a builtin function, the builtin function +is always invoked (even if a `make' variable by that name also exists). + + The `call' function expands the PARAM arguments before assigning +them to temporary variables. This means that VARIABLE values +containing references to builtin functions that have special expansion +rules, like `foreach' or `if', may not work as you expect. + + Some examples may make this clearer. + + This macro simply reverses its arguments: + + reverse = $(2) $(1) + + foo = $(call reverse,a,b) + +Here FOO will contain `b a'. + + This one is slightly more interesting: it defines a macro to search +for the first instance of a program in `PATH': + + pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH))))) + + LS := $(call pathsearch,ls) + +Now the variable LS contains `/bin/ls' or similar. + + The `call' function can be nested. Each recursive invocation gets +its own local values for `$(1)', etc. that mask the values of +higher-level `call'. For example, here is an implementation of a "map" +function: + + map = $(foreach a,$(2),$(call $(1),$(a))) + + Now you can MAP a function that normally takes only one argument, +such as `origin', to multiple values in one step: + + o = $(call map,origin,o map MAKE) + + and end up with O containing something like `file file default'. + + A final caution: be careful when adding whitespace to the arguments +to `call'. As with other functions, any whitespace contained in the +second and subsequent arguments is kept; this can cause strange +effects. It's generally safest to remove all extraneous whitespace when +providing parameters to `call'. + + +File: make.info, Node: Value Function, Next: Eval Function, Prev: Call Function, Up: Functions + +8.7 The `value' Function +======================== + +The `value' function provides a way for you to use the value of a +variable _without_ having it expanded. Please note that this does not +undo expansions which have already occurred; for example if you create +a simply expanded variable its value is expanded during the definition; +in that case the `value' function will return the same result as using +the variable directly. + + The syntax of the `value' function is: + + $(value VARIABLE) + + Note that VARIABLE is the _name_ of a variable; not a _reference_ to +that variable. Therefore you would not normally use a `$' or +parentheses when writing it. (You can, however, use a variable +reference in the name if you want the name not to be a constant.) + + The result of this function is a string containing the value of +VARIABLE, without any expansion occurring. For example, in this +makefile: + + FOO = $PATH + + all: + @echo $(FOO) + @echo $(value FOO) + +The first output line would be `ATH', since the "$P" would be expanded +as a `make' variable, while the second output line would be the current +value of your `$PATH' environment variable, since the `value' function +avoided the expansion. + + The `value' function is most often used in conjunction with the +`eval' function (*note Eval Function::). + + +File: make.info, Node: Eval Function, Next: Origin Function, Prev: Value Function, Up: Functions + +8.8 The `eval' Function +======================= + +The `eval' function is very special: it allows you to define new +makefile constructs that are not constant; which are the result of +evaluating other variables and functions. The argument to the `eval' +function is expanded, then the results of that expansion are parsed as +makefile syntax. The expanded results can define new `make' variables, +targets, implicit or explicit rules, etc. + + The result of the `eval' function is always the empty string; thus, +it can be placed virtually anywhere in a makefile without causing +syntax errors. + + It's important to realize that the `eval' argument is expanded +_twice_; first by the `eval' function, then the results of that +expansion are expanded again when they are parsed as makefile syntax. +This means you may need to provide extra levels of escaping for "$" +characters when using `eval'. The `value' function (*note Value +Function::) can sometimes be useful in these situations, to circumvent +unwanted expansions. + + Here is an example of how `eval' can be used; this example combines +a number of concepts and other functions. Although it might seem +overly complex to use `eval' in this example, rather than just writing +out the rules, consider two things: first, the template definition (in +`PROGRAM_template') could need to be much more complex than it is here; +and second, you might put the complex, "generic" part of this example +into another makefile, then include it in all the individual makefiles. +Now your individual makefiles are quite straightforward. + + PROGRAMS = server client + + server_OBJS = server.o server_priv.o server_access.o + server_LIBS = priv protocol + + client_OBJS = client.o client_api.o client_mem.o + client_LIBS = protocol + + # Everything after this is generic + + .PHONY: all + all: $(PROGRAMS) + + define PROGRAM_template = + $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) + ALL_OBJS += $$($(1)_OBJS) + endef + + $(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog)))) + + $(PROGRAMS): + $(LINK.o) $^ $(LDLIBS) -o $@ + + clean: + rm -f $(ALL_OBJS) $(PROGRAMS) + + +File: make.info, Node: Origin Function, Next: Flavor Function, Prev: Eval Function, Up: Functions + +8.9 The `origin' Function +========================= + +The `origin' function is unlike most other functions in that it does +not operate on the values of variables; it tells you something _about_ +a variable. Specifically, it tells you where it came from. + + The syntax of the `origin' function is: + + $(origin VARIABLE) + + Note that VARIABLE is the _name_ of a variable to inquire about; not +a _reference_ to that variable. Therefore you would not normally use a +`$' or parentheses when writing it. (You can, however, use a variable +reference in the name if you want the name not to be a constant.) + + The result of this function is a string telling you how the variable +VARIABLE was defined: + +`undefined' + if VARIABLE was never defined. + +`default' + if VARIABLE has a default definition, as is usual with `CC' and so + on. *Note Variables Used by Implicit Rules: Implicit Variables. + Note that if you have redefined a default variable, the `origin' + function will return the origin of the later definition. + +`environment' + if VARIABLE was inherited from the environment provided to `make'. + +`environment override' + if VARIABLE was inherited from the environment provided to `make', + and is overriding a setting for VARIABLE in the makefile as a + result of the `-e' option (*note Summary of Options: Options + Summary.). + +`file' + if VARIABLE was defined in a makefile. + +`command line' + if VARIABLE was defined on the command line. + +`override' + if VARIABLE was defined with an `override' directive in a makefile + (*note The `override' Directive: Override Directive.). + +`automatic' + if VARIABLE is an automatic variable defined for the execution of + the recipe for each rule (*note Automatic Variables::). + + This information is primarily useful (other than for your curiosity) +to determine if you want to believe the value of a variable. For +example, suppose you have a makefile `foo' that includes another +makefile `bar'. You want a variable `bletch' to be defined in `bar' if +you run the command `make -f bar', even if the environment contains a +definition of `bletch'. However, if `foo' defined `bletch' before +including `bar', you do not want to override that definition. This +could be done by using an `override' directive in `foo', giving that +definition precedence over the later definition in `bar'; +unfortunately, the `override' directive would also override any command +line definitions. So, `bar' could include: + + ifdef bletch + ifeq "$(origin bletch)" "environment" + bletch = barf, gag, etc. + endif + endif + +If `bletch' has been defined from the environment, this will redefine +it. + + If you want to override a previous definition of `bletch' if it came +from the environment, even under `-e', you could instead write: + + ifneq "$(findstring environment,$(origin bletch))" "" + bletch = barf, gag, etc. + endif + + Here the redefinition takes place if `$(origin bletch)' returns +either `environment' or `environment override'. *Note Functions for +String Substitution and Analysis: Text Functions. + + +File: make.info, Node: Flavor Function, Next: Shell Function, Prev: Origin Function, Up: Functions + +8.10 The `flavor' Function +========================== + +The `flavor' function is unlike most other functions (and like `origin' +function) in that it does not operate on the values of variables; it +tells you something _about_ a variable. Specifically, it tells you the +flavor of a variable (*note The Two Flavors of Variables: Flavors.). + + The syntax of the `flavor' function is: + + $(flavor VARIABLE) + + Note that VARIABLE is the _name_ of a variable to inquire about; not +a _reference_ to that variable. Therefore you would not normally use a +`$' or parentheses when writing it. (You can, however, use a variable +reference in the name if you want the name not to be a constant.) + + The result of this function is a string that identifies the flavor +of the variable VARIABLE: + +`undefined' + if VARIABLE was never defined. + +`recursive' + if VARIABLE is a recursively expanded variable. + +`simple' + if VARIABLE is a simply expanded variable. + + + +File: make.info, Node: Shell Function, Next: Make Control Functions, Prev: Flavor Function, Up: Functions + +8.11 The `shell' Function +========================= + +The `shell' function is unlike any other function other than the +`wildcard' function (*note The Function `wildcard': Wildcard Function.) +in that it communicates with the world outside of `make'. + + The `shell' function performs the same function that backquotes +(``') perform in most shells: it does "command expansion". This means +that it takes as an argument a shell command and evaluates to the +output of the command. The only processing `make' does on the result +is to convert each newline (or carriage-return / newline pair) to a +single space. If there is a trailing (carriage-return and) newline it +will simply be removed. + + The commands run by calls to the `shell' function are run when the +function calls are expanded (*note How `make' Reads a Makefile: Reading +Makefiles.). Because this function involves spawning a new shell, you +should carefully consider the performance implications of using the +`shell' function within recursively expanded variables vs. simply +expanded variables (*note The Two Flavors of Variables: Flavors.). + + Here are some examples of the use of the `shell' function: + + contents := $(shell cat foo) + +sets `contents' to the contents of the file `foo', with a space (rather +than a newline) separating each line. + + files := $(shell echo *.c) + +sets `files' to the expansion of `*.c'. Unless `make' is using a very +strange shell, this has the same result as `$(wildcard *.c)' (as long +as at least one `.c' file exists). + + +File: make.info, Node: Make Control Functions, Prev: Shell Function, Up: Functions + +8.12 Functions That Control Make +================================ + +These functions control the way make runs. Generally, they are used to +provide information to the user of the makefile or to cause make to stop +if some sort of environmental error is detected. + +`$(error TEXT...)' + Generates a fatal error where the message is TEXT. Note that the + error is generated whenever this function is evaluated. So, if + you put it inside a recipe or on the right side of a recursive + variable assignment, it won't be evaluated until later. The TEXT + will be expanded before the error is generated. + + For example, + + ifdef ERROR1 + $(error error is $(ERROR1)) + endif + + will generate a fatal error during the read of the makefile if the + `make' variable `ERROR1' is defined. Or, + + ERR = $(error found an error!) + + .PHONY: err + err: ; $(ERR) + + will generate a fatal error while `make' is running, if the `err' + target is invoked. + +`$(warning TEXT...)' + This function works similarly to the `error' function, above, + except that `make' doesn't exit. Instead, TEXT is expanded and + the resulting message is displayed, but processing of the makefile + continues. + + The result of the expansion of this function is the empty string. + +`$(info TEXT...)' + This function does nothing more than print its (expanded) + argument(s) to standard output. No makefile name or line number + is added. The result of the expansion of this function is the + empty string. + + +File: make.info, Node: Running, Next: Implicit Rules, Prev: Functions, Up: Top + +9 How to Run `make' +******************* + +A makefile that says how to recompile a program can be used in more +than one way. The simplest use is to recompile every file that is out +of date. Usually, makefiles are written so that if you run `make' with +no arguments, it does just that. + + But you might want to update only some of the files; you might want +to use a different compiler or different compiler options; you might +want just to find out which files are out of date without changing them. + + By giving arguments when you run `make', you can do any of these +things and many others. + + The exit status of `make' is always one of three values: +`0' + The exit status is zero if `make' is successful. + +`2' + The exit status is two if `make' encounters any errors. It will + print messages describing the particular errors. + +`1' + The exit status is one if you use the `-q' flag and `make' + determines that some target is not already up to date. *Note + Instead of Executing Recipes: Instead of Execution. + +* Menu: + +* Makefile Arguments:: How to specify which makefile to use. +* Goals:: How to use goal arguments to specify which + parts of the makefile to use. +* Instead of Execution:: How to use mode flags to specify what + kind of thing to do with the recipes + in the makefile other than simply + execute them. +* Avoiding Compilation:: How to avoid recompiling certain files. +* Overriding:: How to override a variable to specify + an alternate compiler and other things. +* Testing:: How to proceed past some errors, to + test compilation. +* Options Summary:: Summary of Options + + +File: make.info, Node: Makefile Arguments, Next: Goals, Prev: Running, Up: Running + +9.1 Arguments to Specify the Makefile +===================================== + +The way to specify the name of the makefile is with the `-f' or +`--file' option (`--makefile' also works). For example, `-f altmake' +says to use the file `altmake' as the makefile. + + If you use the `-f' flag several times and follow each `-f' with an +argument, all the specified files are used jointly as makefiles. + + If you do not use the `-f' or `--file' flag, the default is to try +`GNUmakefile', `makefile', and `Makefile', in that order, and use the +first of these three which exists or can be made (*note Writing +Makefiles: Makefiles.). + + +File: make.info, Node: Goals, Next: Instead of Execution, Prev: Makefile Arguments, Up: Running + +9.2 Arguments to Specify the Goals +================================== + +The "goals" are the targets that `make' should strive ultimately to +update. Other targets are updated as well if they appear as +prerequisites of goals, or prerequisites of prerequisites of goals, etc. + + By default, the goal is the first target in the makefile (not +counting targets that start with a period). Therefore, makefiles are +usually written so that the first target is for compiling the entire +program or programs they describe. If the first rule in the makefile +has several targets, only the first target in the rule becomes the +default goal, not the whole list. You can manage the selection of the +default goal from within your makefile using the `.DEFAULT_GOAL' +variable (*note Other Special Variables: Special Variables.). + + You can also specify a different goal or goals with command line +arguments to `make'. Use the name of the goal as an argument. If you +specify several goals, `make' processes each of them in turn, in the +order you name them. + + Any target in the makefile may be specified as a goal (unless it +starts with `-' or contains an `=', in which case it will be parsed as +a switch or variable definition, respectively). Even targets not in +the makefile may be specified, if `make' can find implicit rules that +say how to make them. + + `Make' will set the special variable `MAKECMDGOALS' to the list of +goals you specified on the command line. If no goals were given on the +command line, this variable is empty. Note that this variable should +be used only in special circumstances. + + An example of appropriate use is to avoid including `.d' files +during `clean' rules (*note Automatic Prerequisites::), so `make' won't +create them only to immediately remove them again: + + sources = foo.c bar.c + + ifneq ($(MAKECMDGOALS),clean) + include $(sources:.c=.d) + endif + + One use of specifying a goal is if you want to compile only a part of +the program, or only one of several programs. Specify as a goal each +file that you wish to remake. For example, consider a directory +containing several programs, with a makefile that starts like this: + + .PHONY: all + all: size nm ld ar as + + If you are working on the program `size', you might want to say +`make size' so that only the files of that program are recompiled. + + Another use of specifying a goal is to make files that are not +normally made. For example, there may be a file of debugging output, +or a version of the program that is compiled specially for testing, +which has a rule in the makefile but is not a prerequisite of the +default goal. + + Another use of specifying a goal is to run the recipe associated with +a phony target (*note Phony Targets::) or empty target (*note Empty +Target Files to Record Events: Empty Targets.). Many makefiles contain +a phony target named `clean' which deletes everything except source +files. Naturally, this is done only if you request it explicitly with +`make clean'. Following is a list of typical phony and empty target +names. *Note Standard Targets::, for a detailed list of all the +standard target names which GNU software packages use. + +`all' + Make all the top-level targets the makefile knows about. + +`clean' + Delete all files that are normally created by running `make'. + +`mostlyclean' + Like `clean', but may refrain from deleting a few files that people + normally don't want to recompile. For example, the `mostlyclean' + target for GCC does not delete `libgcc.a', because recompiling it + is rarely necessary and takes a lot of time. + +`distclean' +`realclean' +`clobber' + Any of these targets might be defined to delete _more_ files than + `clean' does. For example, this would delete configuration files + or links that you would normally create as preparation for + compilation, even if the makefile itself cannot create these files. + +`install' + Copy the executable file into a directory that users typically + search for commands; copy any auxiliary files that the executable + uses into the directories where it will look for them. + +`print' + Print listings of the source files that have changed. + +`tar' + Create a tar file of the source files. + +`shar' + Create a shell archive (shar file) of the source files. + +`dist' + Create a distribution file of the source files. This might be a + tar file, or a shar file, or a compressed version of one of the + above, or even more than one of the above. + +`TAGS' + Update a tags table for this program. + +`check' +`test' + Perform self tests on the program this makefile builds. + + +File: make.info, Node: Instead of Execution, Next: Avoiding Compilation, Prev: Goals, Up: Running + +9.3 Instead of Executing Recipes +================================ + +The makefile tells `make' how to tell whether a target is up to date, +and how to update each target. But updating the targets is not always +what you want. Certain options specify other activities for `make'. + +`-n' +`--just-print' +`--dry-run' +`--recon' + "No-op". The activity is to print what recipe would be used to + make the targets up to date, but not actually execute it. Some + recipes are still executed, even with this flag (*note How the + `MAKE' Variable Works: MAKE Variable.). + +`-t' +`--touch' + "Touch". The activity is to mark the targets as up to date without + actually changing them. In other words, `make' pretends to compile + the targets but does not really change their contents. + +`-q' +`--question' + "Question". The activity is to find out silently whether the + targets are up to date already; but execute no recipe in either + case. In other words, neither compilation nor output will occur. + +`-W FILE' +`--what-if=FILE' +`--assume-new=FILE' +`--new-file=FILE' + "What if". Each `-W' flag is followed by a file name. The given + files' modification times are recorded by `make' as being the + present time, although the actual modification times remain the + same. You can use the `-W' flag in conjunction with the `-n' flag + to see what would happen if you were to modify specific files. + + With the `-n' flag, `make' prints the recipe that it would normally +execute but usually does not execute it. + + With the `-t' flag, `make' ignores the recipes in the rules and uses +(in effect) the command `touch' for each target that needs to be +remade. The `touch' command is also printed, unless `-s' or `.SILENT' +is used. For speed, `make' does not actually invoke the program +`touch'. It does the work directly. + + With the `-q' flag, `make' prints nothing and executes no recipes, +but the exit status code it returns is zero if and only if the targets +to be considered are already up to date. If the exit status is one, +then some updating needs to be done. If `make' encounters an error, +the exit status is two, so you can distinguish an error from a target +that is not up to date. + + It is an error to use more than one of these three flags in the same +invocation of `make'. + + The `-n', `-t', and `-q' options do not affect recipe lines that +begin with `+' characters or contain the strings `$(MAKE)' or +`${MAKE}'. Note that only the line containing the `+' character or the +strings `$(MAKE)' or `${MAKE}' is run regardless of these options. +Other lines in the same rule are not run unless they too begin with `+' +or contain `$(MAKE)' or `${MAKE}' (*Note How the `MAKE' Variable Works: +MAKE Variable.) + + The `-t' flag prevents phony targets (*note Phony Targets::) from +being updated, unless there are recipe lines beginning with `+' or +containing `$(MAKE)' or `${MAKE}'. + + The `-W' flag provides two features: + + * If you also use the `-n' or `-q' flag, you can see what `make' + would do if you were to modify some files. + + * Without the `-n' or `-q' flag, when `make' is actually executing + recipes, the `-W' flag can direct `make' to act as if some files + had been modified, without actually running the recipes for those + files. + + Note that the options `-p' and `-v' allow you to obtain other +information about `make' or about the makefiles in use (*note Summary +of Options: Options Summary.). + + +File: make.info, Node: Avoiding Compilation, Next: Overriding, Prev: Instead of Execution, Up: Running + +9.4 Avoiding Recompilation of Some Files +======================================== + +Sometimes you may have changed a source file but you do not want to +recompile all the files that depend on it. For example, suppose you add +a macro or a declaration to a header file that many other files depend +on. Being conservative, `make' assumes that any change in the header +file requires recompilation of all dependent files, but you know that +they do not need to be recompiled and you would rather not waste the +time waiting for them to compile. + + If you anticipate the problem before changing the header file, you +can use the `-t' flag. This flag tells `make' not to run the recipes +in the rules, but rather to mark the target up to date by changing its +last-modification date. You would follow this procedure: + + 1. Use the command `make' to recompile the source files that really + need recompilation, ensuring that the object files are up-to-date + before you begin. + + 2. Make the changes in the header files. + + 3. Use the command `make -t' to mark all the object files as up to + date. The next time you run `make', the changes in the header + files will not cause any recompilation. + + If you have already changed the header file at a time when some files +do need recompilation, it is too late to do this. Instead, you can use +the `-o FILE' flag, which marks a specified file as "old" (*note +Summary of Options: Options Summary.). This means that the file itself +will not be remade, and nothing else will be remade on its account. +Follow this procedure: + + 1. Recompile the source files that need compilation for reasons + independent of the particular header file, with `make -o + HEADERFILE'. If several header files are involved, use a separate + `-o' option for each header file. + + 2. Touch all the object files with `make -t'. + + +File: make.info, Node: Overriding, Next: Testing, Prev: Avoiding Compilation, Up: Running + +9.5 Overriding Variables +======================== + +An argument that contains `=' specifies the value of a variable: `V=X' +sets the value of the variable V to X. If you specify a value in this +way, all ordinary assignments of the same variable in the makefile are +ignored; we say they have been "overridden" by the command line +argument. + + The most common way to use this facility is to pass extra flags to +compilers. For example, in a properly written makefile, the variable +`CFLAGS' is included in each recipe that runs the C compiler, so a file +`foo.c' would be compiled something like this: + + cc -c $(CFLAGS) foo.c + + Thus, whatever value you set for `CFLAGS' affects each compilation +that occurs. The makefile probably specifies the usual value for +`CFLAGS', like this: + + CFLAGS=-g + + Each time you run `make', you can override this value if you wish. +For example, if you say `make CFLAGS='-g -O'', each C compilation will +be done with `cc -c -g -O'. (This also illustrates how you can use +quoting in the shell to enclose spaces and other special characters in +the value of a variable when you override it.) + + The variable `CFLAGS' is only one of many standard variables that +exist just so that you can change them this way. *Note Variables Used +by Implicit Rules: Implicit Variables, for a complete list. + + You can also program the makefile to look at additional variables of +your own, giving the user the ability to control other aspects of how +the makefile works by changing the variables. + + When you override a variable with a command line argument, you can +define either a recursively-expanded variable or a simply-expanded +variable. The examples shown above make a recursively-expanded +variable; to make a simply-expanded variable, write `:=' instead of +`='. But, unless you want to include a variable reference or function +call in the _value_ that you specify, it makes no difference which kind +of variable you create. + + There is one way that the makefile can change a variable that you +have overridden. This is to use the `override' directive, which is a +line that looks like this: `override VARIABLE = VALUE' (*note The +`override' Directive: Override Directive.). + + +File: make.info, Node: Testing, Next: Options Summary, Prev: Overriding, Up: Running + +9.6 Testing the Compilation of a Program +======================================== + +Normally, when an error happens in executing a shell command, `make' +gives up immediately, returning a nonzero status. No further recipes +are executed for any target. The error implies that the goal cannot be +correctly remade, and `make' reports this as soon as it knows. + + When you are compiling a program that you have just changed, this is +not what you want. Instead, you would rather that `make' try compiling +every file that can be tried, to show you as many compilation errors as +possible. + + On these occasions, you should use the `-k' or `--keep-going' flag. +This tells `make' to continue to consider the other prerequisites of +the pending targets, remaking them if necessary, before it gives up and +returns nonzero status. For example, after an error in compiling one +object file, `make -k' will continue compiling other object files even +though it already knows that linking them will be impossible. In +addition to continuing after failed shell commands, `make -k' will +continue as much as possible after discovering that it does not know +how to make a target or prerequisite file. This will always cause an +error message, but without `-k', it is a fatal error (*note Summary of +Options: Options Summary.). + + The usual behavior of `make' assumes that your purpose is to get the +goals up to date; once `make' learns that this is impossible, it might +as well report the failure immediately. The `-k' flag says that the +real purpose is to test as much as possible of the changes made in the +program, perhaps to find several independent problems so that you can +correct them all before the next attempt to compile. This is why Emacs' +`M-x compile' command passes the `-k' flag by default. + + +File: make.info, Node: Options Summary, Prev: Testing, Up: Running + +9.7 Summary of Options +====================== + +Here is a table of all the options `make' understands: + +`-b' +`-m' + These options are ignored for compatibility with other versions of + `make'. + +`-B' +`--always-make' + Consider all targets out-of-date. GNU `make' proceeds to consider + targets and their prerequisites using the normal algorithms; + however, all targets so considered are always remade regardless of + the status of their prerequisites. To avoid infinite recursion, if + `MAKE_RESTARTS' (*note Other Special Variables: Special + Variables.) is set to a number greater than 0 this option is + disabled when considering whether to remake makefiles (*note How + Makefiles Are Remade: Remaking Makefiles.). + +`-C DIR' +`--directory=DIR' + Change to directory DIR before reading the makefiles. If multiple + `-C' options are specified, each is interpreted relative to the + previous one: `-C / -C etc' is equivalent to `-C /etc'. This is + typically used with recursive invocations of `make' (*note + Recursive Use of `make': Recursion.). + +`-d' + Print debugging information in addition to normal processing. The + debugging information says which files are being considered for + remaking, which file-times are being compared and with what + results, which files actually need to be remade, which implicit + rules are considered and which are applied--everything interesting + about how `make' decides what to do. The `-d' option is + equivalent to `--debug=a' (see below). + +`--debug[=OPTIONS]' + Print debugging information in addition to normal processing. + Various levels and types of output can be chosen. With no + arguments, print the "basic" level of debugging. Possible + arguments are below; only the first character is considered, and + values must be comma- or space-separated. + + `a (all)' + All types of debugging output are enabled. This is + equivalent to using `-d'. + + `b (basic)' + Basic debugging prints each target that was found to be + out-of-date, and whether the build was successful or not. + + `v (verbose)' + A level above `basic'; includes messages about which + makefiles were parsed, prerequisites that did not need to be + rebuilt, etc. This option also enables `basic' messages. + + `i (implicit)' + Prints messages describing the implicit rule searches for + each target. This option also enables `basic' messages. + + `j (jobs)' + Prints messages giving details on the invocation of specific + subcommands. + + `m (makefile)' + By default, the above messages are not enabled while trying + to remake the makefiles. This option enables messages while + rebuilding makefiles, too. Note that the `all' option does + enable this option. This option also enables `basic' + messages. + +`-e' +`--environment-overrides' + Give variables taken from the environment precedence over + variables from makefiles. *Note Variables from the Environment: + Environment. + +`--eval=STRING' + Evaluate STRING as makefile syntax. This is a command-line + version of the `eval' function (*note Eval Function::). The + evaluation is performed after the default rules and variables have + been defined, but before any makefiles are read. + +`-f FILE' +`--file=FILE' +`--makefile=FILE' + Read the file named FILE as a makefile. *Note Writing Makefiles: + Makefiles. + +`-h' +`--help' + Remind you of the options that `make' understands and then exit. + +`-i' +`--ignore-errors' + Ignore all errors in recipes executed to remake files. *Note + Errors in Recipes: Errors. + +`-I DIR' +`--include-dir=DIR' + Specifies a directory DIR to search for included makefiles. *Note + Including Other Makefiles: Include. If several `-I' options are + used to specify several directories, the directories are searched + in the order specified. + +`-j [JOBS]' +`--jobs[=JOBS]' + Specifies the number of recipes (jobs) to run simultaneously. + With no argument, `make' runs as many recipes simultaneously as + possible. If there is more than one `-j' option, the last one is + effective. *Note Parallel Execution: Parallel, for more + information on how recipes are run. Note that this option is + ignored on MS-DOS. + +`-k' +`--keep-going' + Continue as much as possible after an error. While the target that + failed, and those that depend on it, cannot be remade, the other + prerequisites of these targets can be processed all the same. + *Note Testing the Compilation of a Program: Testing. + +`-l [LOAD]' +`--load-average[=LOAD]' +`--max-load[=LOAD]' + Specifies that no new recipes should be started if there are other + recipes running and the load average is at least LOAD (a + floating-point number). With no argument, removes a previous load + limit. *Note Parallel Execution: Parallel. + +`-L' +`--check-symlink-times' + On systems that support symbolic links, this option causes `make' + to consider the timestamps on any symbolic links in addition to the + timestamp on the file referenced by those links. When this option + is provided, the most recent timestamp among the file and the + symbolic links is taken as the modification time for this target + file. + +`-n' +`--just-print' +`--dry-run' +`--recon' + Print the recipe that would be executed, but do not execute it + (except in certain circumstances). *Note Instead of Executing + Recipes: Instead of Execution. + +`-o FILE' +`--old-file=FILE' +`--assume-old=FILE' + Do not remake the file FILE even if it is older than its + prerequisites, and do not remake anything on account of changes in + FILE. Essentially the file is treated as very old and its rules + are ignored. *Note Avoiding Recompilation of Some Files: Avoiding + Compilation. + +`-p' +`--print-data-base' + Print the data base (rules and variable values) that results from + reading the makefiles; then execute as usual or as otherwise + specified. This also prints the version information given by the + `-v' switch (see below). To print the data base without trying to + remake any files, use `make -qp'. To print the data base of + predefined rules and variables, use `make -p -f /dev/null'. The + data base output contains filename and linenumber information for + recipe and variable definitions, so it can be a useful debugging + tool in complex environments. + +`-q' +`--question' + "Question mode". Do not run any recipes, or print anything; just + return an exit status that is zero if the specified targets are + already up to date, one if any remaking is required, or two if an + error is encountered. *Note Instead of Executing Recipes: Instead + of Execution. + +`-r' +`--no-builtin-rules' + Eliminate use of the built-in implicit rules (*note Using Implicit + Rules: Implicit Rules.). You can still define your own by writing + pattern rules (*note Defining and Redefining Pattern Rules: + Pattern Rules.). The `-r' option also clears out the default list + of suffixes for suffix rules (*note Old-Fashioned Suffix Rules: + Suffix Rules.). But you can still define your own suffixes with a + rule for `.SUFFIXES', and then define your own suffix rules. Note + that only _rules_ are affected by the `-r' option; default + variables remain in effect (*note Variables Used by Implicit + Rules: Implicit Variables.); see the `-R' option below. + +`-R' +`--no-builtin-variables' + Eliminate use of the built-in rule-specific variables (*note + Variables Used by Implicit Rules: Implicit Variables.). You can + still define your own, of course. The `-R' option also + automatically enables the `-r' option (see above), since it + doesn't make sense to have implicit rules without any definitions + for the variables that they use. + +`-s' +`--silent' +`--quiet' + Silent operation; do not print the recipes as they are executed. + *Note Recipe Echoing: Echoing. + +`-S' +`--no-keep-going' +`--stop' + Cancel the effect of the `-k' option. This is never necessary + except in a recursive `make' where `-k' might be inherited from + the top-level `make' via `MAKEFLAGS' (*note Recursive Use of + `make': Recursion.) or if you set `-k' in `MAKEFLAGS' in your + environment. + +`-t' +`--touch' + Touch files (mark them up to date without really changing them) + instead of running their recipes. This is used to pretend that the + recipes were done, in order to fool future invocations of `make'. + *Note Instead of Executing Recipes: Instead of Execution. + +`-v' +`--version' + Print the version of the `make' program plus a copyright, a list + of authors, and a notice that there is no warranty; then exit. + +`-w' +`--print-directory' + Print a message containing the working directory both before and + after executing the makefile. This may be useful for tracking + down errors from complicated nests of recursive `make' commands. + *Note Recursive Use of `make': Recursion. (In practice, you + rarely need to specify this option since `make' does it for you; + see *note The `--print-directory' Option: -w Option.) + +`--no-print-directory' + Disable printing of the working directory under `-w'. This option + is useful when `-w' is turned on automatically, but you do not + want to see the extra messages. *Note The `--print-directory' + Option: -w Option. + +`-W FILE' +`--what-if=FILE' +`--new-file=FILE' +`--assume-new=FILE' + Pretend that the target FILE has just been modified. When used + with the `-n' flag, this shows you what would happen if you were + to modify that file. Without `-n', it is almost the same as + running a `touch' command on the given file before running `make', + except that the modification time is changed only in the + imagination of `make'. *Note Instead of Executing Recipes: + Instead of Execution. + +`--warn-undefined-variables' + Issue a warning message whenever `make' sees a reference to an + undefined variable. This can be helpful when you are trying to + debug makefiles which use variables in complex ways. + + +File: make.info, Node: Implicit Rules, Next: Archives, Prev: Running, Up: Top + +10 Using Implicit Rules +*********************** + +Certain standard ways of remaking target files are used very often. For +example, one customary way to make an object file is from a C source +file using the C compiler, `cc'. + + "Implicit rules" tell `make' how to use customary techniques so that +you do not have to specify them in detail when you want to use them. +For example, there is an implicit rule for C compilation. File names +determine which implicit rules are run. For example, C compilation +typically takes a `.c' file and makes a `.o' file. So `make' applies +the implicit rule for C compilation when it sees this combination of +file name endings. + + A chain of implicit rules can apply in sequence; for example, `make' +will remake a `.o' file from a `.y' file by way of a `.c' file. + + The built-in implicit rules use several variables in their recipes so +that, by changing the values of the variables, you can change the way +the implicit rule works. For example, the variable `CFLAGS' controls +the flags given to the C compiler by the implicit rule for C +compilation. + + You can define your own implicit rules by writing "pattern rules". + + "Suffix rules" are a more limited way to define implicit rules. +Pattern rules are more general and clearer, but suffix rules are +retained for compatibility. + +* Menu: + +* Using Implicit:: How to use an existing implicit rule + to get the recipes for updating a file. +* Catalogue of Rules:: A list of built-in implicit rules. +* Implicit Variables:: How to change what predefined rules do. +* Chained Rules:: How to use a chain of implicit rules. +* Pattern Rules:: How to define new implicit rules. +* Last Resort:: How to define recipes for rules which + cannot find any. +* Suffix Rules:: The old-fashioned style of implicit rule. +* Implicit Rule Search:: The precise algorithm for applying + implicit rules. + + +File: make.info, Node: Using Implicit, Next: Catalogue of Rules, Prev: Implicit Rules, Up: Implicit Rules + +10.1 Using Implicit Rules +========================= + +To allow `make' to find a customary method for updating a target file, +all you have to do is refrain from specifying recipes yourself. Either +write a rule with no recipe, or don't write a rule at all. Then `make' +will figure out which implicit rule to use based on which kind of +source file exists or can be made. + + For example, suppose the makefile looks like this: + + foo : foo.o bar.o + cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS) + +Because you mention `foo.o' but do not give a rule for it, `make' will +automatically look for an implicit rule that tells how to update it. +This happens whether or not the file `foo.o' currently exists. + + If an implicit rule is found, it can supply both a recipe and one or +more prerequisites (the source files). You would want to write a rule +for `foo.o' with no recipe if you need to specify additional +prerequisites, such as header files, that the implicit rule cannot +supply. + + Each implicit rule has a target pattern and prerequisite patterns. +There may be many implicit rules with the same target pattern. For +example, numerous rules make `.o' files: one, from a `.c' file with the +C compiler; another, from a `.p' file with the Pascal compiler; and so +on. The rule that actually applies is the one whose prerequisites +exist or can be made. So, if you have a file `foo.c', `make' will run +the C compiler; otherwise, if you have a file `foo.p', `make' will run +the Pascal compiler; and so on. + + Of course, when you write the makefile, you know which implicit rule +you want `make' to use, and you know it will choose that one because you +know which possible prerequisite files are supposed to exist. *Note +Catalogue of Implicit Rules: Catalogue of Rules, for a catalogue of all +the predefined implicit rules. + + Above, we said an implicit rule applies if the required +prerequisites "exist or can be made". A file "can be made" if it is +mentioned explicitly in the makefile as a target or a prerequisite, or +if an implicit rule can be recursively found for how to make it. When +an implicit prerequisite is the result of another implicit rule, we say +that "chaining" is occurring. *Note Chains of Implicit Rules: Chained +Rules. + + In general, `make' searches for an implicit rule for each target, and +for each double-colon rule, that has no recipe. A file that is +mentioned only as a prerequisite is considered a target whose rule +specifies nothing, so implicit rule search happens for it. *Note +Implicit Rule Search Algorithm: Implicit Rule Search, for the details +of how the search is done. + + Note that explicit prerequisites do not influence implicit rule +search. For example, consider this explicit rule: + + foo.o: foo.p + +The prerequisite on `foo.p' does not necessarily mean that `make' will +remake `foo.o' according to the implicit rule to make an object file, a +`.o' file, from a Pascal source file, a `.p' file. For example, if +`foo.c' also exists, the implicit rule to make an object file from a C +source file is used instead, because it appears before the Pascal rule +in the list of predefined implicit rules (*note Catalogue of Implicit +Rules: Catalogue of Rules.). + + If you do not want an implicit rule to be used for a target that has +no recipe, you can give that target an empty recipe by writing a +semicolon (*note Defining Empty Recipes: Empty Recipes.). + diff --git a/doc/make.info-2 b/doc/make.info-2 new file mode 100644 index 0000000..cd95ff0 --- /dev/null +++ b/doc/make.info-2 @@ -0,0 +1,5053 @@ +This is make.info, produced by makeinfo version 4.13 from make.texi. + +This file documents the GNU `make' utility, which determines +automatically which pieces of a large program need to be recompiled, +and issues the commands to recompile them. + + This is Edition 0.71, last updated 19 July 2010, of `The GNU Make +Manual', for GNU `make' version 3.82. + + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, +1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.2 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover Texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual. Buying copies from the FSF supports it in + developing GNU and promoting software freedom." + +INFO-DIR-SECTION Software development +START-INFO-DIR-ENTRY +* Make: (make). Remake files automatically. +END-INFO-DIR-ENTRY + + +File: make.info, Node: Catalogue of Rules, Next: Implicit Variables, Prev: Using Implicit, Up: Implicit Rules + +10.2 Catalogue of Implicit Rules +================================ + +Here is a catalogue of predefined implicit rules which are always +available unless the makefile explicitly overrides or cancels them. +*Note Canceling Implicit Rules: Canceling Rules, for information on +canceling or overriding an implicit rule. The `-r' or +`--no-builtin-rules' option cancels all predefined rules. + + This manual only documents the default rules available on POSIX-based +operating systems. Other operating systems, such as VMS, Windows, +OS/2, etc. may have different sets of default rules. To see the full +list of default rules and variables available in your version of GNU +`make', run `make -p' in a directory with no makefile. + + Not all of these rules will always be defined, even when the `-r' +option is not given. Many of the predefined implicit rules are +implemented in `make' as suffix rules, so which ones will be defined +depends on the "suffix list" (the list of prerequisites of the special +target `.SUFFIXES'). The default suffix list is: `.out', `.a', `.ln', +`.o', `.c', `.cc', `.C', `.cpp', `.p', `.f', `.F', `.m', `.r', `.y', +`.l', `.ym', `.lm', `.s', `.S', `.mod', `.sym', `.def', `.h', `.info', +`.dvi', `.tex', `.texinfo', `.texi', `.txinfo', `.w', `.ch' `.web', +`.sh', `.elc', `.el'. All of the implicit rules described below whose +prerequisites have one of these suffixes are actually suffix rules. If +you modify the suffix list, the only predefined suffix rules in effect +will be those named by one or two of the suffixes that are on the list +you specify; rules whose suffixes fail to be on the list are disabled. +*Note Old-Fashioned Suffix Rules: Suffix Rules, for full details on +suffix rules. + +Compiling C programs + `N.o' is made automatically from `N.c' with a recipe of the form + `$(CC) $(CPPFLAGS) $(CFLAGS) -c'. + +Compiling C++ programs + `N.o' is made automatically from `N.cc', `N.cpp', or `N.C' with a + recipe of the form `$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c'. We + encourage you to use the suffix `.cc' for C++ source files instead + of `.C'. + +Compiling Pascal programs + `N.o' is made automatically from `N.p' with the recipe `$(PC) + $(PFLAGS) -c'. + +Compiling Fortran and Ratfor programs + `N.o' is made automatically from `N.r', `N.F' or `N.f' by running + the Fortran compiler. The precise recipe used is as follows: + + `.f' + `$(FC) $(FFLAGS) -c'. + + `.F' + `$(FC) $(FFLAGS) $(CPPFLAGS) -c'. + + `.r' + `$(FC) $(FFLAGS) $(RFLAGS) -c'. + +Preprocessing Fortran and Ratfor programs + `N.f' is made automatically from `N.r' or `N.F'. This rule runs + just the preprocessor to convert a Ratfor or preprocessable + Fortran program into a strict Fortran program. The precise recipe + used is as follows: + + `.F' + `$(FC) $(CPPFLAGS) $(FFLAGS) -F'. + + `.r' + `$(FC) $(FFLAGS) $(RFLAGS) -F'. + +Compiling Modula-2 programs + `N.sym' is made from `N.def' with a recipe of the form `$(M2C) + $(M2FLAGS) $(DEFFLAGS)'. `N.o' is made from `N.mod'; the form is: + `$(M2C) $(M2FLAGS) $(MODFLAGS)'. + +Assembling and preprocessing assembler programs + `N.o' is made automatically from `N.s' by running the assembler, + `as'. The precise recipe is `$(AS) $(ASFLAGS)'. + + `N.s' is made automatically from `N.S' by running the C + preprocessor, `cpp'. The precise recipe is `$(CPP) $(CPPFLAGS)'. + +Linking a single object file + `N' is made automatically from `N.o' by running the linker + (usually called `ld') via the C compiler. The precise recipe used + is `$(CC) $(LDFLAGS) N.o $(LOADLIBES) $(LDLIBS)'. + + This rule does the right thing for a simple program with only one + source file. It will also do the right thing if there are multiple + object files (presumably coming from various other source files), + one of which has a name matching that of the executable file. + Thus, + + x: y.o z.o + + when `x.c', `y.c' and `z.c' all exist will execute: + + cc -c x.c -o x.o + cc -c y.c -o y.o + cc -c z.c -o z.o + cc x.o y.o z.o -o x + rm -f x.o + rm -f y.o + rm -f z.o + + In more complicated cases, such as when there is no object file + whose name derives from the executable file name, you must write + an explicit recipe for linking. + + Each kind of file automatically made into `.o' object files will + be automatically linked by using the compiler (`$(CC)', `$(FC)' or + `$(PC)'; the C compiler `$(CC)' is used to assemble `.s' files) + without the `-c' option. This could be done by using the `.o' + object files as intermediates, but it is faster to do the + compiling and linking in one step, so that's how it's done. + +Yacc for C programs + `N.c' is made automatically from `N.y' by running Yacc with the + recipe `$(YACC) $(YFLAGS)'. + +Lex for C programs + `N.c' is made automatically from `N.l' by running Lex. The actual + recipe is `$(LEX) $(LFLAGS)'. + +Lex for Ratfor programs + `N.r' is made automatically from `N.l' by running Lex. The actual + recipe is `$(LEX) $(LFLAGS)'. + + The convention of using the same suffix `.l' for all Lex files + regardless of whether they produce C code or Ratfor code makes it + impossible for `make' to determine automatically which of the two + languages you are using in any particular case. If `make' is + called upon to remake an object file from a `.l' file, it must + guess which compiler to use. It will guess the C compiler, because + that is more common. If you are using Ratfor, make sure `make' + knows this by mentioning `N.r' in the makefile. Or, if you are + using Ratfor exclusively, with no C files, remove `.c' from the + list of implicit rule suffixes with: + + .SUFFIXES: + .SUFFIXES: .o .r .f .l ... + +Making Lint Libraries from C, Yacc, or Lex programs + `N.ln' is made from `N.c' by running `lint'. The precise recipe + is `$(LINT) $(LINTFLAGS) $(CPPFLAGS) -i'. The same recipe is used + on the C code produced from `N.y' or `N.l'. + +TeX and Web + `N.dvi' is made from `N.tex' with the recipe `$(TEX)'. `N.tex' is + made from `N.web' with `$(WEAVE)', or from `N.w' (and from `N.ch' + if it exists or can be made) with `$(CWEAVE)'. `N.p' is made from + `N.web' with `$(TANGLE)' and `N.c' is made from `N.w' (and from + `N.ch' if it exists or can be made) with `$(CTANGLE)'. + +Texinfo and Info + `N.dvi' is made from `N.texinfo', `N.texi', or `N.txinfo', with + the recipe `$(TEXI2DVI) $(TEXI2DVI_FLAGS)'. `N.info' is made from + `N.texinfo', `N.texi', or `N.txinfo', with the recipe + `$(MAKEINFO) $(MAKEINFO_FLAGS)'. + +RCS + Any file `N' is extracted if necessary from an RCS file named + either `N,v' or `RCS/N,v'. The precise recipe used is + `$(CO) $(COFLAGS)'. `N' will not be extracted from RCS if it + already exists, even if the RCS file is newer. The rules for RCS + are terminal (*note Match-Anything Pattern Rules: Match-Anything + Rules.), so RCS files cannot be generated from another source; + they must actually exist. + +SCCS + Any file `N' is extracted if necessary from an SCCS file named + either `s.N' or `SCCS/s.N'. The precise recipe used is + `$(GET) $(GFLAGS)'. The rules for SCCS are terminal (*note + Match-Anything Pattern Rules: Match-Anything Rules.), so SCCS + files cannot be generated from another source; they must actually + exist. + + For the benefit of SCCS, a file `N' is copied from `N.sh' and made + executable (by everyone). This is for shell scripts that are + checked into SCCS. Since RCS preserves the execution permission + of a file, you do not need to use this feature with RCS. + + We recommend that you avoid using of SCCS. RCS is widely held to + be superior, and is also free. By choosing free software in place + of comparable (or inferior) proprietary software, you support the + free software movement. + + Usually, you want to change only the variables listed in the table +above, which are documented in the following section. + + However, the recipes in built-in implicit rules actually use +variables such as `COMPILE.c', `LINK.p', and `PREPROCESS.S', whose +values contain the recipes listed above. + + `make' follows the convention that the rule to compile a `.X' source +file uses the variable `COMPILE.X'. Similarly, the rule to produce an +executable from a `.X' file uses `LINK.X'; and the rule to preprocess a +`.X' file uses `PREPROCESS.X'. + + Every rule that produces an object file uses the variable +`OUTPUT_OPTION'. `make' defines this variable either to contain `-o +$@', or to be empty, depending on a compile-time option. You need the +`-o' option to ensure that the output goes into the right file when the +source file is in a different directory, as when using `VPATH' (*note +Directory Search::). However, compilers on some systems do not accept +a `-o' switch for object files. If you use such a system, and use +`VPATH', some compilations will put their output in the wrong place. A +possible workaround for this problem is to give `OUTPUT_OPTION' the +value `; mv $*.o $@'. + + +File: make.info, Node: Implicit Variables, Next: Chained Rules, Prev: Catalogue of Rules, Up: Implicit Rules + +10.3 Variables Used by Implicit Rules +===================================== + +The recipes in built-in implicit rules make liberal use of certain +predefined variables. You can alter the values of these variables in +the makefile, with arguments to `make', or in the environment to alter +how the implicit rules work without redefining the rules themselves. +You can cancel all variables used by implicit rules with the `-R' or +`--no-builtin-variables' option. + + For example, the recipe used to compile a C source file actually says +`$(CC) -c $(CFLAGS) $(CPPFLAGS)'. The default values of the variables +used are `cc' and nothing, resulting in the command `cc -c'. By +redefining `CC' to `ncc', you could cause `ncc' to be used for all C +compilations performed by the implicit rule. By redefining `CFLAGS' to +be `-g', you could pass the `-g' option to each compilation. _All_ +implicit rules that do C compilation use `$(CC)' to get the program +name for the compiler and _all_ include `$(CFLAGS)' among the arguments +given to the compiler. + + The variables used in implicit rules fall into two classes: those +that are names of programs (like `CC') and those that contain arguments +for the programs (like `CFLAGS'). (The "name of a program" may also +contain some command arguments, but it must start with an actual +executable program name.) If a variable value contains more than one +argument, separate them with spaces. + + The following tables describe of some of the more commonly-used +predefined variables. This list is not exhaustive, and the default +values shown here may not be what `make' selects for your environment. +To see the complete list of predefined variables for your instance of +GNU `make' you can run `make -p' in a directory with no makefiles. + + Here is a table of some of the more common variables used as names of +programs in built-in rules: makefiles. + +`AR' + Archive-maintaining program; default `ar'. + +`AS' + Program for compiling assembly files; default `as'. + +`CC' + Program for compiling C programs; default `cc'. + +`CXX' + Program for compiling C++ programs; default `g++'. + +`CPP' + Program for running the C preprocessor, with results to standard + output; default `$(CC) -E'. + +`FC' + Program for compiling or preprocessing Fortran and Ratfor programs; + default `f77'. + +`M2C' + Program to use to compile Modula-2 source code; default `m2c'. + +`PC' + Program for compiling Pascal programs; default `pc'. + +`CO' + Program for extracting a file from RCS; default `co'. + +`GET' + Program for extracting a file from SCCS; default `get'. + +`LEX' + Program to use to turn Lex grammars into source code; default + `lex'. + +`YACC' + Program to use to turn Yacc grammars into source code; default + `yacc'. + +`LINT' + Program to use to run lint on source code; default `lint'. + +`MAKEINFO' + Program to convert a Texinfo source file into an Info file; default + `makeinfo'. + +`TEX' + Program to make TeX DVI files from TeX source; default `tex'. + +`TEXI2DVI' + Program to make TeX DVI files from Texinfo source; default + `texi2dvi'. + +`WEAVE' + Program to translate Web into TeX; default `weave'. + +`CWEAVE' + Program to translate C Web into TeX; default `cweave'. + +`TANGLE' + Program to translate Web into Pascal; default `tangle'. + +`CTANGLE' + Program to translate C Web into C; default `ctangle'. + +`RM' + Command to remove a file; default `rm -f'. + + Here is a table of variables whose values are additional arguments +for the programs above. The default values for all of these is the +empty string, unless otherwise noted. + +`ARFLAGS' + Flags to give the archive-maintaining program; default `rv'. + +`ASFLAGS' + Extra flags to give to the assembler (when explicitly invoked on a + `.s' or `.S' file). + +`CFLAGS' + Extra flags to give to the C compiler. + +`CXXFLAGS' + Extra flags to give to the C++ compiler. + +`COFLAGS' + Extra flags to give to the RCS `co' program. + +`CPPFLAGS' + Extra flags to give to the C preprocessor and programs that use it + (the C and Fortran compilers). + +`FFLAGS' + Extra flags to give to the Fortran compiler. + +`GFLAGS' + Extra flags to give to the SCCS `get' program. + +`LDFLAGS' + Extra flags to give to compilers when they are supposed to invoke + the linker, `ld'. + +`LFLAGS' + Extra flags to give to Lex. + +`YFLAGS' + Extra flags to give to Yacc. + +`PFLAGS' + Extra flags to give to the Pascal compiler. + +`RFLAGS' + Extra flags to give to the Fortran compiler for Ratfor programs. + +`LINTFLAGS' + Extra flags to give to lint. + + +File: make.info, Node: Chained Rules, Next: Pattern Rules, Prev: Implicit Variables, Up: Implicit Rules + +10.4 Chains of Implicit Rules +============================= + +Sometimes a file can be made by a sequence of implicit rules. For +example, a file `N.o' could be made from `N.y' by running first Yacc +and then `cc'. Such a sequence is called a "chain". + + If the file `N.c' exists, or is mentioned in the makefile, no +special searching is required: `make' finds that the object file can be +made by C compilation from `N.c'; later on, when considering how to +make `N.c', the rule for running Yacc is used. Ultimately both `N.c' +and `N.o' are updated. + + However, even if `N.c' does not exist and is not mentioned, `make' +knows how to envision it as the missing link between `N.o' and `N.y'! +In this case, `N.c' is called an "intermediate file". Once `make' has +decided to use the intermediate file, it is entered in the data base as +if it had been mentioned in the makefile, along with the implicit rule +that says how to create it. + + Intermediate files are remade using their rules just like all other +files. But intermediate files are treated differently in two ways. + + The first difference is what happens if the intermediate file does +not exist. If an ordinary file B does not exist, and `make' considers +a target that depends on B, it invariably creates B and then updates +the target from B. But if B is an intermediate file, then `make' can +leave well enough alone. It won't bother updating B, or the ultimate +target, unless some prerequisite of B is newer than that target or +there is some other reason to update that target. + + The second difference is that if `make' _does_ create B in order to +update something else, it deletes B later on after it is no longer +needed. Therefore, an intermediate file which did not exist before +`make' also does not exist after `make'. `make' reports the deletion +to you by printing a `rm -f' command showing which file it is deleting. + + Ordinarily, a file cannot be intermediate if it is mentioned in the +makefile as a target or prerequisite. However, you can explicitly mark +a file as intermediate by listing it as a prerequisite of the special +target `.INTERMEDIATE'. This takes effect even if the file is mentioned +explicitly in some other way. + + You can prevent automatic deletion of an intermediate file by +marking it as a "secondary" file. To do this, list it as a +prerequisite of the special target `.SECONDARY'. When a file is +secondary, `make' will not create the file merely because it does not +already exist, but `make' does not automatically delete the file. +Marking a file as secondary also marks it as intermediate. + + You can list the target pattern of an implicit rule (such as `%.o') +as a prerequisite of the special target `.PRECIOUS' to preserve +intermediate files made by implicit rules whose target patterns match +that file's name; see *note Interrupts::. + + A chain can involve more than two implicit rules. For example, it is +possible to make a file `foo' from `RCS/foo.y,v' by running RCS, Yacc +and `cc'. Then both `foo.y' and `foo.c' are intermediate files that +are deleted at the end. + + No single implicit rule can appear more than once in a chain. This +means that `make' will not even consider such a ridiculous thing as +making `foo' from `foo.o.o' by running the linker twice. This +constraint has the added benefit of preventing any infinite loop in the +search for an implicit rule chain. + + There are some special implicit rules to optimize certain cases that +would otherwise be handled by rule chains. For example, making `foo' +from `foo.c' could be handled by compiling and linking with separate +chained rules, using `foo.o' as an intermediate file. But what +actually happens is that a special rule for this case does the +compilation and linking with a single `cc' command. The optimized rule +is used in preference to the step-by-step chain because it comes +earlier in the ordering of rules. + + +File: make.info, Node: Pattern Rules, Next: Last Resort, Prev: Chained Rules, Up: Implicit Rules + +10.5 Defining and Redefining Pattern Rules +========================================== + +You define an implicit rule by writing a "pattern rule". A pattern +rule looks like an ordinary rule, except that its target contains the +character `%' (exactly one of them). The target is considered a +pattern for matching file names; the `%' can match any nonempty +substring, while other characters match only themselves. The +prerequisites likewise use `%' to show how their names relate to the +target name. + + Thus, a pattern rule `%.o : %.c' says how to make any file `STEM.o' +from another file `STEM.c'. + + Note that expansion using `%' in pattern rules occurs *after* any +variable or function expansions, which take place when the makefile is +read. *Note How to Use Variables: Using Variables, and *note Functions +for Transforming Text: Functions. + +* Menu: + +* Pattern Intro:: An introduction to pattern rules. +* Pattern Examples:: Examples of pattern rules. +* Automatic Variables:: How to use automatic variables in the + recipes of implicit rules. +* Pattern Match:: How patterns match. +* Match-Anything Rules:: Precautions you should take prior to + defining rules that can match any + target file whatever. +* Canceling Rules:: How to override or cancel built-in rules. + + +File: make.info, Node: Pattern Intro, Next: Pattern Examples, Prev: Pattern Rules, Up: Pattern Rules + +10.5.1 Introduction to Pattern Rules +------------------------------------ + +A pattern rule contains the character `%' (exactly one of them) in the +target; otherwise, it looks exactly like an ordinary rule. The target +is a pattern for matching file names; the `%' matches any nonempty +substring, while other characters match only themselves. + + For example, `%.c' as a pattern matches any file name that ends in +`.c'. `s.%.c' as a pattern matches any file name that starts with +`s.', ends in `.c' and is at least five characters long. (There must +be at least one character to match the `%'.) The substring that the +`%' matches is called the "stem". + + `%' in a prerequisite of a pattern rule stands for the same stem +that was matched by the `%' in the target. In order for the pattern +rule to apply, its target pattern must match the file name under +consideration and all of its prerequisites (after pattern substitution) +must name files that exist or can be made. These files become +prerequisites of the target. + + Thus, a rule of the form + + %.o : %.c ; RECIPE... + +specifies how to make a file `N.o', with another file `N.c' as its +prerequisite, provided that `N.c' exists or can be made. + + There may also be prerequisites that do not use `%'; such a +prerequisite attaches to every file made by this pattern rule. These +unvarying prerequisites are useful occasionally. + + A pattern rule need not have any prerequisites that contain `%', or +in fact any prerequisites at all. Such a rule is effectively a general +wildcard. It provides a way to make any file that matches the target +pattern. *Note Last Resort::. + + More than one pattern rule may match a target. In this case `make' +will choose the "best fit" rule. *Note How Patterns Match: Pattern +Match. + + Pattern rules may have more than one target. Unlike normal rules, +this does not act as many different rules with the same prerequisites +and recipe. If a pattern rule has multiple targets, `make' knows that +the rule's recipe is responsible for making all of the targets. The +recipe is executed only once to make all the targets. When searching +for a pattern rule to match a target, the target patterns of a rule +other than the one that matches the target in need of a rule are +incidental: `make' worries only about giving a recipe and prerequisites +to the file presently in question. However, when this file's recipe is +run, the other targets are marked as having been updated themselves. + + +File: make.info, Node: Pattern Examples, Next: Automatic Variables, Prev: Pattern Intro, Up: Pattern Rules + +10.5.2 Pattern Rule Examples +---------------------------- + +Here are some examples of pattern rules actually predefined in `make'. +First, the rule that compiles `.c' files into `.o' files: + + %.o : %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ + +defines a rule that can make any file `X.o' from `X.c'. The recipe +uses the automatic variables `$@' and `$<' to substitute the names of +the target file and the source file in each case where the rule applies +(*note Automatic Variables::). + + Here is a second built-in rule: + + % :: RCS/%,v + $(CO) $(COFLAGS) $< + +defines a rule that can make any file `X' whatsoever from a +corresponding file `X,v' in the subdirectory `RCS'. Since the target +is `%', this rule will apply to any file whatever, provided the +appropriate prerequisite file exists. The double colon makes the rule +"terminal", which means that its prerequisite may not be an intermediate +file (*note Match-Anything Pattern Rules: Match-Anything Rules.). + + This pattern rule has two targets: + + %.tab.c %.tab.h: %.y + bison -d $< + +This tells `make' that the recipe `bison -d X.y' will make both +`X.tab.c' and `X.tab.h'. If the file `foo' depends on the files +`parse.tab.o' and `scan.o' and the file `scan.o' depends on the file +`parse.tab.h', when `parse.y' is changed, the recipe `bison -d parse.y' +will be executed only once, and the prerequisites of both `parse.tab.o' +and `scan.o' will be satisfied. (Presumably the file `parse.tab.o' +will be recompiled from `parse.tab.c' and the file `scan.o' from +`scan.c', while `foo' is linked from `parse.tab.o', `scan.o', and its +other prerequisites, and it will execute happily ever after.) + + +File: make.info, Node: Automatic Variables, Next: Pattern Match, Prev: Pattern Examples, Up: Pattern Rules + +10.5.3 Automatic Variables +-------------------------- + +Suppose you are writing a pattern rule to compile a `.c' file into a +`.o' file: how do you write the `cc' command so that it operates on the +right source file name? You cannot write the name in the recipe, +because the name is different each time the implicit rule is applied. + + What you do is use a special feature of `make', the "automatic +variables". These variables have values computed afresh for each rule +that is executed, based on the target and prerequisites of the rule. +In this example, you would use `$@' for the object file name and `$<' +for the source file name. + + It's very important that you recognize the limited scope in which +automatic variable values are available: they only have values within +the recipe. In particular, you cannot use them anywhere within the +target list of a rule; they have no value there and will expand to the +empty string. Also, they cannot be accessed directly within the +prerequisite list of a rule. A common mistake is attempting to use +`$@' within the prerequisites list; this will not work. However, there +is a special feature of GNU `make', secondary expansion (*note +Secondary Expansion::), which will allow automatic variable values to +be used in prerequisite lists. + + Here is a table of automatic variables: + +`$@' + The file name of the target of the rule. If the target is an + archive member, then `$@' is the name of the archive file. In a + pattern rule that has multiple targets (*note Introduction to + Pattern Rules: Pattern Intro.), `$@' is the name of whichever + target caused the rule's recipe to be run. + +`$%' + The target member name, when the target is an archive member. + *Note Archives::. For example, if the target is `foo.a(bar.o)' + then `$%' is `bar.o' and `$@' is `foo.a'. `$%' is empty when the + target is not an archive member. + +`$<' + The name of the first prerequisite. If the target got its recipe + from an implicit rule, this will be the first prerequisite added + by the implicit rule (*note Implicit Rules::). + +`$?' + The names of all the prerequisites that are newer than the target, + with spaces between them. For prerequisites which are archive + members, only the named member is used (*note Archives::). + +`$^' + The names of all the prerequisites, with spaces between them. For + prerequisites which are archive members, only the named member is + used (*note Archives::). A target has only one prerequisite on + each other file it depends on, no matter how many times each file + is listed as a prerequisite. So if you list a prerequisite more + than once for a target, the value of `$^' contains just one copy + of the name. This list does *not* contain any of the order-only + prerequisites; for those see the `$|' variable, below. + +`$+' + This is like `$^', but prerequisites listed more than once are + duplicated in the order they were listed in the makefile. This is + primarily useful for use in linking commands where it is + meaningful to repeat library file names in a particular order. + +`$|' + The names of all the order-only prerequisites, with spaces between + them. + +`$*' + The stem with which an implicit rule matches (*note How Patterns + Match: Pattern Match.). If the target is `dir/a.foo.b' and the + target pattern is `a.%.b' then the stem is `dir/foo'. The stem is + useful for constructing names of related files. + + In a static pattern rule, the stem is part of the file name that + matched the `%' in the target pattern. + + In an explicit rule, there is no stem; so `$*' cannot be determined + in that way. Instead, if the target name ends with a recognized + suffix (*note Old-Fashioned Suffix Rules: Suffix Rules.), `$*' is + set to the target name minus the suffix. For example, if the + target name is `foo.c', then `$*' is set to `foo', since `.c' is a + suffix. GNU `make' does this bizarre thing only for compatibility + with other implementations of `make'. You should generally avoid + using `$*' except in implicit rules or static pattern rules. + + If the target name in an explicit rule does not end with a + recognized suffix, `$*' is set to the empty string for that rule. + + `$?' is useful even in explicit rules when you wish to operate on +only the prerequisites that have changed. For example, suppose that an +archive named `lib' is supposed to contain copies of several object +files. This rule copies just the changed object files into the archive: + + lib: foo.o bar.o lose.o win.o + ar r lib $? + + Of the variables listed above, four have values that are single file +names, and three have values that are lists of file names. These seven +have variants that get just the file's directory name or just the file +name within the directory. The variant variables' names are formed by +appending `D' or `F', respectively. These variants are semi-obsolete +in GNU `make' since the functions `dir' and `notdir' can be used to get +a similar effect (*note Functions for File Names: File Name +Functions.). Note, however, that the `D' variants all omit the +trailing slash which always appears in the output of the `dir' +function. Here is a table of the variants: + +`$(@D)' + The directory part of the file name of the target, with the + trailing slash removed. If the value of `$@' is `dir/foo.o' then + `$(@D)' is `dir'. This value is `.' if `$@' does not contain a + slash. + +`$(@F)' + The file-within-directory part of the file name of the target. If + the value of `$@' is `dir/foo.o' then `$(@F)' is `foo.o'. `$(@F)' + is equivalent to `$(notdir $@)'. + +`$(*D)' +`$(*F)' + The directory part and the file-within-directory part of the stem; + `dir' and `foo' in this example. + +`$(%D)' +`$(%F)' + The directory part and the file-within-directory part of the target + archive member name. This makes sense only for archive member + targets of the form `ARCHIVE(MEMBER)' and is useful only when + MEMBER may contain a directory name. (*Note Archive Members as + Targets: Archive Members.) + +`$( foo.1 + +will fail when the build directory is not the source directory, because +`foo.man' and `sedscript' are in the source directory. + + When using GNU `make', relying on `VPATH' to find the source file +will work in the case where there is a single dependency file, since +the `make' automatic variable `$<' will represent the source file +wherever it is. (Many versions of `make' set `$<' only in implicit +rules.) A Makefile target like + + foo.o : bar.c + $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o + +should instead be written as + + foo.o : bar.c + $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@ + +in order to allow `VPATH' to work correctly. When the target has +multiple dependencies, using an explicit `$(srcdir)' is the easiest way +to make the rule work well. For example, the target above for `foo.1' +is best written as: + + foo.1 : foo.man sedscript + sed -f $(srcdir)/sedscript $(srcdir)/foo.man > $@ + + GNU distributions usually contain some files which are not source +files--for example, Info files, and the output from Autoconf, Automake, +Bison or Flex. Since these files normally appear in the source +directory, they should always appear in the source directory, not in the +build directory. So Makefile rules to update them should put the +updated files in the source directory. + + However, if a file does not appear in the distribution, then the +Makefile should not put it in the source directory, because building a +program in ordinary circumstances should not modify the source directory +in any way. + + Try to make the build and installation targets, at least (and all +their subtargets) work correctly with a parallel `make'. + + +File: make.info, Node: Utilities in Makefiles, Next: Command Variables, Prev: Makefile Basics, Up: Makefile Conventions + +14.2 Utilities in Makefiles +=========================== + +Write the Makefile commands (and any shell scripts, such as +`configure') to run under `sh' (both the traditional Bourne shell and +the POSIX shell), not `csh'. Don't use any special features of `ksh' +or `bash', or POSIX features not widely supported in traditional Bourne +`sh'. + + The `configure' script and the Makefile rules for building and +installation should not use any utilities directly except these: + + awk cat cmp cp diff echo egrep expr false grep install-info ln ls + mkdir mv printf pwd rm rmdir sed sleep sort tar test touch tr true + + Compression programs such as `gzip' can be used in the `dist' rule. + + Generally, stick to the widely-supported (usually POSIX-specified) +options and features of these programs. For example, don't use `mkdir +-p', convenient as it may be, because a few systems don't support it at +all and with others, it is not safe for parallel execution. For a list +of known incompatibilities, see *note Portable Shell Programming: +(autoconf)Portable Shell. + + It is a good idea to avoid creating symbolic links in makefiles, +since a few file systems don't support them. + + The Makefile rules for building and installation can also use +compilers and related programs, but should do so via `make' variables +so that the user can substitute alternatives. Here are some of the +programs we mean: + + ar bison cc flex install ld ldconfig lex + make makeinfo ranlib texi2dvi yacc + + Use the following `make' variables to run those programs: + + $(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX) + $(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC) + + When you use `ranlib' or `ldconfig', you should make sure nothing +bad happens if the system does not have the program in question. +Arrange to ignore an error from that command, and print a message before +the command to tell the user that failure of this command does not mean +a problem. (The Autoconf `AC_PROG_RANLIB' macro can help with this.) + + If you use symbolic links, you should implement a fallback for +systems that don't have symbolic links. + + Additional utilities that can be used via Make variables are: + + chgrp chmod chown mknod + + It is ok to use other utilities in Makefile portions (or scripts) +intended only for particular systems where you know those utilities +exist. + + +File: make.info, Node: Command Variables, Next: DESTDIR, Prev: Utilities in Makefiles, Up: Makefile Conventions + +14.3 Variables for Specifying Commands +====================================== + +Makefiles should provide variables for overriding certain commands, +options, and so on. + + In particular, you should run most utility programs via variables. +Thus, if you use Bison, have a variable named `BISON' whose default +value is set with `BISON = bison', and refer to it with `$(BISON)' +whenever you need to use Bison. + + File management utilities such as `ln', `rm', `mv', and so on, need +not be referred to through variables in this way, since users don't +need to replace them with other programs. + + Each program-name variable should come with an options variable that +is used to supply options to the program. Append `FLAGS' to the +program-name variable name to get the options variable name--for +example, `BISONFLAGS'. (The names `CFLAGS' for the C compiler, +`YFLAGS' for yacc, and `LFLAGS' for lex, are exceptions to this rule, +but we keep them because they are standard.) Use `CPPFLAGS' in any +compilation command that runs the preprocessor, and use `LDFLAGS' in +any compilation command that does linking as well as in any direct use +of `ld'. + + If there are C compiler options that _must_ be used for proper +compilation of certain files, do not include them in `CFLAGS'. Users +expect to be able to specify `CFLAGS' freely themselves. Instead, +arrange to pass the necessary options to the C compiler independently +of `CFLAGS', by writing them explicitly in the compilation commands or +by defining an implicit rule, like this: + + CFLAGS = -g + ALL_CFLAGS = -I. $(CFLAGS) + .c.o: + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< + + Do include the `-g' option in `CFLAGS', because that is not +_required_ for proper compilation. You can consider it a default that +is only recommended. If the package is set up so that it is compiled +with GCC by default, then you might as well include `-O' in the default +value of `CFLAGS' as well. + + Put `CFLAGS' last in the compilation command, after other variables +containing compiler options, so the user can use `CFLAGS' to override +the others. + + `CFLAGS' should be used in every invocation of the C compiler, both +those which do compilation and those which do linking. + + Every Makefile should define the variable `INSTALL', which is the +basic command for installing a file into the system. + + Every Makefile should also define the variables `INSTALL_PROGRAM' +and `INSTALL_DATA'. (The default for `INSTALL_PROGRAM' should be +`$(INSTALL)'; the default for `INSTALL_DATA' should be `${INSTALL} -m +644'.) Then it should use those variables as the commands for actual +installation, for executables and non-executables respectively. +Minimal use of these variables is as follows: + + $(INSTALL_PROGRAM) foo $(bindir)/foo + $(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a + + However, it is preferable to support a `DESTDIR' prefix on the +target files, as explained in the next section. + + It is acceptable, but not required, to install multiple files in one +command, with the final argument being a directory, as in: + + $(INSTALL_PROGRAM) foo bar baz $(bindir) + + +File: make.info, Node: DESTDIR, Next: Directory Variables, Prev: Command Variables, Up: Makefile Conventions + +14.4 `DESTDIR': Support for Staged Installs +=========================================== + +`DESTDIR' is a variable prepended to each installed target file, like +this: + + $(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo + $(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a + + The `DESTDIR' variable is specified by the user on the `make' +command line as an absolute file name. For example: + + make DESTDIR=/tmp/stage install + +`DESTDIR' should be supported only in the `install*' and `uninstall*' +targets, as those are the only targets where it is useful. + + If your installation step would normally install +`/usr/local/bin/foo' and `/usr/local/lib/libfoo.a', then an +installation invoked as in the example above would install +`/tmp/stage/usr/local/bin/foo' and `/tmp/stage/usr/local/lib/libfoo.a' +instead. + + Prepending the variable `DESTDIR' to each target in this way +provides for "staged installs", where the installed files are not +placed directly into their expected location but are instead copied +into a temporary location (`DESTDIR'). However, installed files +maintain their relative directory structure and any embedded file names +will not be modified. + + You should not set the value of `DESTDIR' in your `Makefile' at all; +then the files are installed into their expected locations by default. +Also, specifying `DESTDIR' should not change the operation of the +software in any way, so its value should not be included in any file +contents. + + `DESTDIR' support is commonly used in package creation. It is also +helpful to users who want to understand what a given package will +install where, and to allow users who don't normally have permissions +to install into protected areas to build and install before gaining +those permissions. Finally, it can be useful with tools such as +`stow', where code is installed in one place but made to appear to be +installed somewhere else using symbolic links or special mount +operations. So, we strongly recommend GNU packages support `DESTDIR', +though it is not an absolute requirement. + + +File: make.info, Node: Directory Variables, Next: Standard Targets, Prev: DESTDIR, Up: Makefile Conventions + +14.5 Variables for Installation Directories +=========================================== + +Installation directories should always be named by variables, so it is +easy to install in a nonstandard place. The standard names for these +variables and the values they should have in GNU packages are described +below. They are based on a standard file system layout; variants of it +are used in GNU/Linux and other modern operating systems. + + Installers are expected to override these values when calling `make' +(e.g., `make prefix=/usr install' or `configure' (e.g., `configure +--prefix=/usr'). GNU packages should not try to guess which value +should be appropriate for these variables on the system they are being +installed onto: use the default settings specified here so that all GNU +packages behave identically, allowing the installer to achieve any +desired layout. + + All installation directories, and their parent directories, should be +created (if necessary) before they are installed into. + + These first two variables set the root for the installation. All the +other installation directories should be subdirectories of one of these +two, and nothing should be directly installed into these two +directories. + +`prefix' + A prefix used in constructing the default values of the variables + listed below. The default value of `prefix' should be + `/usr/local'. When building the complete GNU system, the prefix + will be empty and `/usr' will be a symbolic link to `/'. (If you + are using Autoconf, write it as `@prefix@'.) + + Running `make install' with a different value of `prefix' from the + one used to build the program should _not_ recompile the program. + +`exec_prefix' + A prefix used in constructing the default values of some of the + variables listed below. The default value of `exec_prefix' should + be `$(prefix)'. (If you are using Autoconf, write it as + `@exec_prefix@'.) + + Generally, `$(exec_prefix)' is used for directories that contain + machine-specific files (such as executables and subroutine + libraries), while `$(prefix)' is used directly for other + directories. + + Running `make install' with a different value of `exec_prefix' + from the one used to build the program should _not_ recompile the + program. + + Executable programs are installed in one of the following +directories. + +`bindir' + The directory for installing executable programs that users can + run. This should normally be `/usr/local/bin', but write it as + `$(exec_prefix)/bin'. (If you are using Autoconf, write it as + `@bindir@'.) + +`sbindir' + The directory for installing executable programs that can be run + from the shell, but are only generally useful to system + administrators. This should normally be `/usr/local/sbin', but + write it as `$(exec_prefix)/sbin'. (If you are using Autoconf, + write it as `@sbindir@'.) + +`libexecdir' + The directory for installing executable programs to be run by other + programs rather than by users. This directory should normally be + `/usr/local/libexec', but write it as `$(exec_prefix)/libexec'. + (If you are using Autoconf, write it as `@libexecdir@'.) + + The definition of `libexecdir' is the same for all packages, so + you should install your data in a subdirectory thereof. Most + packages install their data under `$(libexecdir)/PACKAGE-NAME/', + possibly within additional subdirectories thereof, such as + `$(libexecdir)/PACKAGE-NAME/MACHINE/VERSION'. + + Data files used by the program during its execution are divided into +categories in two ways. + + * Some files are normally modified by programs; others are never + normally modified (though users may edit some of these). + + * Some files are architecture-independent and can be shared by all + machines at a site; some are architecture-dependent and can be + shared only by machines of the same kind and operating system; + others may never be shared between two machines. + + This makes for six different possibilities. However, we want to +discourage the use of architecture-dependent files, aside from object +files and libraries. It is much cleaner to make other data files +architecture-independent, and it is generally not hard. + + Here are the variables Makefiles should use to specify directories +to put these various kinds of files in: + +`datarootdir' + The root of the directory tree for read-only + architecture-independent data files. This should normally be + `/usr/local/share', but write it as `$(prefix)/share'. (If you + are using Autoconf, write it as `@datarootdir@'.) `datadir''s + default value is based on this variable; so are `infodir', + `mandir', and others. + +`datadir' + The directory for installing idiosyncratic read-only + architecture-independent data files for this program. This is + usually the same place as `datarootdir', but we use the two + separate variables so that you can move these program-specific + files without altering the location for Info files, man pages, etc. + + This should normally be `/usr/local/share', but write it as + `$(datarootdir)'. (If you are using Autoconf, write it as + `@datadir@'.) + + The definition of `datadir' is the same for all packages, so you + should install your data in a subdirectory thereof. Most packages + install their data under `$(datadir)/PACKAGE-NAME/'. + +`sysconfdir' + The directory for installing read-only data files that pertain to a + single machine-that is to say, files for configuring a host. + Mailer and network configuration files, `/etc/passwd', and so + forth belong here. All the files in this directory should be + ordinary ASCII text files. This directory should normally be + `/usr/local/etc', but write it as `$(prefix)/etc'. (If you are + using Autoconf, write it as `@sysconfdir@'.) + + Do not install executables here in this directory (they probably + belong in `$(libexecdir)' or `$(sbindir)'). Also do not install + files that are modified in the normal course of their use (programs + whose purpose is to change the configuration of the system + excluded). Those probably belong in `$(localstatedir)'. + +`sharedstatedir' + The directory for installing architecture-independent data files + which the programs modify while they run. This should normally be + `/usr/local/com', but write it as `$(prefix)/com'. (If you are + using Autoconf, write it as `@sharedstatedir@'.) + +`localstatedir' + The directory for installing data files which the programs modify + while they run, and that pertain to one specific machine. Users + should never need to modify files in this directory to configure + the package's operation; put such configuration information in + separate files that go in `$(datadir)' or `$(sysconfdir)'. + `$(localstatedir)' should normally be `/usr/local/var', but write + it as `$(prefix)/var'. (If you are using Autoconf, write it as + `@localstatedir@'.) + + These variables specify the directory for installing certain specific +types of files, if your program has them. Every GNU package should +have Info files, so every program needs `infodir', but not all need +`libdir' or `lispdir'. + +`includedir' + The directory for installing header files to be included by user + programs with the C `#include' preprocessor directive. This + should normally be `/usr/local/include', but write it as + `$(prefix)/include'. (If you are using Autoconf, write it as + `@includedir@'.) + + Most compilers other than GCC do not look for header files in + directory `/usr/local/include'. So installing the header files + this way is only useful with GCC. Sometimes this is not a problem + because some libraries are only really intended to work with GCC. + But some libraries are intended to work with other compilers. + They should install their header files in two places, one + specified by `includedir' and one specified by `oldincludedir'. + +`oldincludedir' + The directory for installing `#include' header files for use with + compilers other than GCC. This should normally be `/usr/include'. + (If you are using Autoconf, you can write it as `@oldincludedir@'.) + + The Makefile commands should check whether the value of + `oldincludedir' is empty. If it is, they should not try to use + it; they should cancel the second installation of the header files. + + A package should not replace an existing header in this directory + unless the header came from the same package. Thus, if your Foo + package provides a header file `foo.h', then it should install the + header file in the `oldincludedir' directory if either (1) there + is no `foo.h' there or (2) the `foo.h' that exists came from the + Foo package. + + To tell whether `foo.h' came from the Foo package, put a magic + string in the file--part of a comment--and `grep' for that string. + +`docdir' + The directory for installing documentation files (other than Info) + for this package. By default, it should be + `/usr/local/share/doc/YOURPKG', but it should be written as + `$(datarootdir)/doc/YOURPKG'. (If you are using Autoconf, write + it as `@docdir@'.) The YOURPKG subdirectory, which may include a + version number, prevents collisions among files with common names, + such as `README'. + +`infodir' + The directory for installing the Info files for this package. By + default, it should be `/usr/local/share/info', but it should be + written as `$(datarootdir)/info'. (If you are using Autoconf, + write it as `@infodir@'.) `infodir' is separate from `docdir' for + compatibility with existing practice. + +`htmldir' +`dvidir' +`pdfdir' +`psdir' + Directories for installing documentation files in the particular + format. They should all be set to `$(docdir)' by default. (If + you are using Autoconf, write them as `@htmldir@', `@dvidir@', + etc.) Packages which supply several translations of their + documentation should install them in `$(htmldir)/'LL, + `$(pdfdir)/'LL, etc. where LL is a locale abbreviation such as + `en' or `pt_BR'. + +`libdir' + The directory for object files and libraries of object code. Do + not install executables here, they probably ought to go in + `$(libexecdir)' instead. The value of `libdir' should normally be + `/usr/local/lib', but write it as `$(exec_prefix)/lib'. (If you + are using Autoconf, write it as `@libdir@'.) + +`lispdir' + The directory for installing any Emacs Lisp files in this package. + By default, it should be `/usr/local/share/emacs/site-lisp', but it + should be written as `$(datarootdir)/emacs/site-lisp'. + + If you are using Autoconf, write the default as `@lispdir@'. In + order to make `@lispdir@' work, you need the following lines in + your `configure.in' file: + + lispdir='${datarootdir}/emacs/site-lisp' + AC_SUBST(lispdir) + +`localedir' + The directory for installing locale-specific message catalogs for + this package. By default, it should be `/usr/local/share/locale', + but it should be written as `$(datarootdir)/locale'. (If you are + using Autoconf, write it as `@localedir@'.) This directory + usually has a subdirectory per locale. + + Unix-style man pages are installed in one of the following: + +`mandir' + The top-level directory for installing the man pages (if any) for + this package. It will normally be `/usr/local/share/man', but you + should write it as `$(datarootdir)/man'. (If you are using + Autoconf, write it as `@mandir@'.) + +`man1dir' + The directory for installing section 1 man pages. Write it as + `$(mandir)/man1'. + +`man2dir' + The directory for installing section 2 man pages. Write it as + `$(mandir)/man2' + +`...' + *Don't make the primary documentation for any GNU software be a + man page. Write a manual in Texinfo instead. Man pages are just + for the sake of people running GNU software on Unix, which is a + secondary application only.* + +`manext' + The file name extension for the installed man page. This should + contain a period followed by the appropriate digit; it should + normally be `.1'. + +`man1ext' + The file name extension for installed section 1 man pages. + +`man2ext' + The file name extension for installed section 2 man pages. + +`...' + Use these names instead of `manext' if the package needs to + install man pages in more than one section of the manual. + + And finally, you should set the following variable: + +`srcdir' + The directory for the sources being compiled. The value of this + variable is normally inserted by the `configure' shell script. + (If you are using Autoconf, use `srcdir = @srcdir@'.) + + For example: + + # Common prefix for installation directories. + # NOTE: This directory must exist when you start the install. + prefix = /usr/local + datarootdir = $(prefix)/share + datadir = $(datarootdir) + exec_prefix = $(prefix) + # Where to put the executable for the command `gcc'. + bindir = $(exec_prefix)/bin + # Where to put the directories used by the compiler. + libexecdir = $(exec_prefix)/libexec + # Where to put the Info files. + infodir = $(datarootdir)/info + + If your program installs a large number of files into one of the +standard user-specified directories, it might be useful to group them +into a subdirectory particular to that program. If you do this, you +should write the `install' rule to create these subdirectories. + + Do not expect the user to include the subdirectory name in the value +of any of the variables listed above. The idea of having a uniform set +of variable names for installation directories is to enable the user to +specify the exact same values for several different GNU packages. In +order for this to be useful, all the packages must be designed so that +they will work sensibly when the user does so. + + At times, not all of these variables may be implemented in the +current release of Autoconf and/or Automake; but as of Autoconf 2.60, we +believe all of them are. When any are missing, the descriptions here +serve as specifications for what Autoconf will implement. As a +programmer, you can either use a development version of Autoconf or +avoid using these variables until a stable release is made which +supports them. + + +File: make.info, Node: Standard Targets, Next: Install Command Categories, Prev: Directory Variables, Up: Makefile Conventions + +14.6 Standard Targets for Users +=============================== + +All GNU programs should have the following targets in their Makefiles: + +`all' + Compile the entire program. This should be the default target. + This target need not rebuild any documentation files; Info files + should normally be included in the distribution, and DVI (and other + documentation format) files should be made only when explicitly + asked for. + + By default, the Make rules should compile and link with `-g', so + that executable programs have debugging symbols. Users who don't + mind being helpless can strip the executables later if they wish. + +`install' + Compile the program and copy the executables, libraries, and so on + to the file names where they should reside for actual use. If + there is a simple test to verify that a program is properly + installed, this target should run that test. + + Do not strip executables when installing them. Devil-may-care + users can use the `install-strip' target to do that. + + If possible, write the `install' target rule so that it does not + modify anything in the directory where the program was built, + provided `make all' has just been done. This is convenient for + building the program under one user name and installing it under + another. + + The commands should create all the directories in which files are + to be installed, if they don't already exist. This includes the + directories specified as the values of the variables `prefix' and + `exec_prefix', as well as all subdirectories that are needed. One + way to do this is by means of an `installdirs' target as described + below. + + Use `-' before any command for installing a man page, so that + `make' will ignore any errors. This is in case there are systems + that don't have the Unix man page documentation system installed. + + The way to install Info files is to copy them into `$(infodir)' + with `$(INSTALL_DATA)' (*note Command Variables::), and then run + the `install-info' program if it is present. `install-info' is a + program that edits the Info `dir' file to add or update the menu + entry for the given Info file; it is part of the Texinfo package. + + Here is a sample rule to install an Info file that also tries to + handle some additional situations, such as `install-info' not + being present. + + do-install-info: foo.info installdirs + $(NORMAL_INSTALL) + # Prefer an info file in . to one in srcdir. + if test -f foo.info; then d=.; \ + else d="$(srcdir)"; fi; \ + $(INSTALL_DATA) $$d/foo.info \ + "$(DESTDIR)$(infodir)/foo.info" + # Run install-info only if it exists. + # Use `if' instead of just prepending `-' to the + # line so we notice real errors from install-info. + # Use `$(SHELL) -c' because some shells do not + # fail gracefully when there is an unknown command. + $(POST_INSTALL) + if $(SHELL) -c 'install-info --version' \ + >/dev/null 2>&1; then \ + install-info --dir-file="$(DESTDIR)$(infodir)/dir" \ + "$(DESTDIR)$(infodir)/foo.info"; \ + else true; fi + + When writing the `install' target, you must classify all the + commands into three categories: normal ones, "pre-installation" + commands and "post-installation" commands. *Note Install Command + Categories::. + +`install-html' +`install-dvi' +`install-pdf' +`install-ps' + These targets install documentation in formats other than Info; + they're intended to be called explicitly by the person installing + the package, if that format is desired. GNU prefers Info files, + so these must be installed by the `install' target. + + When you have many documentation files to install, we recommend + that you avoid collisions and clutter by arranging for these + targets to install in subdirectories of the appropriate + installation directory, such as `htmldir'. As one example, if + your package has multiple manuals, and you wish to install HTML + documentation with many files (such as the "split" mode output by + `makeinfo --html'), you'll certainly want to use subdirectories, + or two nodes with the same name in different manuals will + overwrite each other. + + Please make these `install-FORMAT' targets invoke the commands for + the FORMAT target, for example, by making FORMAT a dependency. + +`uninstall' + Delete all the installed files--the copies that the `install' and + `install-*' targets create. + + This rule should not modify the directories where compilation is + done, only the directories where files are installed. + + The uninstallation commands are divided into three categories, + just like the installation commands. *Note Install Command + Categories::. + +`install-strip' + Like `install', but strip the executable files while installing + them. In simple cases, this target can use the `install' target in + a simple way: + + install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \ + install + + But if the package installs scripts as well as real executables, + the `install-strip' target can't just refer to the `install' + target; it has to strip the executables but not the scripts. + + `install-strip' should not strip the executables in the build + directory which are being copied for installation. It should only + strip the copies that are installed. + + Normally we do not recommend stripping an executable unless you + are sure the program has no bugs. However, it can be reasonable + to install a stripped executable for actual execution while saving + the unstripped executable elsewhere in case there is a bug. + +`clean' + Delete all files in the current directory that are normally + created by building the program. Also delete files in other + directories if they are created by this makefile. However, don't + delete the files that record the configuration. Also preserve + files that could be made by building, but normally aren't because + the distribution comes with them. There is no need to delete + parent directories that were created with `mkdir -p', since they + could have existed anyway. + + Delete `.dvi' files here if they are not part of the distribution. + +`distclean' + Delete all files in the current directory (or created by this + makefile) that are created by configuring or building the program. + If you have unpacked the source and built the program without + creating any other files, `make distclean' should leave only the + files that were in the distribution. However, there is no need to + delete parent directories that were created with `mkdir -p', since + they could have existed anyway. + +`mostlyclean' + Like `clean', but may refrain from deleting a few files that people + normally don't want to recompile. For example, the `mostlyclean' + target for GCC does not delete `libgcc.a', because recompiling it + is rarely necessary and takes a lot of time. + +`maintainer-clean' + Delete almost everything that can be reconstructed with this + Makefile. This typically includes everything deleted by + `distclean', plus more: C source files produced by Bison, tags + tables, Info files, and so on. + + The reason we say "almost everything" is that running the command + `make maintainer-clean' should not delete `configure' even if + `configure' can be remade using a rule in the Makefile. More + generally, `make maintainer-clean' should not delete anything that + needs to exist in order to run `configure' and then begin to build + the program. Also, there is no need to delete parent directories + that were created with `mkdir -p', since they could have existed + anyway. These are the only exceptions; `maintainer-clean' should + delete everything else that can be rebuilt. + + The `maintainer-clean' target is intended to be used by a + maintainer of the package, not by ordinary users. You may need + special tools to reconstruct some of the files that `make + maintainer-clean' deletes. Since these files are normally + included in the distribution, we don't take care to make them easy + to reconstruct. If you find you need to unpack the full + distribution again, don't blame us. + + To help make users aware of this, the commands for the special + `maintainer-clean' target should start with these two: + + @echo 'This command is intended for maintainers to use; it' + @echo 'deletes files that may need special tools to rebuild.' + +`TAGS' + Update a tags table for this program. + +`info' + Generate any Info files needed. The best way to write the rules + is as follows: + + info: foo.info + + foo.info: foo.texi chap1.texi chap2.texi + $(MAKEINFO) $(srcdir)/foo.texi + + You must define the variable `MAKEINFO' in the Makefile. It should + run the `makeinfo' program, which is part of the Texinfo + distribution. + + Normally a GNU distribution comes with Info files, and that means + the Info files are present in the source directory. Therefore, + the Make rule for an info file should update it in the source + directory. When users build the package, ordinarily Make will not + update the Info files because they will already be up to date. + +`dvi' +`html' +`pdf' +`ps' + Generate documentation files in the given format. These targets + should always exist, but any or all can be a no-op if the given + output format cannot be generated. These targets should not be + dependencies of the `all' target; the user must manually invoke + them. + + Here's an example rule for generating DVI files from Texinfo: + + dvi: foo.dvi + + foo.dvi: foo.texi chap1.texi chap2.texi + $(TEXI2DVI) $(srcdir)/foo.texi + + You must define the variable `TEXI2DVI' in the Makefile. It should + run the program `texi2dvi', which is part of the Texinfo + distribution.(1) Alternatively, write just the dependencies, and + allow GNU `make' to provide the command. + + Here's another example, this one for generating HTML from Texinfo: + + html: foo.html + + foo.html: foo.texi chap1.texi chap2.texi + $(TEXI2HTML) $(srcdir)/foo.texi + + Again, you would define the variable `TEXI2HTML' in the Makefile; + for example, it might run `makeinfo --no-split --html' (`makeinfo' + is part of the Texinfo distribution). + +`dist' + Create a distribution tar file for this program. The tar file + should be set up so that the file names in the tar file start with + a subdirectory name which is the name of the package it is a + distribution for. This name can include the version number. + + For example, the distribution tar file of GCC version 1.40 unpacks + into a subdirectory named `gcc-1.40'. + + The easiest way to do this is to create a subdirectory + appropriately named, use `ln' or `cp' to install the proper files + in it, and then `tar' that subdirectory. + + Compress the tar file with `gzip'. For example, the actual + distribution file for GCC version 1.40 is called `gcc-1.40.tar.gz'. + It is ok to support other free compression formats as well. + + The `dist' target should explicitly depend on all non-source files + that are in the distribution, to make sure they are up to date in + the distribution. *Note Making Releases: (standards)Releases. + +`check' + Perform self-tests (if any). The user must build the program + before running the tests, but need not install the program; you + should write the self-tests so that they work when the program is + built but not installed. + + The following targets are suggested as conventional names, for +programs in which they are useful. + +`installcheck' + Perform installation tests (if any). The user must build and + install the program before running the tests. You should not + assume that `$(bindir)' is in the search path. + +`installdirs' + It's useful to add a target named `installdirs' to create the + directories where files are installed, and their parent + directories. There is a script called `mkinstalldirs' which is + convenient for this; you can find it in the Gnulib package. You + can use a rule like this: + + # Make sure all installation directories (e.g. $(bindir)) + # actually exist by making them if necessary. + installdirs: mkinstalldirs + $(srcdir)/mkinstalldirs $(bindir) $(datadir) \ + $(libdir) $(infodir) \ + $(mandir) + + or, if you wish to support `DESTDIR' (strongly encouraged), + + # Make sure all installation directories (e.g. $(bindir)) + # actually exist by making them if necessary. + installdirs: mkinstalldirs + $(srcdir)/mkinstalldirs \ + $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \ + $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \ + $(DESTDIR)$(mandir) + + This rule should not modify the directories where compilation is + done. It should do nothing but create installation directories. + + ---------- Footnotes ---------- + + (1) `texi2dvi' uses TeX to do the real work of formatting. TeX is +not distributed with Texinfo. + + +File: make.info, Node: Install Command Categories, Prev: Standard Targets, Up: Makefile Conventions + +14.7 Install Command Categories +=============================== + +When writing the `install' target, you must classify all the commands +into three categories: normal ones, "pre-installation" commands and +"post-installation" commands. + + Normal commands move files into their proper places, and set their +modes. They may not alter any files except the ones that come entirely +from the package they belong to. + + Pre-installation and post-installation commands may alter other +files; in particular, they can edit global configuration files or data +bases. + + Pre-installation commands are typically executed before the normal +commands, and post-installation commands are typically run after the +normal commands. + + The most common use for a post-installation command is to run +`install-info'. This cannot be done with a normal command, since it +alters a file (the Info directory) which does not come entirely and +solely from the package being installed. It is a post-installation +command because it needs to be done after the normal command which +installs the package's Info files. + + Most programs don't need any pre-installation commands, but we have +the feature just in case it is needed. + + To classify the commands in the `install' rule into these three +categories, insert "category lines" among them. A category line +specifies the category for the commands that follow. + + A category line consists of a tab and a reference to a special Make +variable, plus an optional comment at the end. There are three +variables you can use, one for each category; the variable name +specifies the category. Category lines are no-ops in ordinary execution +because these three Make variables are normally undefined (and you +_should not_ define them in the makefile). + + Here are the three possible category lines, each with a comment that +explains what it means: + + $(PRE_INSTALL) # Pre-install commands follow. + $(POST_INSTALL) # Post-install commands follow. + $(NORMAL_INSTALL) # Normal commands follow. + + If you don't use a category line at the beginning of the `install' +rule, all the commands are classified as normal until the first category +line. If you don't use any category lines, all the commands are +classified as normal. + + These are the category lines for `uninstall': + + $(PRE_UNINSTALL) # Pre-uninstall commands follow. + $(POST_UNINSTALL) # Post-uninstall commands follow. + $(NORMAL_UNINSTALL) # Normal commands follow. + + Typically, a pre-uninstall command would be used for deleting entries +from the Info directory. + + If the `install' or `uninstall' target has any dependencies which +act as subroutines of installation, then you should start _each_ +dependency's commands with a category line, and start the main target's +commands with a category line also. This way, you can ensure that each +command is placed in the right category regardless of which of the +dependencies actually run. + + Pre-installation and post-installation commands should not run any +programs except for these: + + [ basename bash cat chgrp chmod chown cmp cp dd diff echo + egrep expand expr false fgrep find getopt grep gunzip gzip + hostname install install-info kill ldconfig ln ls md5sum + mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee + test touch true uname xargs yes + + The reason for distinguishing the commands in this way is for the +sake of making binary packages. Typically a binary package contains +all the executables and other files that need to be installed, and has +its own method of installing them--so it does not need to run the normal +installation commands. But installing the binary package does need to +execute the pre-installation and post-installation commands. + + Programs to build binary packages work by extracting the +pre-installation and post-installation commands. Here is one way of +extracting the pre-installation commands (the `-s' option to `make' is +needed to silence messages about entering subdirectories): + + make -s -n install -o all \ + PRE_INSTALL=pre-install \ + POST_INSTALL=post-install \ + NORMAL_INSTALL=normal-install \ + | gawk -f pre-install.awk + +where the file `pre-install.awk' could contain this: + + $0 ~ /^(normal-install|post-install)[ \t]*$/ {on = 0} + on {print $0} + $0 ~ /^pre-install[ \t]*$/ {on = 1} + + +File: make.info, Node: Quick Reference, Next: Error Messages, Prev: Makefile Conventions, Up: Top + +Appendix A Quick Reference +************************** + +This appendix summarizes the directives, text manipulation functions, +and special variables which GNU `make' understands. *Note Special +Targets::, *note Catalogue of Implicit Rules: Catalogue of Rules, and +*note Summary of Options: Options Summary, for other summaries. + + Here is a summary of the directives GNU `make' recognizes: + +`define VARIABLE' +`define VARIABLE =' +`define VARIABLE :=' +`define VARIABLE +=' +`define VARIABLE ?=' +`endef' + Define multi-line variables. + *Note Multi-Line::. + +`undefine VARIABLE' + Undefining variables. + *Note Undefine Directive::. + +`ifdef VARIABLE' +`ifndef VARIABLE' +`ifeq (A,B)' +`ifeq "A" "B"' +`ifeq 'A' 'B'' +`ifneq (A,B)' +`ifneq "A" "B"' +`ifneq 'A' 'B'' +`else' +`endif' + Conditionally evaluate part of the makefile. + *Note Conditionals::. + +`include FILE' +`-include FILE' +`sinclude FILE' + Include another makefile. + *Note Including Other Makefiles: Include. + +`override VARIABLE-ASSIGNMENT' + Define a variable, overriding any previous definition, even one + from the command line. + *Note The `override' Directive: Override Directive. + +`export' + Tell `make' to export all variables to child processes by default. + *Note Communicating Variables to a Sub-`make': Variables/Recursion. + +`export VARIABLE' +`export VARIABLE-ASSIGNMENT' +`unexport VARIABLE' + Tell `make' whether or not to export a particular variable to child + processes. + *Note Communicating Variables to a Sub-`make': Variables/Recursion. + +`private VARIABLE-ASSIGNMENT' + Do not allow this variable assignment to be inherited by + prerequisites. + *Note Suppressing Inheritance::. + +`vpath PATTERN PATH' + Specify a search path for files matching a `%' pattern. + *Note The `vpath' Directive: Selective Search. + +`vpath PATTERN' + Remove all search paths previously specified for PATTERN. + +`vpath' + Remove all search paths previously specified in any `vpath' + directive. + + Here is a summary of the built-in functions (*note Functions::): + +`$(subst FROM,TO,TEXT)' + Replace FROM with TO in TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(patsubst PATTERN,REPLACEMENT,TEXT)' + Replace words matching PATTERN with REPLACEMENT in TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(strip STRING)' + Remove excess whitespace characters from STRING. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(findstring FIND,TEXT)' + Locate FIND in TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(filter PATTERN...,TEXT)' + Select words in TEXT that match one of the PATTERN words. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(filter-out PATTERN...,TEXT)' + Select words in TEXT that _do not_ match any of the PATTERN words. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(sort LIST)' + Sort the words in LIST lexicographically, removing duplicates. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(word N,TEXT)' + Extract the Nth word (one-origin) of TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(words TEXT)' + Count the number of words in TEXT. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(wordlist S,E,TEXT)' + Returns the list of words in TEXT from S to E. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(firstword NAMES...)' + Extract the first word of NAMES. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(lastword NAMES...)' + Extract the last word of NAMES. + *Note Functions for String Substitution and Analysis: Text + Functions. + +`$(dir NAMES...)' + Extract the directory part of each file name. + *Note Functions for File Names: File Name Functions. + +`$(notdir NAMES...)' + Extract the non-directory part of each file name. + *Note Functions for File Names: File Name Functions. + +`$(suffix NAMES...)' + Extract the suffix (the last `.' and following characters) of each + file name. + *Note Functions for File Names: File Name Functions. + +`$(basename NAMES...)' + Extract the base name (name without suffix) of each file name. + *Note Functions for File Names: File Name Functions. + +`$(addsuffix SUFFIX,NAMES...)' + Append SUFFIX to each word in NAMES. + *Note Functions for File Names: File Name Functions. + +`$(addprefix PREFIX,NAMES...)' + Prepend PREFIX to each word in NAMES. + *Note Functions for File Names: File Name Functions. + +`$(join LIST1,LIST2)' + Join two parallel lists of words. + *Note Functions for File Names: File Name Functions. + +`$(wildcard PATTERN...)' + Find file names matching a shell file name pattern (_not_ a `%' + pattern). + *Note The Function `wildcard': Wildcard Function. + +`$(realpath NAMES...)' + For each file name in NAMES, expand to an absolute name that does + not contain any `.', `..', nor symlinks. + *Note Functions for File Names: File Name Functions. + +`$(abspath NAMES...)' + For each file name in NAMES, expand to an absolute name that does + not contain any `.' or `..' components, but preserves symlinks. + *Note Functions for File Names: File Name Functions. + +`$(error TEXT...)' + When this function is evaluated, `make' generates a fatal error + with the message TEXT. + *Note Functions That Control Make: Make Control Functions. + +`$(warning TEXT...)' + When this function is evaluated, `make' generates a warning with + the message TEXT. + *Note Functions That Control Make: Make Control Functions. + +`$(shell COMMAND)' + Execute a shell command and return its output. + *Note The `shell' Function: Shell Function. + +`$(origin VARIABLE)' + Return a string describing how the `make' variable VARIABLE was + defined. + *Note The `origin' Function: Origin Function. + +`$(flavor VARIABLE)' + Return a string describing the flavor of the `make' variable + VARIABLE. + *Note The `flavor' Function: Flavor Function. + +`$(foreach VAR,WORDS,TEXT)' + Evaluate TEXT with VAR bound to each word in WORDS, and + concatenate the results. + *Note The `foreach' Function: Foreach Function. + +`$(if CONDITION,THEN-PART[,ELSE-PART])' + Evaluate the condition CONDITION; if it's non-empty substitute the + expansion of the THEN-PART otherwise substitute the expansion of + the ELSE-PART. + *Note Functions for Conditionals: Conditional Functions. + +`$(or CONDITION1[,CONDITION2[,CONDITION3...]])' + Evaluate each condition CONDITIONN one at a time; substitute the + first non-empty expansion. If all expansions are empty, substitute + the empty string. + *Note Functions for Conditionals: Conditional Functions. + +`$(and CONDITION1[,CONDITION2[,CONDITION3...]])' + Evaluate each condition CONDITIONN one at a time; if any expansion + results in the empty string substitute the empty string. If all + expansions result in a non-empty string, substitute the expansion + of the last CONDITION. + *Note Functions for Conditionals: Conditional Functions. + +`$(call VAR,PARAM,...)' + Evaluate the variable VAR replacing any references to `$(1)', + `$(2)' with the first, second, etc. PARAM values. + *Note The `call' Function: Call Function. + +`$(eval TEXT)' + Evaluate TEXT then read the results as makefile commands. Expands + to the empty string. + *Note The `eval' Function: Eval Function. + +`$(value VAR)' + Evaluates to the contents of the variable VAR, with no expansion + performed on it. + *Note The `value' Function: Value Function. + + Here is a summary of the automatic variables. *Note Automatic +Variables::, for full information. + +`$@' + The file name of the target. + +`$%' + The target member name, when the target is an archive member. + +`$<' + The name of the first prerequisite. + +`$?' + The names of all the prerequisites that are newer than the target, + with spaces between them. For prerequisites which are archive + members, only the named member is used (*note Archives::). + +`$^' +`$+' + The names of all the prerequisites, with spaces between them. For + prerequisites which are archive members, only the named member is + used (*note Archives::). The value of `$^' omits duplicate + prerequisites, while `$+' retains them and preserves their order. + +`$*' + The stem with which an implicit rule matches (*note How Patterns + Match: Pattern Match.). + +`$(@D)' +`$(@F)' + The directory part and the file-within-directory part of `$@'. + +`$(*D)' +`$(*F)' + The directory part and the file-within-directory part of `$*'. + +`$(%D)' +`$(%F)' + The directory part and the file-within-directory part of `$%'. + +`$( tar-`sed -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c`.shar.Z + + .PHONY: dist + dist: $(SRCS) $(AUX) + echo tar-`sed \ + -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c` > .fname + -rm -rf `cat .fname` + mkdir `cat .fname` + ln $(SRCS) $(AUX) `cat .fname` + tar chZf `cat .fname`.tar.Z `cat .fname` + -rm -rf `cat .fname` .fname + + tar.zoo: $(SRCS) $(AUX) + -rm -rf tmp.dir + -mkdir tmp.dir + -rm tar.zoo + for X in $(SRCS) $(AUX) ; do \ + echo $$X ; \ + sed 's/$$/^M/' $$X \ + > tmp.dir/$$X ; done + cd tmp.dir ; zoo aM ../tar.zoo * + -rm -rf tmp.dir + + +File: make.info, Node: GNU Free Documentation License, Next: Concept Index, Prev: Complex Makefile, Up: Top + +C.1 GNU Free Documentation License +================================== + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008 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. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. + We recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it + can be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You + accept the license if you copy, modify or distribute the work in a + way requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in + the notice that says that the Document is released under this + License. If a section does not fit the above definition of + Secondary then it is not allowed to be designated as Invariant. + The Document may contain zero Invariant Sections. If the Document + does not identify any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images + composed of pixels) generic paint programs or (for drawings) some + widely available drawing editor, and that is suitable for input to + text formatters or for automatic translation to a variety of + formats suitable for input to text formatters. A copy made in an + otherwise Transparent file format whose markup, or absence of + markup, has been arranged to thwart or discourage subsequent + modification by readers is not Transparent. An image format is + not Transparent if used for any substantial amount of text. A + copy that is not "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and + standard-conforming simple HTML, PostScript or PDF designed for + human modification. Examples of transparent image formats include + PNG, XCF and JPG. Opaque formats include proprietary formats that + can be read and edited only by proprietary word processors, SGML or + XML for which the DTD and/or processing tools are not generally + available, and the machine-generated HTML, PostScript or PDF + produced by some word processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow + the conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the + title equally prominent and visible. You may add other material + on the covers in addition. Copying with changes limited to the + covers, as long as they preserve the title of the Document and + satisfy these conditions, can be treated as verbatim copying in + other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a + machine-readable Transparent copy along with each Opaque copy, or + state in or with each Opaque copy a computer-network location from + which the general network-using public has access to download + using public-standard network protocols a complete Transparent + copy of the Document, free of added material. If you use the + latter option, you must take reasonably prudent steps, when you + begin distribution of Opaque copies in quantity, to ensure that + this Transparent copy will remain thus accessible at the stated + location until at least one year after the last time you + distribute an Opaque copy (directly or through your agents or + retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of + copies, to give them a chance to provide you with an updated + version of the Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with + the Modified Version filling the role of the Document, thus + licensing distribution and modification of the Modified Version to + whoever possesses a copy of it. In addition, you must do these + things in the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of + previous versions (which should, if there were any, be listed + in the History section of the Document). You may use the + same title as a previous version if the original publisher of + that version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on + the Title Page. If there is no section Entitled "History" in + the Document, create one stating the title, year, authors, + and publisher of the Document as given on its Title Page, + then add an item describing the Modified Version as stated in + the previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in + the "History" section. You may omit a network location for a + work that was published at least four years before the + Document itself, or if the original publisher of the version + it refers to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the + section all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section + titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option + designate some or all of these sections as invariant. To do this, + add their titles to the list of Invariant Sections in the Modified + Version's license notice. These titles must be distinct from any + other section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end + of the list of Cover Texts in the Modified Version. Only one + passage of Front-Cover Text and one of Back-Cover Text may be + added by (or through arrangements made by) any one entity. If the + Document already includes a cover text for the same cover, + previously added by you or by arrangement made by the same entity + you are acting on behalf of, you may not add another; but you may + replace the old one, on explicit permission from the previous + publisher that added the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination + all of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the + documents in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow + this License in all other respects regarding verbatim copying of + that document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of + a storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + 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, receipt of a copy of some or all of + the same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation 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. See + `http://www.gnu.org/copyleft/'. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If + the Document does not specify a version number of this License, + you may choose any version ever published (not as a draft) by the + Free Software Foundation. If the Document specifies that a proxy + can decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, to +permit their use in free software. + + +File: make.info, Node: Concept Index, Next: Name Index, Prev: GNU Free Documentation License, Up: Top + +Index of Concepts +***************** + +[index] +* Menu: + +* # (comments), in makefile: Makefile Contents. (line 42) +* # (comments), in recipes: Recipe Syntax. (line 29) +* #include: Automatic Prerequisites. + (line 16) +* $, in function call: Syntax of Functions. (line 6) +* $, in rules: Rule Syntax. (line 34) +* $, in variable name: Computed Names. (line 6) +* $, in variable reference: Reference. (line 6) +* %, in pattern rules: Pattern Intro. (line 9) +* %, quoting in patsubst: Text Functions. (line 26) +* %, quoting in static pattern: Static Usage. (line 37) +* %, quoting in vpath: Selective Search. (line 38) +* %, quoting with \ (backslash) <1>: Text Functions. (line 26) +* %, quoting with \ (backslash) <2>: Static Usage. (line 37) +* %, quoting with \ (backslash): Selective Search. (line 38) +* * (wildcard character): Wildcards. (line 6) +* +, and define: Canned Recipes. (line 49) +* +, and recipe execution: Instead of Execution. + (line 60) +* +, and recipes: MAKE Variable. (line 18) +* +=: Appending. (line 6) +* +=, expansion: Reading Makefiles. (line 33) +* ,v (RCS file extension): Catalogue of Rules. (line 164) +* - (in recipes): Errors. (line 19) +* -, and define: Canned Recipes. (line 49) +* --always-make: Options Summary. (line 15) +* --assume-new <1>: Options Summary. (line 248) +* --assume-new: Instead of Execution. + (line 35) +* --assume-new, and recursion: Options/Recursion. (line 22) +* --assume-old <1>: Options Summary. (line 154) +* --assume-old: Avoiding Compilation. + (line 6) +* --assume-old, and recursion: Options/Recursion. (line 22) +* --check-symlink-times: Options Summary. (line 136) +* --debug: Options Summary. (line 42) +* --directory <1>: Options Summary. (line 26) +* --directory: Recursion. (line 20) +* --directory, and --print-directory: -w Option. (line 20) +* --directory, and recursion: Options/Recursion. (line 22) +* --dry-run <1>: Options Summary. (line 146) +* --dry-run <2>: Instead of Execution. + (line 14) +* --dry-run: Echoing. (line 18) +* --environment-overrides: Options Summary. (line 78) +* --eval: Options Summary. (line 83) +* --file <1>: Options Summary. (line 90) +* --file <2>: Makefile Arguments. (line 6) +* --file: Makefile Names. (line 23) +* --file, and recursion: Options/Recursion. (line 22) +* --help: Options Summary. (line 96) +* --ignore-errors <1>: Options Summary. (line 100) +* --ignore-errors: Errors. (line 30) +* --include-dir <1>: Options Summary. (line 105) +* --include-dir: Include. (line 53) +* --jobs <1>: Options Summary. (line 112) +* --jobs: Parallel. (line 6) +* --jobs, and recursion: Options/Recursion. (line 25) +* --just-print <1>: Options Summary. (line 145) +* --just-print <2>: Instead of Execution. + (line 14) +* --just-print: Echoing. (line 18) +* --keep-going <1>: Options Summary. (line 121) +* --keep-going <2>: Testing. (line 16) +* --keep-going: Errors. (line 47) +* --load-average <1>: Options Summary. (line 128) +* --load-average: Parallel. (line 58) +* --makefile <1>: Options Summary. (line 91) +* --makefile <2>: Makefile Arguments. (line 6) +* --makefile: Makefile Names. (line 23) +* --max-load <1>: Options Summary. (line 129) +* --max-load: Parallel. (line 58) +* --new-file <1>: Options Summary. (line 247) +* --new-file: Instead of Execution. + (line 35) +* --new-file, and recursion: Options/Recursion. (line 22) +* --no-builtin-rules: Options Summary. (line 182) +* --no-builtin-variables: Options Summary. (line 195) +* --no-keep-going: Options Summary. (line 210) +* --no-print-directory <1>: Options Summary. (line 239) +* --no-print-directory: -w Option. (line 20) +* --old-file <1>: Options Summary. (line 153) +* --old-file: Avoiding Compilation. + (line 6) +* --old-file, and recursion: Options/Recursion. (line 22) +* --print-data-base: Options Summary. (line 162) +* --print-directory: Options Summary. (line 231) +* --print-directory, and --directory: -w Option. (line 20) +* --print-directory, and recursion: -w Option. (line 20) +* --print-directory, disabling: -w Option. (line 20) +* --question <1>: Options Summary. (line 174) +* --question: Instead of Execution. + (line 27) +* --quiet <1>: Options Summary. (line 205) +* --quiet: Echoing. (line 24) +* --recon <1>: Options Summary. (line 147) +* --recon <2>: Instead of Execution. + (line 14) +* --recon: Echoing. (line 18) +* --silent <1>: Options Summary. (line 204) +* --silent: Echoing. (line 24) +* --stop: Options Summary. (line 211) +* --touch <1>: Options Summary. (line 219) +* --touch: Instead of Execution. + (line 21) +* --touch, and recursion: MAKE Variable. (line 34) +* --version: Options Summary. (line 226) +* --warn-undefined-variables: Options Summary. (line 257) +* --what-if <1>: Options Summary. (line 246) +* --what-if: Instead of Execution. + (line 35) +* -B: Options Summary. (line 14) +* -b: Options Summary. (line 9) +* -C <1>: Options Summary. (line 25) +* -C: Recursion. (line 20) +* -C, and -w: -w Option. (line 20) +* -C, and recursion: Options/Recursion. (line 22) +* -d: Options Summary. (line 33) +* -e: Options Summary. (line 77) +* -e (shell flag): Automatic Prerequisites. + (line 66) +* -f <1>: Options Summary. (line 89) +* -f <2>: Makefile Arguments. (line 6) +* -f: Makefile Names. (line 23) +* -f, and recursion: Options/Recursion. (line 22) +* -h: Options Summary. (line 95) +* -I: Options Summary. (line 104) +* -i <1>: Options Summary. (line 99) +* -i: Errors. (line 30) +* -I: Include. (line 53) +* -j <1>: Options Summary. (line 111) +* -j: Parallel. (line 6) +* -j, and archive update: Archive Pitfalls. (line 6) +* -j, and recursion: Options/Recursion. (line 25) +* -k <1>: Options Summary. (line 120) +* -k <2>: Testing. (line 16) +* -k: Errors. (line 47) +* -L: Options Summary. (line 135) +* -l: Options Summary. (line 127) +* -l (library search): Libraries/Search. (line 6) +* -l (load average): Parallel. (line 58) +* -m: Options Summary. (line 10) +* -M (to compiler): Automatic Prerequisites. + (line 18) +* -MM (to GNU compiler): Automatic Prerequisites. + (line 68) +* -n <1>: Options Summary. (line 144) +* -n <2>: Instead of Execution. + (line 14) +* -n: Echoing. (line 18) +* -o <1>: Options Summary. (line 152) +* -o: Avoiding Compilation. + (line 6) +* -o, and recursion: Options/Recursion. (line 22) +* -p: Options Summary. (line 161) +* -q <1>: Options Summary. (line 173) +* -q: Instead of Execution. + (line 27) +* -R: Options Summary. (line 194) +* -r: Options Summary. (line 181) +* -S: Options Summary. (line 209) +* -s <1>: Options Summary. (line 203) +* -s: Echoing. (line 24) +* -t <1>: Options Summary. (line 218) +* -t: Instead of Execution. + (line 21) +* -t, and recursion: MAKE Variable. (line 34) +* -v: Options Summary. (line 225) +* -W: Options Summary. (line 245) +* -w: Options Summary. (line 230) +* -W: Instead of Execution. + (line 35) +* -w, and -C: -w Option. (line 20) +* -w, and recursion: -w Option. (line 20) +* -W, and recursion: Options/Recursion. (line 22) +* -w, disabling: -w Option. (line 20) +* .a (archives): Archive Suffix Rules. + (line 6) +* .C: Catalogue of Rules. (line 39) +* .c: Catalogue of Rules. (line 35) +* .cc: Catalogue of Rules. (line 39) +* .ch: Catalogue of Rules. (line 151) +* .cpp: Catalogue of Rules. (line 39) +* .d: Automatic Prerequisites. + (line 81) +* .def: Catalogue of Rules. (line 74) +* .dvi: Catalogue of Rules. (line 151) +* .F: Catalogue of Rules. (line 49) +* .f: Catalogue of Rules. (line 49) +* .info: Catalogue of Rules. (line 158) +* .l: Catalogue of Rules. (line 124) +* .LIBPATTERNS, and link libraries: Libraries/Search. (line 6) +* .ln: Catalogue of Rules. (line 146) +* .mod: Catalogue of Rules. (line 74) +* .o: Catalogue of Rules. (line 35) +* .ONESHELL, use of: One Shell. (line 6) +* .p: Catalogue of Rules. (line 45) +* .PRECIOUS intermediate files: Chained Rules. (line 56) +* .r: Catalogue of Rules. (line 49) +* .S: Catalogue of Rules. (line 82) +* .s: Catalogue of Rules. (line 79) +* .sh: Catalogue of Rules. (line 180) +* .SHELLFLAGS, value of: Choosing the Shell. (line 6) +* .sym: Catalogue of Rules. (line 74) +* .tex: Catalogue of Rules. (line 151) +* .texi: Catalogue of Rules. (line 158) +* .texinfo: Catalogue of Rules. (line 158) +* .txinfo: Catalogue of Rules. (line 158) +* .w: Catalogue of Rules. (line 151) +* .web: Catalogue of Rules. (line 151) +* .y: Catalogue of Rules. (line 120) +* :: rules (double-colon): Double-Colon. (line 6) +* := <1>: Setting. (line 6) +* :=: Flavors. (line 56) +* = <1>: Setting. (line 6) +* =: Flavors. (line 10) +* =, expansion: Reading Makefiles. (line 33) +* ? (wildcard character): Wildcards. (line 6) +* ?= <1>: Setting. (line 6) +* ?=: Flavors. (line 129) +* ?=, expansion: Reading Makefiles. (line 33) +* @ (in recipes): Echoing. (line 6) +* @, and define: Canned Recipes. (line 49) +* [...] (wildcard characters): Wildcards. (line 6) +* \ (backslash), for continuation lines: Simple Makefile. (line 40) +* \ (backslash), in recipes: Splitting Lines. (line 6) +* \ (backslash), to quote % <1>: Text Functions. (line 26) +* \ (backslash), to quote % <2>: Static Usage. (line 37) +* \ (backslash), to quote %: Selective Search. (line 38) +* __.SYMDEF: Archive Symbols. (line 6) +* abspath: File Name Functions. (line 121) +* algorithm for directory search: Search Algorithm. (line 6) +* all (standard target): Goals. (line 72) +* appending to variables: Appending. (line 6) +* ar: Implicit Variables. (line 40) +* archive: Archives. (line 6) +* archive member targets: Archive Members. (line 6) +* archive symbol directory updating: Archive Symbols. (line 6) +* archive, and -j: Archive Pitfalls. (line 6) +* archive, and parallel execution: Archive Pitfalls. (line 6) +* archive, suffix rule for: Archive Suffix Rules. + (line 6) +* Arg list too long: Options/Recursion. (line 57) +* arguments of functions: Syntax of Functions. (line 6) +* as <1>: Implicit Variables. (line 43) +* as: Catalogue of Rules. (line 79) +* assembly, rule to compile: Catalogue of Rules. (line 79) +* automatic generation of prerequisites <1>: Automatic Prerequisites. + (line 6) +* automatic generation of prerequisites: Include. (line 51) +* automatic variables: Automatic Variables. (line 6) +* automatic variables in prerequisites: Automatic Variables. (line 17) +* backquotes: Shell Function. (line 6) +* backslash (\), for continuation lines: Simple Makefile. (line 40) +* backslash (\), in recipes: Splitting Lines. (line 6) +* backslash (\), to quote % <1>: Text Functions. (line 26) +* backslash (\), to quote % <2>: Static Usage. (line 37) +* backslash (\), to quote %: Selective Search. (line 38) +* backslashes in pathnames and wildcard expansion: Wildcard Pitfall. + (line 31) +* basename: File Name Functions. (line 57) +* binary packages: Install Command Categories. + (line 80) +* broken pipe: Parallel. (line 31) +* bugs, reporting: Bugs. (line 6) +* built-in special targets: Special Targets. (line 6) +* C++, rule to compile: Catalogue of Rules. (line 39) +* C, rule to compile: Catalogue of Rules. (line 35) +* canned recipes: Canned Recipes. (line 6) +* cc <1>: Implicit Variables. (line 46) +* cc: Catalogue of Rules. (line 35) +* cd (shell command) <1>: MAKE Variable. (line 16) +* cd (shell command): Execution. (line 12) +* chains of rules: Chained Rules. (line 6) +* check (standard target): Goals. (line 114) +* clean (standard target): Goals. (line 75) +* clean target <1>: Cleanup. (line 11) +* clean target: Simple Makefile. (line 84) +* cleaning up: Cleanup. (line 6) +* clobber (standard target): Goals. (line 86) +* co <1>: Implicit Variables. (line 66) +* co: Catalogue of Rules. (line 164) +* combining rules by prerequisite: Combine By Prerequisite. + (line 6) +* command expansion: Shell Function. (line 6) +* command line variable definitions, and recursion: Options/Recursion. + (line 17) +* command line variables: Overriding. (line 6) +* commands, sequences of: Canned Recipes. (line 6) +* comments, in makefile: Makefile Contents. (line 42) +* comments, in recipes: Recipe Syntax. (line 29) +* compatibility: Features. (line 6) +* compatibility in exporting: Variables/Recursion. (line 105) +* compilation, testing: Testing. (line 6) +* computed variable name: Computed Names. (line 6) +* conditional expansion: Conditional Functions. + (line 6) +* conditional variable assignment: Flavors. (line 129) +* conditionals: Conditionals. (line 6) +* continuation lines: Simple Makefile. (line 40) +* controlling make: Make Control Functions. + (line 6) +* conventions for makefiles: Makefile Conventions. + (line 6) +* ctangle <1>: Implicit Variables. (line 103) +* ctangle: Catalogue of Rules. (line 151) +* cweave <1>: Implicit Variables. (line 97) +* cweave: Catalogue of Rules. (line 151) +* data base of make rules: Options Summary. (line 162) +* deducing recipes (implicit rules): make Deduces. (line 6) +* default directories for included makefiles: Include. (line 53) +* default goal <1>: Rules. (line 11) +* default goal: How Make Works. (line 11) +* default makefile name: Makefile Names. (line 6) +* default rules, last-resort: Last Resort. (line 6) +* define, expansion: Reading Makefiles. (line 33) +* defining variables verbatim: Multi-Line. (line 6) +* deletion of target files <1>: Interrupts. (line 6) +* deletion of target files: Errors. (line 64) +* directive: Makefile Contents. (line 28) +* directories, creating installation: Directory Variables. (line 20) +* directories, printing them: -w Option. (line 6) +* directories, updating archive symbol: Archive Symbols. (line 6) +* directory part: File Name Functions. (line 17) +* directory search (VPATH): Directory Search. (line 6) +* directory search (VPATH), and implicit rules: Implicit/Search. + (line 6) +* directory search (VPATH), and link libraries: Libraries/Search. + (line 6) +* directory search (VPATH), and recipes: Recipes/Search. (line 6) +* directory search algorithm: Search Algorithm. (line 6) +* directory search, traditional (GPATH): Search Algorithm. (line 42) +* dist (standard target): Goals. (line 106) +* distclean (standard target): Goals. (line 84) +* dollar sign ($), in function call: Syntax of Functions. (line 6) +* dollar sign ($), in rules: Rule Syntax. (line 34) +* dollar sign ($), in variable name: Computed Names. (line 6) +* dollar sign ($), in variable reference: Reference. (line 6) +* DOS, choosing a shell in: Choosing the Shell. (line 38) +* double-colon rules: Double-Colon. (line 6) +* duplicate words, removing: Text Functions. (line 155) +* E2BIG: Options/Recursion. (line 57) +* echoing of recipes: Echoing. (line 6) +* editor: Introduction. (line 22) +* Emacs (M-x compile): Errors. (line 62) +* empty recipes: Empty Recipes. (line 6) +* empty targets: Empty Targets. (line 6) +* environment: Environment. (line 6) +* environment, and recursion: Variables/Recursion. (line 6) +* environment, SHELL in: Choosing the Shell. (line 12) +* error, stopping on: Make Control Functions. + (line 11) +* errors (in recipes): Errors. (line 6) +* errors with wildcards: Wildcard Pitfall. (line 6) +* evaluating makefile syntax: Eval Function. (line 6) +* execution, in parallel: Parallel. (line 6) +* execution, instead of: Instead of Execution. + (line 6) +* execution, of recipes: Execution. (line 6) +* exit status (errors): Errors. (line 6) +* exit status of make: Running. (line 18) +* expansion, secondary: Secondary Expansion. (line 6) +* explicit rule, definition of: Makefile Contents. (line 10) +* explicit rule, expansion: Reading Makefiles. (line 77) +* explicit rules, secondary expansion of: Secondary Expansion. + (line 106) +* exporting variables: Variables/Recursion. (line 6) +* f77 <1>: Implicit Variables. (line 57) +* f77: Catalogue of Rules. (line 49) +* FDL, GNU Free Documentation License: GNU Free Documentation License. + (line 6) +* features of GNU make: Features. (line 6) +* features, missing: Missing. (line 6) +* file name functions: File Name Functions. (line 6) +* file name of makefile: Makefile Names. (line 6) +* file name of makefile, how to specify: Makefile Names. (line 30) +* file name prefix, adding: File Name Functions. (line 79) +* file name suffix: File Name Functions. (line 43) +* file name suffix, adding: File Name Functions. (line 68) +* file name with wildcards: Wildcards. (line 6) +* file name, abspath of: File Name Functions. (line 121) +* file name, basename of: File Name Functions. (line 57) +* file name, directory part: File Name Functions. (line 17) +* file name, nondirectory part: File Name Functions. (line 27) +* file name, realpath of: File Name Functions. (line 114) +* files, assuming new: Instead of Execution. + (line 35) +* files, assuming old: Avoiding Compilation. + (line 6) +* files, avoiding recompilation of: Avoiding Compilation. + (line 6) +* files, intermediate: Chained Rules. (line 16) +* filtering out words: Text Functions. (line 132) +* filtering words: Text Functions. (line 114) +* finding strings: Text Functions. (line 103) +* flags: Options Summary. (line 6) +* flags for compilers: Implicit Variables. (line 6) +* flavor of variable: Flavor Function. (line 6) +* flavors of variables: Flavors. (line 6) +* FORCE: Force Targets. (line 6) +* force targets: Force Targets. (line 6) +* Fortran, rule to compile: Catalogue of Rules. (line 49) +* functions: Functions. (line 6) +* functions, for controlling make: Make Control Functions. + (line 6) +* functions, for file names: File Name Functions. (line 6) +* functions, for text: Text Functions. (line 6) +* functions, syntax of: Syntax of Functions. (line 6) +* functions, user defined: Call Function. (line 6) +* g++ <1>: Implicit Variables. (line 49) +* g++: Catalogue of Rules. (line 39) +* gcc: Catalogue of Rules. (line 35) +* generating prerequisites automatically <1>: Automatic Prerequisites. + (line 6) +* generating prerequisites automatically: Include. (line 51) +* get <1>: Implicit Variables. (line 69) +* get: Catalogue of Rules. (line 173) +* globbing (wildcards): Wildcards. (line 6) +* goal: How Make Works. (line 11) +* goal, default <1>: Rules. (line 11) +* goal, default: How Make Works. (line 11) +* goal, how to specify: Goals. (line 6) +* home directory: Wildcards. (line 11) +* IEEE Standard 1003.2: Overview. (line 13) +* ifdef, expansion: Reading Makefiles. (line 67) +* ifeq, expansion: Reading Makefiles. (line 67) +* ifndef, expansion: Reading Makefiles. (line 67) +* ifneq, expansion: Reading Makefiles. (line 67) +* implicit rule: Implicit Rules. (line 6) +* implicit rule, and directory search: Implicit/Search. (line 6) +* implicit rule, and VPATH: Implicit/Search. (line 6) +* implicit rule, definition of: Makefile Contents. (line 16) +* implicit rule, expansion: Reading Makefiles. (line 77) +* implicit rule, how to use: Using Implicit. (line 6) +* implicit rule, introduction to: make Deduces. (line 6) +* implicit rule, predefined: Catalogue of Rules. (line 6) +* implicit rule, search algorithm: Implicit Rule Search. + (line 6) +* implicit rules, secondary expansion of: Secondary Expansion. + (line 146) +* included makefiles, default directories: Include. (line 53) +* including (MAKEFILE_LIST variable): Special Variables. (line 8) +* including (MAKEFILES variable): MAKEFILES Variable. (line 6) +* including other makefiles: Include. (line 6) +* incompatibilities: Missing. (line 6) +* Info, rule to format: Catalogue of Rules. (line 158) +* inheritance, suppressing: Suppressing Inheritance. + (line 6) +* install (standard target): Goals. (line 92) +* installation directories, creating: Directory Variables. (line 20) +* installations, staged: DESTDIR. (line 6) +* intermediate files: Chained Rules. (line 16) +* intermediate files, preserving: Chained Rules. (line 46) +* intermediate targets, explicit: Special Targets. (line 44) +* interrupt: Interrupts. (line 6) +* job slots: Parallel. (line 6) +* job slots, and recursion: Options/Recursion. (line 25) +* jobs, limiting based on load: Parallel. (line 58) +* joining lists of words: File Name Functions. (line 90) +* killing (interruption): Interrupts. (line 6) +* last-resort default rules: Last Resort. (line 6) +* ld: Catalogue of Rules. (line 86) +* lex <1>: Implicit Variables. (line 73) +* lex: Catalogue of Rules. (line 124) +* Lex, rule to run: Catalogue of Rules. (line 124) +* libraries for linking, directory search: Libraries/Search. (line 6) +* library archive, suffix rule for: Archive Suffix Rules. + (line 6) +* limiting jobs based on load: Parallel. (line 58) +* link libraries, and directory search: Libraries/Search. (line 6) +* link libraries, patterns matching: Libraries/Search. (line 6) +* linking, predefined rule for: Catalogue of Rules. (line 86) +* lint <1>: Implicit Variables. (line 80) +* lint: Catalogue of Rules. (line 146) +* lint, rule to run: Catalogue of Rules. (line 146) +* list of all prerequisites: Automatic Variables. (line 61) +* list of changed prerequisites: Automatic Variables. (line 51) +* load average: Parallel. (line 58) +* loops in variable expansion: Flavors. (line 44) +* lpr (shell command) <1>: Empty Targets. (line 25) +* lpr (shell command): Wildcard Examples. (line 21) +* m2c <1>: Implicit Variables. (line 60) +* m2c: Catalogue of Rules. (line 74) +* macro: Using Variables. (line 10) +* make depend: Automatic Prerequisites. + (line 37) +* makefile: Introduction. (line 7) +* makefile name: Makefile Names. (line 6) +* makefile name, how to specify: Makefile Names. (line 30) +* makefile rule parts: Rule Introduction. (line 6) +* makefile syntax, evaluating: Eval Function. (line 6) +* makefile, and MAKEFILES variable: MAKEFILES Variable. (line 6) +* makefile, conventions for: Makefile Conventions. + (line 6) +* makefile, how make processes: How Make Works. (line 6) +* makefile, how to write: Makefiles. (line 6) +* makefile, including: Include. (line 6) +* makefile, overriding: Overriding Makefiles. + (line 6) +* makefile, parsing: Reading Makefiles. (line 6) +* makefile, remaking of: Remaking Makefiles. (line 6) +* makefile, simple: Simple Makefile. (line 6) +* makefiles, and MAKEFILE_LIST variable: Special Variables. (line 8) +* makefiles, and special variables: Special Variables. (line 6) +* makeinfo <1>: Implicit Variables. (line 84) +* makeinfo: Catalogue of Rules. (line 158) +* match-anything rule: Match-Anything Rules. + (line 6) +* match-anything rule, used to override: Overriding Makefiles. + (line 12) +* missing features: Missing. (line 6) +* mistakes with wildcards: Wildcard Pitfall. (line 6) +* modified variable reference: Substitution Refs. (line 6) +* Modula-2, rule to compile: Catalogue of Rules. (line 74) +* mostlyclean (standard target): Goals. (line 78) +* multi-line variable definition: Multi-Line. (line 6) +* multiple rules for one target: Multiple Rules. (line 6) +* multiple rules for one target (::): Double-Colon. (line 6) +* multiple targets: Multiple Targets. (line 6) +* multiple targets, in pattern rule: Pattern Intro. (line 53) +* name of makefile: Makefile Names. (line 6) +* name of makefile, how to specify: Makefile Names. (line 30) +* nested variable reference: Computed Names. (line 6) +* newline, quoting, in makefile: Simple Makefile. (line 40) +* newline, quoting, in recipes: Splitting Lines. (line 6) +* nondirectory part: File Name Functions. (line 27) +* normal prerequisites: Prerequisite Types. (line 6) +* OBJ: Variables Simplify. (line 20) +* obj: Variables Simplify. (line 20) +* OBJECTS: Variables Simplify. (line 20) +* objects: Variables Simplify. (line 14) +* OBJS: Variables Simplify. (line 20) +* objs: Variables Simplify. (line 20) +* old-fashioned suffix rules: Suffix Rules. (line 6) +* options: Options Summary. (line 6) +* options, and recursion: Options/Recursion. (line 6) +* options, setting from environment: Options/Recursion. (line 81) +* options, setting in makefiles: Options/Recursion. (line 81) +* order of pattern rules: Pattern Match. (line 30) +* order-only prerequisites: Prerequisite Types. (line 6) +* origin of variable: Origin Function. (line 6) +* overriding makefiles: Overriding Makefiles. + (line 6) +* overriding variables with arguments: Overriding. (line 6) +* overriding with override: Override Directive. (line 6) +* parallel execution: Parallel. (line 6) +* parallel execution, and archive update: Archive Pitfalls. (line 6) +* parallel execution, overriding: Special Targets. (line 130) +* parts of makefile rule: Rule Introduction. (line 6) +* Pascal, rule to compile: Catalogue of Rules. (line 45) +* pattern rule: Pattern Intro. (line 6) +* pattern rule, expansion: Reading Makefiles. (line 77) +* pattern rules, order of: Pattern Match. (line 30) +* pattern rules, static (not implicit): Static Pattern. (line 6) +* pattern rules, static, syntax of: Static Usage. (line 6) +* pattern-specific variables: Pattern-specific. (line 6) +* pc <1>: Implicit Variables. (line 63) +* pc: Catalogue of Rules. (line 45) +* phony targets: Phony Targets. (line 6) +* phony targets and recipe execution: Instead of Execution. + (line 68) +* pitfalls of wildcards: Wildcard Pitfall. (line 6) +* portability: Features. (line 6) +* POSIX: Overview. (line 13) +* POSIX-conforming mode, setting: Special Targets. (line 143) +* POSIX.2: Options/Recursion. (line 60) +* post-installation commands: Install Command Categories. + (line 6) +* pre-installation commands: Install Command Categories. + (line 6) +* precious targets: Special Targets. (line 29) +* predefined rules and variables, printing: Options Summary. (line 162) +* prefix, adding: File Name Functions. (line 79) +* prerequisite: Rules. (line 6) +* prerequisite pattern, implicit: Pattern Intro. (line 22) +* prerequisite pattern, static (not implicit): Static Usage. (line 30) +* prerequisite types: Prerequisite Types. (line 6) +* prerequisite, expansion: Reading Makefiles. (line 77) +* prerequisites: Rule Syntax. (line 48) +* prerequisites, and automatic variables: Automatic Variables. + (line 17) +* prerequisites, automatic generation <1>: Automatic Prerequisites. + (line 6) +* prerequisites, automatic generation: Include. (line 51) +* prerequisites, introduction to: Rule Introduction. (line 8) +* prerequisites, list of all: Automatic Variables. (line 61) +* prerequisites, list of changed: Automatic Variables. (line 51) +* prerequisites, normal: Prerequisite Types. (line 6) +* prerequisites, order-only: Prerequisite Types. (line 6) +* prerequisites, varying (static pattern): Static Pattern. (line 6) +* preserving intermediate files: Chained Rules. (line 46) +* preserving with .PRECIOUS <1>: Chained Rules. (line 56) +* preserving with .PRECIOUS: Special Targets. (line 29) +* preserving with .SECONDARY: Special Targets. (line 49) +* print (standard target): Goals. (line 97) +* print target <1>: Empty Targets. (line 25) +* print target: Wildcard Examples. (line 21) +* printing directories: -w Option. (line 6) +* printing messages: Make Control Functions. + (line 43) +* printing of recipes: Echoing. (line 6) +* printing user warnings: Make Control Functions. + (line 35) +* problems and bugs, reporting: Bugs. (line 6) +* problems with wildcards: Wildcard Pitfall. (line 6) +* processing a makefile: How Make Works. (line 6) +* question mode: Instead of Execution. + (line 27) +* quoting %, in patsubst: Text Functions. (line 26) +* quoting %, in static pattern: Static Usage. (line 37) +* quoting %, in vpath: Selective Search. (line 38) +* quoting newline, in makefile: Simple Makefile. (line 40) +* quoting newline, in recipes: Splitting Lines. (line 6) +* Ratfor, rule to compile: Catalogue of Rules. (line 49) +* RCS, rule to extract from: Catalogue of Rules. (line 164) +* reading makefiles: Reading Makefiles. (line 6) +* README: Makefile Names. (line 9) +* realclean (standard target): Goals. (line 85) +* realpath: File Name Functions. (line 114) +* recipe: Simple Makefile. (line 73) +* recipe execution, single invocation: Special Targets. (line 137) +* recipe lines, single shell: One Shell. (line 6) +* recipe syntax: Recipe Syntax. (line 6) +* recipe, execution: Execution. (line 6) +* recipes <1>: Recipes. (line 6) +* recipes: Rule Syntax. (line 26) +* recipes setting shell variables: Execution. (line 12) +* recipes, and directory search: Recipes/Search. (line 6) +* recipes, backslash (\) in: Splitting Lines. (line 6) +* recipes, canned: Canned Recipes. (line 6) +* recipes, comments in: Recipe Syntax. (line 29) +* recipes, echoing: Echoing. (line 6) +* recipes, empty: Empty Recipes. (line 6) +* recipes, errors in: Errors. (line 6) +* recipes, execution in parallel: Parallel. (line 6) +* recipes, how to write: Recipes. (line 6) +* recipes, instead of executing: Instead of Execution. + (line 6) +* recipes, introduction to: Rule Introduction. (line 8) +* recipes, quoting newlines in: Splitting Lines. (line 6) +* recipes, splitting: Splitting Lines. (line 6) +* recipes, using variables in: Variables in Recipes. + (line 6) +* recompilation: Introduction. (line 22) +* recompilation, avoiding: Avoiding Compilation. + (line 6) +* recording events with empty targets: Empty Targets. (line 6) +* recursion: Recursion. (line 6) +* recursion, and -C: Options/Recursion. (line 22) +* recursion, and -f: Options/Recursion. (line 22) +* recursion, and -j: Options/Recursion. (line 25) +* recursion, and -o: Options/Recursion. (line 22) +* recursion, and -t: MAKE Variable. (line 34) +* recursion, and -w: -w Option. (line 20) +* recursion, and -W: Options/Recursion. (line 22) +* recursion, and command line variable definitions: Options/Recursion. + (line 17) +* recursion, and environment: Variables/Recursion. (line 6) +* recursion, and MAKE variable: MAKE Variable. (line 6) +* recursion, and MAKEFILES variable: MAKEFILES Variable. (line 15) +* recursion, and options: Options/Recursion. (line 6) +* recursion, and printing directories: -w Option. (line 6) +* recursion, and variables: Variables/Recursion. (line 6) +* recursion, level of: Variables/Recursion. (line 115) +* recursive variable expansion <1>: Flavors. (line 6) +* recursive variable expansion: Using Variables. (line 6) +* recursively expanded variables: Flavors. (line 6) +* reference to variables <1>: Advanced. (line 6) +* reference to variables: Reference. (line 6) +* relinking: How Make Works. (line 46) +* remaking makefiles: Remaking Makefiles. (line 6) +* removal of target files <1>: Interrupts. (line 6) +* removal of target files: Errors. (line 64) +* removing duplicate words: Text Functions. (line 155) +* removing targets on failure: Special Targets. (line 64) +* removing, to clean up: Cleanup. (line 6) +* reporting bugs: Bugs. (line 6) +* rm: Implicit Variables. (line 106) +* rm (shell command) <1>: Errors. (line 27) +* rm (shell command) <2>: Phony Targets. (line 20) +* rm (shell command) <3>: Wildcard Examples. (line 12) +* rm (shell command): Simple Makefile. (line 84) +* rule prerequisites: Rule Syntax. (line 48) +* rule syntax: Rule Syntax. (line 6) +* rule targets: Rule Syntax. (line 18) +* rule, double-colon (::): Double-Colon. (line 6) +* rule, explicit, definition of: Makefile Contents. (line 10) +* rule, how to write: Rules. (line 6) +* rule, implicit: Implicit Rules. (line 6) +* rule, implicit, and directory search: Implicit/Search. (line 6) +* rule, implicit, and VPATH: Implicit/Search. (line 6) +* rule, implicit, chains of: Chained Rules. (line 6) +* rule, implicit, definition of: Makefile Contents. (line 16) +* rule, implicit, how to use: Using Implicit. (line 6) +* rule, implicit, introduction to: make Deduces. (line 6) +* rule, implicit, predefined: Catalogue of Rules. (line 6) +* rule, introduction to: Rule Introduction. (line 6) +* rule, multiple for one target: Multiple Rules. (line 6) +* rule, no recipe or prerequisites: Force Targets. (line 6) +* rule, pattern: Pattern Intro. (line 6) +* rule, static pattern: Static Pattern. (line 6) +* rule, static pattern versus implicit: Static versus Implicit. + (line 6) +* rule, with multiple targets: Multiple Targets. (line 6) +* rules, and $: Rule Syntax. (line 34) +* s. (SCCS file prefix): Catalogue of Rules. (line 173) +* SCCS, rule to extract from: Catalogue of Rules. (line 173) +* search algorithm, implicit rule: Implicit Rule Search. + (line 6) +* search path for prerequisites (VPATH): Directory Search. (line 6) +* search path for prerequisites (VPATH), and implicit rules: Implicit/Search. + (line 6) +* search path for prerequisites (VPATH), and link libraries: Libraries/Search. + (line 6) +* searching for strings: Text Functions. (line 103) +* secondary expansion: Secondary Expansion. (line 6) +* secondary expansion and explicit rules: Secondary Expansion. + (line 106) +* secondary expansion and implicit rules: Secondary Expansion. + (line 146) +* secondary expansion and static pattern rules: Secondary Expansion. + (line 138) +* secondary files: Chained Rules. (line 46) +* secondary targets: Special Targets. (line 49) +* sed (shell command): Automatic Prerequisites. + (line 73) +* selecting a word: Text Functions. (line 159) +* selecting word lists: Text Functions. (line 168) +* sequences of commands: Canned Recipes. (line 6) +* setting options from environment: Options/Recursion. (line 81) +* setting options in makefiles: Options/Recursion. (line 81) +* setting variables: Setting. (line 6) +* several rules for one target: Multiple Rules. (line 6) +* several targets in a rule: Multiple Targets. (line 6) +* shar (standard target): Goals. (line 103) +* shell command, function for: Shell Function. (line 6) +* shell file name pattern (in include): Include. (line 13) +* shell variables, setting in recipes: Execution. (line 12) +* shell wildcards (in include): Include. (line 13) +* shell, choosing the: Choosing the Shell. (line 6) +* SHELL, exported value: Variables/Recursion. (line 23) +* SHELL, import from environment: Environment. (line 37) +* shell, in DOS and Windows: Choosing the Shell. (line 38) +* SHELL, MS-DOS specifics: Choosing the Shell. (line 44) +* SHELL, value of: Choosing the Shell. (line 6) +* signal: Interrupts. (line 6) +* silent operation: Echoing. (line 6) +* simple makefile: Simple Makefile. (line 6) +* simple variable expansion: Using Variables. (line 6) +* simplifying with variables: Variables Simplify. (line 6) +* simply expanded variables: Flavors. (line 56) +* sorting words: Text Functions. (line 146) +* spaces, in variable values: Flavors. (line 103) +* spaces, stripping: Text Functions. (line 80) +* special targets: Special Targets. (line 6) +* special variables: Special Variables. (line 6) +* specifying makefile name: Makefile Names. (line 30) +* splitting recipes: Splitting Lines. (line 6) +* staged installs: DESTDIR. (line 6) +* standard input: Parallel. (line 31) +* standards conformance: Overview. (line 13) +* standards for makefiles: Makefile Conventions. + (line 6) +* static pattern rule: Static Pattern. (line 6) +* static pattern rule, syntax of: Static Usage. (line 6) +* static pattern rule, versus implicit: Static versus Implicit. + (line 6) +* static pattern rules, secondary expansion of: Secondary Expansion. + (line 138) +* stem <1>: Pattern Match. (line 6) +* stem: Static Usage. (line 17) +* stem, shortest: Pattern Match. (line 38) +* stem, variable for: Automatic Variables. (line 77) +* stopping make: Make Control Functions. + (line 11) +* strings, searching for: Text Functions. (line 103) +* stripping whitespace: Text Functions. (line 80) +* sub-make: Variables/Recursion. (line 6) +* subdirectories, recursion for: Recursion. (line 6) +* substitution variable reference: Substitution Refs. (line 6) +* suffix rule: Suffix Rules. (line 6) +* suffix rule, for archive: Archive Suffix Rules. + (line 6) +* suffix, adding: File Name Functions. (line 68) +* suffix, function to find: File Name Functions. (line 43) +* suffix, substituting in variables: Substitution Refs. (line 6) +* suppressing inheritance: Suppressing Inheritance. + (line 6) +* switches: Options Summary. (line 6) +* symbol directories, updating archive: Archive Symbols. (line 6) +* syntax of recipe: Recipe Syntax. (line 6) +* syntax of rules: Rule Syntax. (line 6) +* tab character (in commands): Rule Syntax. (line 26) +* tabs in rules: Rule Introduction. (line 21) +* TAGS (standard target): Goals. (line 111) +* tangle <1>: Implicit Variables. (line 100) +* tangle: Catalogue of Rules. (line 151) +* tar (standard target): Goals. (line 100) +* target: Rules. (line 6) +* target pattern, implicit: Pattern Intro. (line 9) +* target pattern, static (not implicit): Static Usage. (line 17) +* target, deleting on error: Errors. (line 64) +* target, deleting on interrupt: Interrupts. (line 6) +* target, expansion: Reading Makefiles. (line 77) +* target, multiple in pattern rule: Pattern Intro. (line 53) +* target, multiple rules for one: Multiple Rules. (line 6) +* target, touching: Instead of Execution. + (line 21) +* target-specific variables: Target-specific. (line 6) +* targets: Rule Syntax. (line 18) +* targets without a file: Phony Targets. (line 6) +* targets, built-in special: Special Targets. (line 6) +* targets, empty: Empty Targets. (line 6) +* targets, force: Force Targets. (line 6) +* targets, introduction to: Rule Introduction. (line 8) +* targets, multiple: Multiple Targets. (line 6) +* targets, phony: Phony Targets. (line 6) +* terminal rule: Match-Anything Rules. + (line 6) +* test (standard target): Goals. (line 115) +* testing compilation: Testing. (line 6) +* tex <1>: Implicit Variables. (line 87) +* tex: Catalogue of Rules. (line 151) +* TeX, rule to run: Catalogue of Rules. (line 151) +* texi2dvi <1>: Implicit Variables. (line 91) +* texi2dvi: Catalogue of Rules. (line 158) +* Texinfo, rule to format: Catalogue of Rules. (line 158) +* tilde (~): Wildcards. (line 11) +* touch (shell command) <1>: Empty Targets. (line 25) +* touch (shell command): Wildcard Examples. (line 21) +* touching files: Instead of Execution. + (line 21) +* traditional directory search (GPATH): Search Algorithm. (line 42) +* types of prerequisites: Prerequisite Types. (line 6) +* undefined variables, warning message: Options Summary. (line 257) +* undefining variable: Undefine Directive. (line 6) +* updating archive symbol directories: Archive Symbols. (line 6) +* updating makefiles: Remaking Makefiles. (line 6) +* user defined functions: Call Function. (line 6) +* value: Using Variables. (line 6) +* value, how a variable gets it: Values. (line 6) +* variable: Using Variables. (line 6) +* variable definition: Makefile Contents. (line 22) +* variable references in recipes: Variables in Recipes. + (line 6) +* variables: Variables Simplify. (line 6) +* variables, $ in name: Computed Names. (line 6) +* variables, and implicit rule: Automatic Variables. (line 6) +* variables, appending to: Appending. (line 6) +* variables, automatic: Automatic Variables. (line 6) +* variables, command line: Overriding. (line 6) +* variables, command line, and recursion: Options/Recursion. (line 17) +* variables, computed names: Computed Names. (line 6) +* variables, conditional assignment: Flavors. (line 129) +* variables, defining verbatim: Multi-Line. (line 6) +* variables, environment <1>: Environment. (line 6) +* variables, environment: Variables/Recursion. (line 6) +* variables, exporting: Variables/Recursion. (line 6) +* variables, flavor of: Flavor Function. (line 6) +* variables, flavors: Flavors. (line 6) +* variables, how they get their values: Values. (line 6) +* variables, how to reference: Reference. (line 6) +* variables, loops in expansion: Flavors. (line 44) +* variables, modified reference: Substitution Refs. (line 6) +* variables, multi-line: Multi-Line. (line 6) +* variables, nested references: Computed Names. (line 6) +* variables, origin of: Origin Function. (line 6) +* variables, overriding: Override Directive. (line 6) +* variables, overriding with arguments: Overriding. (line 6) +* variables, pattern-specific: Pattern-specific. (line 6) +* variables, recursively expanded: Flavors. (line 6) +* variables, setting: Setting. (line 6) +* variables, simply expanded: Flavors. (line 56) +* variables, spaces in values: Flavors. (line 103) +* variables, substituting suffix in: Substitution Refs. (line 6) +* variables, substitution reference: Substitution Refs. (line 6) +* variables, target-specific: Target-specific. (line 6) +* variables, unexpanded value: Value Function. (line 6) +* variables, warning for undefined: Options Summary. (line 257) +* varying prerequisites: Static Pattern. (line 6) +* verbatim variable definition: Multi-Line. (line 6) +* vpath: Directory Search. (line 6) +* VPATH, and implicit rules: Implicit/Search. (line 6) +* VPATH, and link libraries: Libraries/Search. (line 6) +* warnings, printing: Make Control Functions. + (line 35) +* weave <1>: Implicit Variables. (line 94) +* weave: Catalogue of Rules. (line 151) +* Web, rule to run: Catalogue of Rules. (line 151) +* what if: Instead of Execution. + (line 35) +* whitespace, in variable values: Flavors. (line 103) +* whitespace, stripping: Text Functions. (line 80) +* wildcard: Wildcards. (line 6) +* wildcard pitfalls: Wildcard Pitfall. (line 6) +* wildcard, function: File Name Functions. (line 107) +* wildcard, in archive member: Archive Members. (line 36) +* wildcard, in include: Include. (line 13) +* wildcards and MS-DOS/MS-Windows backslashes: Wildcard Pitfall. + (line 31) +* Windows, choosing a shell in: Choosing the Shell. (line 38) +* word, selecting a: Text Functions. (line 159) +* words, extracting first: Text Functions. (line 184) +* words, extracting last: Text Functions. (line 197) +* words, filtering: Text Functions. (line 114) +* words, filtering out: Text Functions. (line 132) +* words, finding number: Text Functions. (line 180) +* words, iterating over: Foreach Function. (line 6) +* words, joining lists: File Name Functions. (line 90) +* words, removing duplicates: Text Functions. (line 155) +* words, selecting lists of: Text Functions. (line 168) +* writing recipes: Recipes. (line 6) +* writing rules: Rules. (line 6) +* yacc <1>: Implicit Variables. (line 77) +* yacc <2>: Catalogue of Rules. (line 120) +* yacc: Canned Recipes. (line 18) +* Yacc, rule to run: Catalogue of Rules. (line 120) +* ~ (tilde): Wildcards. (line 11) + + +File: make.info, Node: Name Index, Prev: Concept Index, Up: Top + +Index of Functions, Variables, & Directives +******************************************* + +[index] +* Menu: + +* $%: Automatic Variables. (line 37) +* $(%D): Automatic Variables. (line 129) +* $(%F): Automatic Variables. (line 130) +* $(*D): Automatic Variables. (line 124) +* $(*F): Automatic Variables. (line 125) +* $(+D): Automatic Variables. (line 147) +* $(+F): Automatic Variables. (line 148) +* $(: Last Resort. (line 23) +* .DEFAULT: Special Targets. (line 20) +* .DEFAULT, and empty recipes: Empty Recipes. (line 16) +* .DEFAULT_GOAL (define default goal): Special Variables. (line 34) +* .DELETE_ON_ERROR <1>: Errors. (line 64) +* .DELETE_ON_ERROR: Special Targets. (line 63) +* .EXPORT_ALL_VARIABLES <1>: Variables/Recursion. (line 99) +* .EXPORT_ALL_VARIABLES: Special Targets. (line 124) +* .FEATURES (list of supported features): Special Variables. (line 102) +* .IGNORE <1>: Errors. (line 30) +* .IGNORE: Special Targets. (line 69) +* .INCLUDE_DIRS (list of include directories): Special Variables. + (line 135) +* .INTERMEDIATE: Special Targets. (line 43) +* .LIBPATTERNS: Libraries/Search. (line 6) +* .LOW_RESOLUTION_TIME: Special Targets. (line 81) +* .NOTPARALLEL: Special Targets. (line 129) +* .ONESHELL <1>: One Shell. (line 6) +* .ONESHELL: Special Targets. (line 136) +* .PHONY <1>: Special Targets. (line 8) +* .PHONY: Phony Targets. (line 22) +* .POSIX <1>: Options/Recursion. (line 60) +* .POSIX: Special Targets. (line 142) +* .PRECIOUS <1>: Interrupts. (line 22) +* .PRECIOUS: Special Targets. (line 28) +* .RECIPEPREFIX (change the recipe prefix character): Special Variables. + (line 80) +* .SECONDARY: Special Targets. (line 48) +* .SECONDEXPANSION <1>: Special Targets. (line 57) +* .SECONDEXPANSION: Secondary Expansion. (line 6) +* .SHELLFLAGS: Choosing the Shell. (line 6) +* .SILENT <1>: Echoing. (line 24) +* .SILENT: Special Targets. (line 111) +* .SUFFIXES <1>: Suffix Rules. (line 61) +* .SUFFIXES: Special Targets. (line 15) +* .VARIABLES (list of variables): Special Variables. (line 93) +* /usr/gnu/include: Include. (line 53) +* /usr/include: Include. (line 53) +* /usr/local/include: Include. (line 53) +* < (automatic variable): Automatic Variables. (line 43) +* : Flavors. (line 84) +* MAKE: MAKE Variable. (line 6) +* MAKE_RESTARTS (number of times make has restarted): Special Variables. + (line 73) +* MAKE_VERSION: Features. (line 197) +* MAKECMDGOALS: Goals. (line 30) +* makefile: Makefile Names. (line 7) +* Makefile: Makefile Names. (line 7) +* MAKEFILE_LIST (list of parsed makefiles): Special Variables. + (line 8) +* MAKEFILES <1>: Variables/Recursion. (line 127) +* MAKEFILES: MAKEFILES Variable. (line 6) +* MAKEFLAGS: Options/Recursion. (line 6) +* MAKEINFO: Implicit Variables. (line 83) +* MAKELEVEL <1>: Flavors. (line 84) +* MAKELEVEL: Variables/Recursion. (line 115) +* MAKEOVERRIDES: Options/Recursion. (line 49) +* MAKESHELL (MS-DOS alternative to SHELL): Choosing the Shell. + (line 27) +* MFLAGS: Options/Recursion. (line 65) +* notdir: File Name Functions. (line 27) +* or: Conditional Functions. + (line 37) +* origin: Origin Function. (line 6) +* OUTPUT_OPTION: Catalogue of Rules. (line 202) +* override: Override Directive. (line 6) +* patsubst <1>: Text Functions. (line 18) +* patsubst: Substitution Refs. (line 28) +* PC: Implicit Variables. (line 63) +* PFLAGS: Implicit Variables. (line 149) +* prefix: Directory Variables. (line 29) +* private: Suppressing Inheritance. + (line 6) +* realpath: File Name Functions. (line 114) +* RFLAGS: Implicit Variables. (line 152) +* RM: Implicit Variables. (line 106) +* sbindir: Directory Variables. (line 63) +* shell: Shell Function. (line 6) +* SHELL: Choosing the Shell. (line 6) +* SHELL (recipe execution): Execution. (line 6) +* sort: Text Functions. (line 146) +* strip: Text Functions. (line 80) +* subst <1>: Text Functions. (line 9) +* subst: Multiple Targets. (line 28) +* suffix: File Name Functions. (line 43) +* SUFFIXES: Suffix Rules. (line 81) +* TANGLE: Implicit Variables. (line 100) +* TEX: Implicit Variables. (line 87) +* TEXI2DVI: Implicit Variables. (line 90) +* undefine: Undefine Directive. (line 6) +* unexport: Variables/Recursion. (line 45) +* value: Value Function. (line 6) +* vpath: Selective Search. (line 6) +* VPATH: General Search. (line 6) +* vpath: Directory Search. (line 6) +* VPATH: Directory Search. (line 6) +* warning: Make Control Functions. + (line 35) +* WEAVE: Implicit Variables. (line 94) +* wildcard <1>: File Name Functions. (line 107) +* wildcard: Wildcard Function. (line 6) +* word: Text Functions. (line 159) +* wordlist: Text Functions. (line 168) +* words: Text Functions. (line 180) +* YACC: Implicit Variables. (line 76) +* YFLAGS: Implicit Variables. (line 146) +* | (automatic variable): Automatic Variables. (line 69) + + diff --git a/doc/make.texi b/doc/make.texi new file mode 100644 index 0000000..fc7e8a3 --- /dev/null +++ b/doc/make.texi @@ -0,0 +1,11458 @@ +\input texinfo @c -*- Texinfo -*- +@c %**start of header +@setfilename make.info + +@include version.texi +@set EDITION 0.71 +@set RCSID $Id: make.texi,v 1.66 2010/07/19 07:10:54 psmith Exp $ + +@settitle GNU @code{make} +@setchapternewpage odd +@c Combine the variable and function indices: +@syncodeindex vr fn +@c Combine the program and concept indices: +@syncodeindex pg cp +@c FSF publishers: format makebook.texi instead of using this file directly. +@c ISBN confirmed by Jasimin Huang on 25 Mar 2009 +@set ISBN 1-882114-83-3 +@c %**end of header + +@copying +This file documents the GNU @code{make} utility, which determines +automatically which pieces of a large program need to be recompiled, +and issues the commands to recompile them. + +This is Edition @value{EDITION}, last updated @value{UPDATED}, +of @cite{The GNU Make Manual}, for GNU @code{make} version @value{VERSION}. + +Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, +1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, +2008, 2009, 2010 Free Software Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no +Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,'' +and with the Back-Cover Texts as in (a) below. A copy of the +license is included in the section entitled ``GNU Free Documentation +License.'' + +(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and +modify this GNU manual. Buying copies from the FSF supports it in +developing GNU and promoting software freedom.'' +@end quotation +@end copying + +@c finalout + +@c ISPELL CHECK: done, 10 June 1993 --roland +@c ISPELL CHECK: done, 2000-06-25 --Martin Buchholz + + +@dircategory Software development +@direntry +* Make: (make). Remake files automatically. +@end direntry + +@iftex +@shorttitlepage GNU Make +@end iftex +@titlepage +@title GNU Make +@subtitle A Program for Directing Recompilation +@subtitle GNU @code{make} Version @value{VERSION} +@subtitle @value{UPDATED-MONTH} +@author Richard M. Stallman, Roland McGrath, Paul D. Smith +@page +@vskip 0pt plus 1filll +@insertcopying +@sp 2 +Published by the Free Software Foundation @* +51 Franklin St. -- Fifth Floor @* +Boston, MA 02110-1301 USA @* +ISBN @value{ISBN} @* +@sp 2 +Cover art by Etienne Suvasa. +@end titlepage + +@summarycontents +@contents + +@ifnottex +@node Top, Overview, (dir), (dir) +@top GNU @code{make} + +@insertcopying +@end ifnottex + +@menu +* Overview:: Overview of @code{make}. +* Introduction:: An introduction to @code{make}. +* Makefiles:: Makefiles tell @code{make} what to do. +* Rules:: Rules describe when a file must be remade. +* Recipes:: Recipes say how to remake a file. +* Using Variables:: You can use variables to avoid repetition. +* Conditionals:: Use or ignore parts of the makefile based + on the values of variables. +* Functions:: Many powerful ways to manipulate text. +* Invoking make: Running. How to invoke @code{make} on the command line. +* Implicit Rules:: Use implicit rules to treat many files alike, + based on their file names. +* Archives:: How @code{make} can update library archives. +* Features:: Features GNU @code{make} has over other @code{make}s. +* Missing:: What GNU @code{make} lacks from other @code{make}s. +* Makefile Conventions:: Conventions for writing makefiles for + GNU programs. +* Quick Reference:: A quick reference for experienced users. +* Error Messages:: A list of common errors generated by @code{make}. +* Complex Makefile:: A real example of a straightforward, + but nontrivial, makefile. + +* GNU Free Documentation License:: License for copying this manual +* Concept Index:: Index of Concepts +* Name Index:: Index of Functions, Variables, & Directives + +@detailmenu + --- The Detailed Node Listing --- + +Overview of @code{make} + +* Preparing:: Preparing and running make +* Reading:: On reading this text +* Bugs:: Problems and bugs + +An Introduction to Makefiles + +* Rule Introduction:: What a rule looks like. +* Simple Makefile:: A simple makefile +* How Make Works:: How @code{make} processes this makefile +* Variables Simplify:: Variables make makefiles simpler +* make Deduces:: Letting @code{make} deduce the recipe +* Combine By Prerequisite:: Another style of makefile +* Cleanup:: Rules for cleaning the directory + +Writing Makefiles + +* Makefile Contents:: What makefiles contain. +* Makefile Names:: How to name your makefile. +* Include:: How one makefile can use another makefile. +* MAKEFILES Variable:: The environment can specify extra makefiles. +* Remaking Makefiles:: How makefiles get remade. +* Overriding Makefiles:: How to override part of one makefile + with another makefile. +* Reading Makefiles:: How makefiles are parsed. +* Secondary Expansion:: How and when secondary expansion is performed. + +Writing Rules + +* Rule Example:: An example explained. +* Rule Syntax:: General syntax explained. +* Prerequisite Types:: There are two types of prerequisites. +* Wildcards:: Using wildcard characters such as `*'. +* Directory Search:: Searching other directories for source files. +* Phony Targets:: Using a target that is not a real file's name. +* Force Targets:: You can use a target without a recipe + or prerequisites to mark other targets + as phony. +* Empty Targets:: When only the date matters and the + files are empty. +* Special Targets:: Targets with special built-in meanings. +* Multiple Targets:: When to make use of several targets in a rule. +* Multiple Rules:: How to use several rules with the same target. +* Static Pattern:: Static pattern rules apply to multiple targets + and can vary the prerequisites according to + the target name. +* Double-Colon:: How to use a special kind of rule to allow + several independent rules for one target. +* Automatic Prerequisites:: How to automatically generate rules giving + prerequisites from source files themselves. + +Using Wildcard Characters in File Names + +* Wildcard Examples:: Several examples +* Wildcard Pitfall:: Problems to avoid. +* Wildcard Function:: How to cause wildcard expansion where + it does not normally take place. + +Searching Directories for Prerequisites + +* General Search:: Specifying a search path that applies + to every prerequisite. +* Selective Search:: Specifying a search path + for a specified class of names. +* Search Algorithm:: When and how search paths are applied. +* Recipes/Search:: How to write recipes that work together + with search paths. +* Implicit/Search:: How search paths affect implicit rules. +* Libraries/Search:: Directory search for link libraries. + +Static Pattern Rules + +* Static Usage:: The syntax of static pattern rules. +* Static versus Implicit:: When are they better than implicit rules? + +Writing Recipes in Rules + +* Recipe Syntax:: Recipe syntax features and pitfalls. +* Echoing:: How to control when recipes are echoed. +* Execution:: How recipes are executed. +* Parallel:: How recipes can be executed in parallel. +* Errors:: What happens after a recipe execution error. +* Interrupts:: What happens when a recipe is interrupted. +* Recursion:: Invoking @code{make} from makefiles. +* Canned Recipes:: Defining canned recipes. +* Empty Recipes:: Defining useful, do-nothing recipes. + +Recipe Syntax + +* Splitting Lines:: Breaking long recipe lines for readability. +* Variables in Recipes:: Using @code{make} variables in recipes. + +Recipe Execution + +* Choosing the Shell:: How @code{make} chooses the shell used + to run recipes. + +Recursive Use of @code{make} + +* MAKE Variable:: The special effects of using @samp{$(MAKE)}. +* Variables/Recursion:: How to communicate variables to a sub-@code{make}. +* Options/Recursion:: How to communicate options to a sub-@code{make}. +* -w Option:: How the @samp{-w} or @samp{--print-directory} option + helps debug use of recursive @code{make} commands. + +How to Use Variables + +* Reference:: How to use the value of a variable. +* Flavors:: Variables come in two flavors. +* Advanced:: Advanced features for referencing a variable. +* Values:: All the ways variables get their values. +* Setting:: How to set a variable in the makefile. +* Appending:: How to append more text to the old value + of a variable. +* Override Directive:: How to set a variable in the makefile even if + the user has set it with a command argument. +* Multi-Line:: An alternate way to set a variable + to a multi-line string. +* Environment:: Variable values can come from the environment. +* Target-specific:: Variable values can be defined on a per-target + basis. +* Pattern-specific:: Target-specific variable values can be applied + to a group of targets that match a pattern. +* Suppressing Inheritance:: Suppress inheritance of variables. +* Special Variables:: Variables with special meaning or behavior. + +Advanced Features for Reference to Variables + +* Substitution Refs:: Referencing a variable with + substitutions on the value. +* Computed Names:: Computing the name of the variable to refer to. + +Conditional Parts of Makefiles + +* Conditional Example:: Example of a conditional +* Conditional Syntax:: The syntax of conditionals. +* Testing Flags:: Conditionals that test flags. + +Functions for Transforming Text + +* Syntax of Functions:: How to write a function call. +* Text Functions:: General-purpose text manipulation functions. +* File Name Functions:: Functions for manipulating file names. +* Conditional Functions:: Functions that implement conditions. +* Foreach Function:: Repeat some text with controlled variation. +* Call Function:: Expand a user-defined function. +* Value Function:: Return the un-expanded value of a variable. +* Eval Function:: Evaluate the arguments as makefile syntax. +* Origin Function:: Find where a variable got its value. +* Flavor Function:: Find out the flavor of a variable. +* Shell Function:: Substitute the output of a shell command. +* Make Control Functions:: Functions that control how make runs. + +How to Run @code{make} + +* Makefile Arguments:: How to specify which makefile to use. +* Goals:: How to use goal arguments to specify which + parts of the makefile to use. +* Instead of Execution:: How to use mode flags to specify what + kind of thing to do with the recipes + in the makefile other than simply + execute them. +* Avoiding Compilation:: How to avoid recompiling certain files. +* Overriding:: How to override a variable to specify + an alternate compiler and other things. +* Testing:: How to proceed past some errors, to + test compilation. +* Options Summary:: Summary of Options + +Using Implicit Rules + +* Using Implicit:: How to use an existing implicit rule + to get the recipe for updating a file. +* Catalogue of Rules:: A list of built-in implicit rules. +* Implicit Variables:: How to change what predefined rules do. +* Chained Rules:: How to use a chain of implicit rules. +* Pattern Rules:: How to define new implicit rules. +* Last Resort:: How to define a recipe for rules which + cannot find any. +* Suffix Rules:: The old-fashioned style of implicit rule. +* Implicit Rule Search:: The precise algorithm for applying + implicit rules. + +Defining and Redefining Pattern Rules + +* Pattern Intro:: An introduction to pattern rules. +* Pattern Examples:: Examples of pattern rules. +* Automatic Variables:: How to use automatic variables in the + recipe of implicit rules. +* Pattern Match:: How patterns match. +* Match-Anything Rules:: Precautions you should take prior to + defining rules that can match any + target file whatever. +* Canceling Rules:: How to override or cancel built-in rules. + +Using @code{make} to Update Archive Files + +* Archive Members:: Archive members as targets. +* Archive Update:: The implicit rule for archive member targets. +* Archive Pitfalls:: Dangers to watch out for when using archives. +* Archive Suffix Rules:: You can write a special kind of suffix rule + for updating archives. + +Implicit Rule for Archive Member Targets + +* Archive Symbols:: How to update archive symbol directories. + +@end detailmenu +@end menu + +@node Overview, Introduction, Top, Top +@comment node-name, next, previous, up +@chapter Overview of @code{make} + +The @code{make} utility automatically determines which pieces of a large +program need to be recompiled, and issues commands to recompile them. +This manual describes GNU @code{make}, which was implemented by Richard +Stallman and Roland McGrath. Development since Version 3.76 has been +handled by Paul D. Smith. + +GNU @code{make} conforms to section 6.2 of @cite{IEEE Standard +1003.2-1992} (POSIX.2). +@cindex POSIX +@cindex IEEE Standard 1003.2 +@cindex standards conformance + +Our examples show C programs, since they are most common, but you can use +@code{make} with any programming language whose compiler can be run with a +shell command. Indeed, @code{make} is not limited to programs. You can +use it to describe any task where some files must be updated automatically +from others whenever the others change. + +@menu +* Preparing:: Preparing and Running Make +* Reading:: On Reading this Text +* Bugs:: Problems and Bugs +@end menu + +@node Preparing, Reading, Overview, Overview +@ifnottex +@heading Preparing and Running Make +@end ifnottex + +To prepare to use @code{make}, you must write a file called +the @dfn{makefile} that describes the relationships among files +in your program and provides commands for updating each file. +In a program, typically, the executable file is updated from object +files, which are in turn made by compiling source files.@refill + +Once a suitable makefile exists, each time you change some source files, +this simple shell command: + +@example +make +@end example + +@noindent +suffices to perform all necessary recompilations. The @code{make} program +uses the makefile data base and the last-modification times of the files to +decide which of the files need to be updated. For each of those files, it +issues the recipes recorded in the data base. + +You can provide command line arguments to @code{make} to control which +files should be recompiled, or how. @xref{Running, ,How to Run +@code{make}}. + +@node Reading, Bugs, Preparing, Overview +@section How to Read This Manual + +If you are new to @code{make}, or are looking for a general +introduction, read the first few sections of each chapter, skipping the +later sections. In each chapter, the first few sections contain +introductory or general information and the later sections contain +specialized or technical information. +@ifnottex +The exception is the second chapter, @ref{Introduction, ,An +Introduction to Makefiles}, all of which is introductory. +@end ifnottex +@iftex +The exception is @ref{Introduction, ,An Introduction to Makefiles}, +all of which is introductory. +@end iftex + +If you are familiar with other @code{make} programs, see @ref{Features, +,Features of GNU @code{make}}, which lists the enhancements GNU +@code{make} has, and @ref{Missing, ,Incompatibilities and Missing +Features}, which explains the few things GNU @code{make} lacks that +others have. + +For a quick summary, see @ref{Options Summary}, @ref{Quick Reference}, +and @ref{Special Targets}. + +@node Bugs, , Reading, Overview +@section Problems and Bugs +@cindex reporting bugs +@cindex bugs, reporting +@cindex problems and bugs, reporting + +If you have problems with GNU @code{make} or think you've found a bug, +please report it to the developers; we cannot promise to do anything but +we might well want to fix it. + +Before reporting a bug, make sure you've actually found a real bug. +Carefully reread the documentation and see if it really says you can do +what you're trying to do. If it's not clear whether you should be able +to do something or not, report that too; it's a bug in the +documentation! + +Before reporting a bug or trying to fix it yourself, try to isolate it +to the smallest possible makefile that reproduces the problem. Then +send us the makefile and the exact results @code{make} gave you, +including any error or warning messages. Please don't paraphrase +these messages: it's best to cut and paste them into your report. +When generating this small makefile, be sure to not use any non-free +or unusual tools in your recipes: you can almost always emulate what +such a tool would do with simple shell commands. Finally, be sure to +explain what you expected to occur; this will help us decide whether +the problem was really in the documentation. + +Once you have a precise problem you can report it in one of two ways. +Either send electronic mail to: + +@example + bug-make@@gnu.org +@end example + +@noindent +or use our Web-based project management tool, at: + +@example + http://savannah.gnu.org/projects/make/ +@end example + +@noindent +In addition to the information above, please be careful to include the +version number of @code{make} you are using. You can get this +information with the command @samp{make --version}. Be sure also to +include the type of machine and operating system you are using. One +way to obtain this information is by looking at the final lines of +output from the command @samp{make --help}. + +@node Introduction, Makefiles, Overview, Top +@comment node-name, next, previous, up +@chapter An Introduction to Makefiles + +You need a file called a @dfn{makefile} to tell @code{make} what to do. +Most often, the makefile tells @code{make} how to compile and link a +program. +@cindex makefile + +In this chapter, we will discuss a simple makefile that describes how to +compile and link a text editor which consists of eight C source files +and three header files. The makefile can also tell @code{make} how to +run miscellaneous commands when explicitly asked (for example, to remove +certain files as a clean-up operation). To see a more complex example +of a makefile, see @ref{Complex Makefile}. + +When @code{make} recompiles the editor, each changed C source file +must be recompiled. If a header file has changed, each C source file +that includes the header file must be recompiled to be safe. Each +compilation produces an object file corresponding to the source file. +Finally, if any source file has been recompiled, all the object files, +whether newly made or saved from previous compilations, must be linked +together to produce the new executable editor. +@cindex recompilation +@cindex editor + +@menu +* Rule Introduction:: What a rule looks like. +* Simple Makefile:: A Simple Makefile +* How Make Works:: How @code{make} Processes This Makefile +* Variables Simplify:: Variables Make Makefiles Simpler +* make Deduces:: Letting @code{make} Deduce the Recipes +* Combine By Prerequisite:: Another Style of Makefile +* Cleanup:: Rules for Cleaning the Directory +@end menu + +@node Rule Introduction, Simple Makefile, Introduction, Introduction +@comment node-name, next, previous, up +@section What a Rule Looks Like +@cindex rule, introduction to +@cindex makefile rule parts +@cindex parts of makefile rule + +A simple makefile consists of ``rules'' with the following shape: + +@cindex targets, introduction to +@cindex prerequisites, introduction to +@cindex recipes, introduction to +@example +@group +@var{target} @dots{} : @var{prerequisites} @dots{} + @var{recipe} + @dots{} + @dots{} +@end group +@end example + +A @dfn{target} is usually the name of a file that is generated by a +program; examples of targets are executable or object files. A target +can also be the name of an action to carry out, such as @samp{clean} +(@pxref{Phony Targets}). + +A @dfn{prerequisite} is a file that is used as input to create the +target. A target often depends on several files. + +@cindex tabs in rules +A @dfn{recipe} is an action that @code{make} carries out. A recipe +may have more than one command, either on the same line or each on its +own line. @strong{Please note:} you need to put a tab character at +the beginning of every recipe line! This is an obscurity that catches +the unwary. If you prefer to prefix your recipes with a character +other than tab, you can set the @code{.RECIPEPREFIX} variable to an +alternate character (@pxref{Special Variables}). + +Usually a recipe is in a rule with prerequisites and serves to create a +target file if any of the prerequisites change. However, the rule that +specifies a recipe for the target need not have prerequisites. For +example, the rule containing the delete command associated with the +target @samp{clean} does not have prerequisites. + +A @dfn{rule}, then, explains how and when to remake certain files +which are the targets of the particular rule. @code{make} carries out +the recipe on the prerequisites to create or update the target. A +rule can also explain how and when to carry out an action. +@xref{Rules, , Writing Rules}. + +A makefile may contain other text besides rules, but a simple makefile +need only contain rules. Rules may look somewhat more complicated +than shown in this template, but all fit the pattern more or less. + +@node Simple Makefile, How Make Works, Rule Introduction, Introduction +@section A Simple Makefile +@cindex simple makefile +@cindex makefile, simple + +Here is a straightforward makefile that describes the way an +executable file called @code{edit} depends on eight object files +which, in turn, depend on eight C source and three header files. + +In this example, all the C files include @file{defs.h}, but only those +defining editing commands include @file{command.h}, and only low +level files that change the editor buffer include @file{buffer.h}. + +@example +@group +edit : main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + cc -o edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +main.o : main.c defs.h + cc -c main.c +kbd.o : kbd.c defs.h command.h + cc -c kbd.c +command.o : command.c defs.h command.h + cc -c command.c +display.o : display.c defs.h buffer.h + cc -c display.c +insert.o : insert.c defs.h buffer.h + cc -c insert.c +search.o : search.c defs.h buffer.h + cc -c search.c +files.o : files.c defs.h buffer.h command.h + cc -c files.c +utils.o : utils.c defs.h + cc -c utils.c +clean : + rm edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o +@end group +@end example + +@noindent +We split each long line into two lines using backslash-newline; this is +like using one long line, but is easier to read. +@cindex continuation lines +@cindex @code{\} (backslash), for continuation lines +@cindex backslash (@code{\}), for continuation lines +@cindex quoting newline, in makefile +@cindex newline, quoting, in makefile + +To use this makefile to create the executable file called @file{edit}, +type: + +@example +make +@end example + +To use this makefile to delete the executable file and all the object +files from the directory, type: + +@example +make clean +@end example + +In the example makefile, the targets include the executable file +@samp{edit}, and the object files @samp{main.o} and @samp{kbd.o}. The +prerequisites are files such as @samp{main.c} and @samp{defs.h}. +In fact, each @samp{.o} file is both a target and a prerequisite. +Recipes include @w{@samp{cc -c main.c}} and @w{@samp{cc -c kbd.c}}. + +When a target is a file, it needs to be recompiled or relinked if any +of its prerequisites change. In addition, any prerequisites that are +themselves automatically generated should be updated first. In this +example, @file{edit} depends on each of the eight object files; the +object file @file{main.o} depends on the source file @file{main.c} and +on the header file @file{defs.h}. + +A recipe may follow each line that contains a target and +prerequisites. These recipes say how to update the target file. A +tab character (or whatever character is specified by the +@code{.RECIPEPREFIX} variable; @pxref{Special Variables}) must come at +the beginning of every line in the recipe to distinguish recipes from +other lines in the makefile. (Bear in mind that @code{make} does not +know anything about how the recipes work. It is up to you to supply +recipes that will update the target file properly. All @code{make} +does is execute the recipe you have specified when the target file +needs to be updated.)@refill +@cindex recipe + +The target @samp{clean} is not a file, but merely the name of an +action. Since you normally do not want to carry out the actions in +this rule, @samp{clean} is not a prerequisite of any other rule. +Consequently, @code{make} never does anything with it unless you tell +it specifically. Note that this rule not only is not a prerequisite, +it also does not have any prerequisites, so the only purpose of the +rule is to run the specified recipe. Targets that do not refer to +files but are just actions are called @dfn{phony targets}. +@xref{Phony Targets}, for information about this kind of target. +@xref{Errors, , Errors in Recipes}, to see how to cause @code{make} +to ignore errors from @code{rm} or any other command. +@cindex @code{clean} target +@cindex @code{rm} (shell command) + +@node How Make Works, Variables Simplify, Simple Makefile, Introduction +@comment node-name, next, previous, up +@section How @code{make} Processes a Makefile +@cindex processing a makefile +@cindex makefile, how @code{make} processes + +By default, @code{make} starts with the first target (not targets whose +names start with @samp{.}). This is called the @dfn{default goal}. +(@dfn{Goals} are the targets that @code{make} strives ultimately to +update. You can override this behavior using the command line +(@pxref{Goals, , Arguments to Specify the Goals}) or with the +@code{.DEFAULT_GOAL} special variable (@pxref{Special Variables, , +Other Special Variables}). +@cindex default goal +@cindex goal, default +@cindex goal + +In the simple example of the previous section, the default goal is to +update the executable program @file{edit}; therefore, we put that rule +first. + +Thus, when you give the command: + +@example +make +@end example + +@noindent +@code{make} reads the makefile in the current directory and begins by +processing the first rule. In the example, this rule is for relinking +@file{edit}; but before @code{make} can fully process this rule, it +must process the rules for the files that @file{edit} depends on, +which in this case are the object files. Each of these files is +processed according to its own rule. These rules say to update each +@samp{.o} file by compiling its source file. The recompilation must +be done if the source file, or any of the header files named as +prerequisites, is more recent than the object file, or if the object +file does not exist. + +The other rules are processed because their targets appear as +prerequisites of the goal. If some other rule is not depended on by the +goal (or anything it depends on, etc.), that rule is not processed, +unless you tell @code{make} to do so (with a command such as +@w{@code{make clean}}). + +Before recompiling an object file, @code{make} considers updating its +prerequisites, the source file and header files. This makefile does not +specify anything to be done for them---the @samp{.c} and @samp{.h} files +are not the targets of any rules---so @code{make} does nothing for these +files. But @code{make} would update automatically generated C programs, +such as those made by Bison or Yacc, by their own rules at this time. + +After recompiling whichever object files need it, @code{make} decides +whether to relink @file{edit}. This must be done if the file +@file{edit} does not exist, or if any of the object files are newer than +it. If an object file was just recompiled, it is now newer than +@file{edit}, so @file{edit} is relinked. +@cindex relinking + +Thus, if we change the file @file{insert.c} and run @code{make}, +@code{make} will compile that file to update @file{insert.o}, and then +link @file{edit}. If we change the file @file{command.h} and run +@code{make}, @code{make} will recompile the object files @file{kbd.o}, +@file{command.o} and @file{files.o} and then link the file @file{edit}. + +@node Variables Simplify, make Deduces, How Make Works, Introduction +@section Variables Make Makefiles Simpler +@cindex variables +@cindex simplifying with variables + +In our example, we had to list all the object files twice in the rule for +@file{edit} (repeated here): + +@example +@group +edit : main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + cc -o edit main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o +@end group +@end example + +@cindex @code{objects} +Such duplication is error-prone; if a new object file is added to the +system, we might add it to one list and forget the other. We can eliminate +the risk and simplify the makefile by using a variable. @dfn{Variables} +allow a text string to be defined once and substituted in multiple places +later (@pxref{Using Variables, ,How to Use Variables}). + +@cindex @code{OBJECTS} +@cindex @code{objs} +@cindex @code{OBJS} +@cindex @code{obj} +@cindex @code{OBJ} +It is standard practice for every makefile to have a variable named +@code{objects}, @code{OBJECTS}, @code{objs}, @code{OBJS}, @code{obj}, +or @code{OBJ} which is a list of all object file names. We would +define such a variable @code{objects} with a line like this in the +makefile:@refill + +@example +@group +objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o +@end group +@end example + +@noindent +Then, each place we want to put a list of the object file names, we can +substitute the variable's value by writing @samp{$(objects)} +(@pxref{Using Variables, ,How to Use Variables}). + +Here is how the complete simple makefile looks when you use a variable +for the object files: + +@example +@group +objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +edit : $(objects) + cc -o edit $(objects) +main.o : main.c defs.h + cc -c main.c +kbd.o : kbd.c defs.h command.h + cc -c kbd.c +command.o : command.c defs.h command.h + cc -c command.c +display.o : display.c defs.h buffer.h + cc -c display.c +insert.o : insert.c defs.h buffer.h + cc -c insert.c +search.o : search.c defs.h buffer.h + cc -c search.c +files.o : files.c defs.h buffer.h command.h + cc -c files.c +utils.o : utils.c defs.h + cc -c utils.c +clean : + rm edit $(objects) +@end group +@end example + +@node make Deduces, Combine By Prerequisite, Variables Simplify, Introduction +@section Letting @code{make} Deduce the Recipes +@cindex deducing recipes (implicit rules) +@cindex implicit rule, introduction to +@cindex rule, implicit, introduction to + +It is not necessary to spell out the recipes for compiling the individual +C source files, because @code{make} can figure them out: it has an +@dfn{implicit rule} for updating a @samp{.o} file from a correspondingly +named @samp{.c} file using a @samp{cc -c} command. For example, it will +use the recipe @samp{cc -c main.c -o main.o} to compile @file{main.c} into +@file{main.o}. We can therefore omit the recipes from the rules for the +object files. @xref{Implicit Rules, ,Using Implicit Rules}.@refill + +When a @samp{.c} file is used automatically in this way, it is also +automatically added to the list of prerequisites. We can therefore omit +the @samp{.c} files from the prerequisites, provided we omit the recipe. + +Here is the entire example, with both of these changes, and a variable +@code{objects} as suggested above: + +@example +@group +objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +edit : $(objects) + cc -o edit $(objects) + +main.o : defs.h +kbd.o : defs.h command.h +command.o : defs.h command.h +display.o : defs.h buffer.h +insert.o : defs.h buffer.h +search.o : defs.h buffer.h +files.o : defs.h buffer.h command.h +utils.o : defs.h + +.PHONY : clean +clean : + rm edit $(objects) +@end group +@end example + +@noindent +This is how we would write the makefile in actual practice. (The +complications associated with @samp{clean} are described elsewhere. +See @ref{Phony Targets}, and @ref{Errors, ,Errors in Recipes}.) + +Because implicit rules are so convenient, they are important. You +will see them used frequently.@refill + +@node Combine By Prerequisite, Cleanup, make Deduces, Introduction +@section Another Style of Makefile +@cindex combining rules by prerequisite + +When the objects of a makefile are created only by implicit rules, an +alternative style of makefile is possible. In this style of makefile, +you group entries by their prerequisites instead of by their targets. +Here is what one looks like: + +@example +@group +objects = main.o kbd.o command.o display.o \ + insert.o search.o files.o utils.o + +edit : $(objects) + cc -o edit $(objects) + +$(objects) : defs.h +kbd.o command.o files.o : command.h +display.o insert.o search.o files.o : buffer.h +@end group +@end example + +@noindent +Here @file{defs.h} is given as a prerequisite of all the object files; +@file{command.h} and @file{buffer.h} are prerequisites of the specific +object files listed for them. + +Whether this is better is a matter of taste: it is more compact, but some +people dislike it because they find it clearer to put all the information +about each target in one place. + +@node Cleanup, , Combine By Prerequisite, Introduction +@section Rules for Cleaning the Directory +@cindex cleaning up +@cindex removing, to clean up + +Compiling a program is not the only thing you might want to write rules +for. Makefiles commonly tell how to do a few other things besides +compiling a program: for example, how to delete all the object files +and executables so that the directory is @samp{clean}. + +@cindex @code{clean} target +Here is how we +could write a @code{make} rule for cleaning our example editor: + +@example +@group +clean: + rm edit $(objects) +@end group +@end example + +In practice, we might want to write the rule in a somewhat more +complicated manner to handle unanticipated situations. We would do this: + +@example +@group +.PHONY : clean +clean : + -rm edit $(objects) +@end group +@end example + +@noindent +This prevents @code{make} from getting confused by an actual file +called @file{clean} and causes it to continue in spite of errors from +@code{rm}. (See @ref{Phony Targets}, and @ref{Errors, ,Errors in +Recipes}.) + +@noindent +A rule such as this should not be placed at the beginning of the +makefile, because we do not want it to run by default! Thus, in the +example makefile, we want the rule for @code{edit}, which recompiles +the editor, to remain the default goal. + +Since @code{clean} is not a prerequisite of @code{edit}, this rule will not +run at all if we give the command @samp{make} with no arguments. In +order to make the rule run, we have to type @samp{make clean}. +@xref{Running, ,How to Run @code{make}}. + +@node Makefiles, Rules, Introduction, Top +@chapter Writing Makefiles + +@cindex makefile, how to write +The information that tells @code{make} how to recompile a system comes from +reading a data base called the @dfn{makefile}. + +@menu +* Makefile Contents:: What makefiles contain. +* Makefile Names:: How to name your makefile. +* Include:: How one makefile can use another makefile. +* MAKEFILES Variable:: The environment can specify extra makefiles. +* Remaking Makefiles:: How makefiles get remade. +* Overriding Makefiles:: How to override part of one makefile + with another makefile. +* Reading Makefiles:: How makefiles are parsed. +* Secondary Expansion:: How and when secondary expansion is performed. +@end menu + +@node Makefile Contents, Makefile Names, Makefiles, Makefiles +@section What Makefiles Contain + +Makefiles contain five kinds of things: @dfn{explicit rules}, +@dfn{implicit rules}, @dfn{variable definitions}, @dfn{directives}, +and @dfn{comments}. Rules, variables, and directives are described at +length in later chapters.@refill + +@itemize @bullet +@cindex rule, explicit, definition of +@cindex explicit rule, definition of +@item +An @dfn{explicit rule} says when and how to remake one or more files, +called the rule's @dfn{targets}. It lists the other files that the +targets depend on, called the @dfn{prerequisites} of the target, and +may also give a recipe to use to create or update the targets. +@xref{Rules, ,Writing Rules}. + +@cindex rule, implicit, definition of +@cindex implicit rule, definition of +@item +An @dfn{implicit rule} says when and how to remake a class of files +based on their names. It describes how a target may depend on a file +with a name similar to the target and gives a recipe to create or +update such a target. @xref{Implicit Rules, ,Using Implicit Rules}. + +@cindex variable definition +@item +A @dfn{variable definition} is a line that specifies a text string +value for a variable that can be substituted into the text later. The +simple makefile example shows a variable definition for @code{objects} +as a list of all object files (@pxref{Variables Simplify, , Variables +Make Makefiles Simpler}). + +@cindex directive +@item +A @dfn{directive} is an instruction for @code{make} to do something +special while reading the makefile. These include: + +@itemize @bullet +@item +Reading another makefile (@pxref{Include, ,Including Other Makefiles}). + +@item +Deciding (based on the values of variables) whether to use or +ignore a part of the makefile (@pxref{Conditionals, ,Conditional Parts of Makefiles}). + +@item +Defining a variable from a verbatim string containing multiple lines +(@pxref{Multi-Line, ,Defining Multi-Line Variables}). +@end itemize + +@cindex comments, in makefile +@cindex @code{#} (comments), in makefile +@item +@samp{#} in a line of a makefile starts a @dfn{comment}. It and the +rest of the line are ignored, except that a trailing backslash not +escaped by another backslash will continue the comment across multiple +lines. A line containing just a comment (with perhaps spaces before +it) is effectively blank, and is ignored. If you want a literal +@code{#}, escape it with a backslash (e.g., @code{\#}). Comments may +appear on any line in the makefile, although they are treated +specially in certain situations. + +You cannot use comments within variable references or function calls: +any instance of @code{#} will be treated literally (rather than as the +start of a comment) inside a variable reference or function call. + +Comments within a recipe are passed to the shell, just as with any +other recipe text. The shell decides how to interpret it: whether or +not this is a comment is up to the shell. + +Within a @code{define} directive, comments are not ignored during the +definition of the variable, but rather kept intact in the value of the +variable. When the variable is expanded they will either be treated +as @code{make} comments or as recipe text, depending on the context in +which the variable is evaluated. +@end itemize + +@node Makefile Names, Include, Makefile Contents, Makefiles +@section What Name to Give Your Makefile +@cindex makefile name +@cindex name of makefile +@cindex default makefile name +@cindex file name of makefile + +@c following paragraph rewritten to avoid overfull hbox +By default, when @code{make} looks for the makefile, it tries the +following names, in order: @file{GNUmakefile}, @file{makefile} +and @file{Makefile}.@refill +@findex Makefile +@findex GNUmakefile +@findex makefile + +@cindex @code{README} +Normally you should call your makefile either @file{makefile} or +@file{Makefile}. (We recommend @file{Makefile} because it appears +prominently near the beginning of a directory listing, right near other +important files such as @file{README}.) The first name checked, +@file{GNUmakefile}, is not recommended for most makefiles. You should +use this name if you have a makefile that is specific to GNU +@code{make}, and will not be understood by other versions of +@code{make}. Other @code{make} programs look for @file{makefile} and +@file{Makefile}, but not @file{GNUmakefile}. + +If @code{make} finds none of these names, it does not use any makefile. +Then you must specify a goal with a command argument, and @code{make} +will attempt to figure out how to remake it using only its built-in +implicit rules. @xref{Implicit Rules, ,Using Implicit Rules}. + +@cindex @code{-f} +@cindex @code{--file} +@cindex @code{--makefile} +If you want to use a nonstandard name for your makefile, you can specify +the makefile name with the @samp{-f} or @samp{--file} option. The +arguments @w{@samp{-f @var{name}}} or @w{@samp{--file=@var{name}}} tell +@code{make} to read the file @var{name} as the makefile. If you use +more than one @samp{-f} or @samp{--file} option, you can specify several +makefiles. All the makefiles are effectively concatenated in the order +specified. The default makefile names @file{GNUmakefile}, +@file{makefile} and @file{Makefile} are not checked automatically if you +specify @samp{-f} or @samp{--file}.@refill +@cindex specifying makefile name +@cindex makefile name, how to specify +@cindex name of makefile, how to specify +@cindex file name of makefile, how to specify + +@node Include, MAKEFILES Variable, Makefile Names, Makefiles +@section Including Other Makefiles +@cindex including other makefiles +@cindex makefile, including + +@findex include +The @code{include} directive tells @code{make} to suspend reading the +current makefile and read one or more other makefiles before continuing. +The directive is a line in the makefile that looks like this: + +@example +include @var{filenames}@dots{} +@end example + +@noindent +@var{filenames} can contain shell file name patterns. If +@var{filenames} is empty, nothing is included and no error is printed. +@cindex shell file name pattern (in @code{include}) +@cindex shell wildcards (in @code{include}) +@cindex wildcard, in @code{include} + +Extra spaces are allowed and ignored at the beginning of the line, but +the first character must not be a tab (or the value of +@code{.RECIPEPREFIX})---if the line begins with a tab, it will be +considered a recipe line. Whitespace is required between +@code{include} and the file names, and between file names; extra +whitespace is ignored there and at the end of the directive. A +comment starting with @samp{#} is allowed at the end of the line. If +the file names contain any variable or function references, they are +expanded. @xref{Using Variables, ,How to Use Variables}. + +For example, if you have three @file{.mk} files, @file{a.mk}, +@file{b.mk}, and @file{c.mk}, and @code{$(bar)} expands to +@code{bish bash}, then the following expression + +@example +include foo *.mk $(bar) +@end example + +is equivalent to + +@example +include foo a.mk b.mk c.mk bish bash +@end example + +When @code{make} processes an @code{include} directive, it suspends +reading of the containing makefile and reads from each listed file in +turn. When that is finished, @code{make} resumes reading the +makefile in which the directive appears. + +One occasion for using @code{include} directives is when several programs, +handled by individual makefiles in various directories, need to use a +common set of variable definitions +(@pxref{Setting, ,Setting Variables}) or pattern rules +(@pxref{Pattern Rules, ,Defining and Redefining Pattern Rules}). + +Another such occasion is when you want to generate prerequisites from +source files automatically; the prerequisites can be put in a file that +is included by the main makefile. This practice is generally cleaner +than that of somehow appending the prerequisites to the end of the main +makefile as has been traditionally done with other versions of +@code{make}. @xref{Automatic Prerequisites}. +@cindex prerequisites, automatic generation +@cindex automatic generation of prerequisites +@cindex generating prerequisites automatically + +@cindex @code{-I} +@cindex @code{--include-dir} +@cindex included makefiles, default directories +@cindex default directories for included makefiles +@findex /usr/gnu/include +@findex /usr/local/include +@findex /usr/include +If the specified name does not start with a slash, and the file is not +found in the current directory, several other directories are searched. +First, any directories you have specified with the @samp{-I} or +@samp{--include-dir} option are searched +(@pxref{Options Summary, ,Summary of Options}). +Then the following directories (if they exist) +are searched, in this order: +@file{@var{prefix}/include} (normally @file{/usr/local/include} +@footnote{GNU Make compiled for MS-DOS and MS-Windows behaves as if +@var{prefix} has been defined to be the root of the DJGPP tree +hierarchy.}) +@file{/usr/gnu/include}, +@file{/usr/local/include}, @file{/usr/include}. + +If an included makefile cannot be found in any of these directories, a +warning message is generated, but it is not an immediately fatal error; +processing of the makefile containing the @code{include} continues. +Once it has finished reading makefiles, @code{make} will try to remake +any that are out of date or don't exist. +@xref{Remaking Makefiles, ,How Makefiles Are Remade}. +Only after it has tried to find a way to remake a makefile and failed, +will @code{make} diagnose the missing makefile as a fatal error. + +If you want @code{make} to simply ignore a makefile which does not exist +or cannot be remade, with no error message, use the @w{@code{-include}} +directive instead of @code{include}, like this: + +@example +-include @var{filenames}@dots{} +@end example + +This acts like @code{include} in every way except that there is no +error (not even a warning) if any of the @var{filenames} (or any +prerequisites of any of the @var{filenames}) do not exist or cannot be +remade. + +For compatibility with some other @code{make} implementations, +@code{sinclude} is another name for @w{@code{-include}}. + +@node MAKEFILES Variable, Remaking Makefiles, Include, Makefiles +@section The Variable @code{MAKEFILES} +@cindex makefile, and @code{MAKEFILES} variable +@cindex including (@code{MAKEFILES} variable) + +@vindex MAKEFILES +If the environment variable @code{MAKEFILES} is defined, @code{make} +considers its value as a list of names (separated by whitespace) of +additional makefiles to be read before the others. This works much +like the @code{include} directive: various directories are searched +for those files (@pxref{Include, ,Including Other Makefiles}). In +addition, the default goal is never taken from one of these makefiles +(or any makefile included by them) and it is not an error if the files +listed in @code{MAKEFILES} are not found.@refill + +@cindex recursion, and @code{MAKEFILES} variable +The main use of @code{MAKEFILES} is in communication between recursive +invocations of @code{make} (@pxref{Recursion, ,Recursive Use of +@code{make}}). It usually is not desirable to set the environment +variable before a top-level invocation of @code{make}, because it is +usually better not to mess with a makefile from outside. However, if +you are running @code{make} without a specific makefile, a makefile in +@code{MAKEFILES} can do useful things to help the built-in implicit +rules work better, such as defining search paths (@pxref{Directory Search}). + +Some users are tempted to set @code{MAKEFILES} in the environment +automatically on login, and program makefiles to expect this to be done. +This is a very bad idea, because such makefiles will fail to work if run by +anyone else. It is much better to write explicit @code{include} directives +in the makefiles. @xref{Include, , Including Other Makefiles}. + +@node Remaking Makefiles, Overriding Makefiles, MAKEFILES Variable, Makefiles +@section How Makefiles Are Remade + +@cindex updating makefiles +@cindex remaking makefiles +@cindex makefile, remaking of +Sometimes makefiles can be remade from other files, such as RCS or SCCS +files. If a makefile can be remade from other files, you probably want +@code{make} to get an up-to-date version of the makefile to read in. + +To this end, after reading in all makefiles, @code{make} will consider +each as a goal target and attempt to update it. If a makefile has a +rule which says how to update it (found either in that very makefile or +in another one) or if an implicit rule applies to it (@pxref{Implicit +Rules, ,Using Implicit Rules}), it will be updated if necessary. After +all makefiles have been checked, if any have actually been changed, +@code{make} starts with a clean slate and reads all the makefiles over +again. (It will also attempt to update each of them over again, but +normally this will not change them again, since they are already up to +date.)@refill + +If you know that one or more of your makefiles cannot be remade and +you want to keep @code{make} from performing an implicit rule search +on them, perhaps for efficiency reasons, you can use any normal method +of preventing implicit rule lookup to do so. For example, you can +write an explicit rule with the makefile as the target, and an empty +recipe (@pxref{Empty Recipes, ,Using Empty Recipes}). + +If the makefiles specify a double-colon rule to remake a file with +a recipe but no prerequisites, that file will always be remade +(@pxref{Double-Colon}). In the case of makefiles, a makefile that has a +double-colon rule with a recipe but no prerequisites will be remade every +time @code{make} is run, and then again after @code{make} starts over +and reads the makefiles in again. This would cause an infinite loop: +@code{make} would constantly remake the makefile, and never do anything +else. So, to avoid this, @code{make} will @strong{not} attempt to +remake makefiles which are specified as targets of a double-colon rule +with a recipe but no prerequisites.@refill + +If you do not specify any makefiles to be read with @samp{-f} or +@samp{--file} options, @code{make} will try the default makefile names; +@pxref{Makefile Names, ,What Name to Give Your Makefile}. Unlike +makefiles explicitly requested with @samp{-f} or @samp{--file} options, +@code{make} is not certain that these makefiles should exist. However, +if a default makefile does not exist but can be created by running +@code{make} rules, you probably want the rules to be run so that the +makefile can be used. + +Therefore, if none of the default makefiles exists, @code{make} will try +to make each of them in the same order in which they are searched for +(@pxref{Makefile Names, ,What Name to Give Your Makefile}) +until it succeeds in making one, or it runs out of names to try. Note +that it is not an error if @code{make} cannot find or make any makefile; +a makefile is not always necessary.@refill + +When you use the @samp{-t} or @samp{--touch} option +(@pxref{Instead of Execution, ,Instead of Executing Recipes}), +you would not want to use an out-of-date makefile to decide which +targets to touch. So the @samp{-t} option has no effect on updating +makefiles; they are really updated even if @samp{-t} is specified. +Likewise, @samp{-q} (or @samp{--question}) and @samp{-n} (or +@samp{--just-print}) do not prevent updating of makefiles, because an +out-of-date makefile would result in the wrong output for other targets. +Thus, @samp{make -f mfile -n foo} will update @file{mfile}, read it in, +and then print the recipe to update @file{foo} and its prerequisites +without running it. The recipe printed for @file{foo} will be the one +specified in the updated contents of @file{mfile}. + +However, on occasion you might actually wish to prevent updating of even +the makefiles. You can do this by specifying the makefiles as goals in +the command line as well as specifying them as makefiles. When the +makefile name is specified explicitly as a goal, the options @samp{-t} +and so on do apply to them. + +Thus, @samp{make -f mfile -n mfile foo} would read the makefile +@file{mfile}, print the recipe needed to update it without actually +running it, and then print the recipe needed to update @file{foo} +without running that. The recipe for @file{foo} will be the one +specified by the existing contents of @file{mfile}. + +@node Overriding Makefiles, Reading Makefiles, Remaking Makefiles, Makefiles +@section Overriding Part of Another Makefile + +@cindex overriding makefiles +@cindex makefile, overriding +Sometimes it is useful to have a makefile that is mostly just like +another makefile. You can often use the @samp{include} directive to +include one in the other, and add more targets or variable definitions. +However, it is illegal for two makefiles to give different recipes for +the same target. But there is another way. + +@cindex match-anything rule, used to override +In the containing makefile (the one that wants to include the other), +you can use a match-anything pattern rule to say that to remake any +target that cannot be made from the information in the containing +makefile, @code{make} should look in another makefile. +@xref{Pattern Rules}, for more information on pattern rules. + +For example, if you have a makefile called @file{Makefile} that says how +to make the target @samp{foo} (and other targets), you can write a +makefile called @file{GNUmakefile} that contains: + +@example +foo: + frobnicate > foo + +%: force + @@$(MAKE) -f Makefile $@@ +force: ; +@end example + +If you say @samp{make foo}, @code{make} will find @file{GNUmakefile}, +read it, and see that to make @file{foo}, it needs to run the recipe +@samp{frobnicate > foo}. If you say @samp{make bar}, @code{make} will +find no way to make @file{bar} in @file{GNUmakefile}, so it will use the +recipe from the pattern rule: @samp{make -f Makefile bar}. If +@file{Makefile} provides a rule for updating @file{bar}, @code{make} +will apply the rule. And likewise for any other target that +@file{GNUmakefile} does not say how to make. + +The way this works is that the pattern rule has a pattern of just +@samp{%}, so it matches any target whatever. The rule specifies a +prerequisite @file{force}, to guarantee that the recipe will be run even +if the target file already exists. We give the @file{force} target an +empty recipe to prevent @code{make} from searching for an implicit rule to +build it---otherwise it would apply the same match-anything rule to +@file{force} itself and create a prerequisite loop! + +@node Reading Makefiles, Secondary Expansion, Overriding Makefiles, Makefiles +@section How @code{make} Reads a Makefile +@cindex reading makefiles +@cindex makefile, parsing + +GNU @code{make} does its work in two distinct phases. During the first +phase it reads all the makefiles, included makefiles, etc. and +internalizes all the variables and their values, implicit and explicit +rules, and constructs a dependency graph of all the targets and their +prerequisites. During the second phase, @code{make} uses these internal +structures to determine what targets will need to be rebuilt and to +invoke the rules necessary to do so. + +It's important to understand this two-phase approach because it has a +direct impact on how variable and function expansion happens; this is +often a source of some confusion when writing makefiles. Here we will +present a summary of the phases in which expansion happens for different +constructs within the makefile. We say that expansion is +@dfn{immediate} if it happens during the first phase: in this case +@code{make} will expand any variables or functions in that section of a +construct as the makefile is parsed. We say that expansion is +@dfn{deferred} if expansion is not performed immediately. Expansion of +a deferred construct is not performed until either the construct appears +later in an immediate context, or until the second phase. + +You may not be familiar with some of these constructs yet. You can +reference this section as you become familiar with them, in later +chapters. + +@subheading Variable Assignment +@cindex +=, expansion +@cindex =, expansion +@cindex ?=, expansion +@cindex +=, expansion +@cindex define, expansion + +Variable definitions are parsed as follows: + +@example +@var{immediate} = @var{deferred} +@var{immediate} ?= @var{deferred} +@var{immediate} := @var{immediate} +@var{immediate} += @var{deferred} or @var{immediate} + +define @var{immediate} + @var{deferred} +endef + +define @var{immediate} = + @var{deferred} +endef + +define @var{immediate} ?= + @var{deferred} +endef + +define @var{immediate} := + @var{immediate} +endef + +define @var{immediate} += + @var{deferred} or @var{immediate} +endef +@end example + +For the append operator, @samp{+=}, the right-hand side is considered +immediate if the variable was previously set as a simple variable +(@samp{:=}), and deferred otherwise. + +@subheading Conditional Directives +@cindex ifdef, expansion +@cindex ifeq, expansion +@cindex ifndef, expansion +@cindex ifneq, expansion + +Conditional directives are parsed immediately. This means, for +example, that automatic variables cannot be used in conditional +directives, as automatic variables are not set until the recipe for +that rule is invoked. If you need to use automatic variables in a +conditional directive you @emph{must} move the condition into the +recipe and use shell conditional syntax instead. + +@subheading Rule Definition +@cindex target, expansion +@cindex prerequisite, expansion +@cindex implicit rule, expansion +@cindex pattern rule, expansion +@cindex explicit rule, expansion + +A rule is always expanded the same way, regardless of the form: + +@example +@var{immediate} : @var{immediate} ; @var{deferred} + @var{deferred} +@end example + +That is, the target and prerequisite sections are expanded immediately, +and the recipe used to construct the target is always deferred. This +general rule is true for explicit rules, pattern rules, suffix rules, +static pattern rules, and simple prerequisite definitions. + +@node Secondary Expansion, , Reading Makefiles, Makefiles +@section Secondary Expansion +@cindex secondary expansion +@cindex expansion, secondary + +@findex .SECONDEXPANSION +In the previous section we learned that GNU @code{make} works in two +distinct phases: a read-in phase and a target-update phase +(@pxref{Reading Makefiles, , How @code{make} Reads a Makefile}). GNU +make also has the ability to enable a @emph{second expansion} of the +prerequisites (only) for some or all targets defined in the makefile. +In order for this second expansion to occur, the special target +@code{.SECONDEXPANSION} must be defined before the first prerequisite +list that makes use of this feature. + +If that special target is defined then in between the two phases +mentioned above, right at the end of the read-in phase, all the +prerequisites of the targets defined after the special target are +expanded a @emph{second time}. In most circumstances this secondary +expansion will have no effect, since all variable and function +references will have been expanded during the initial parsing of the +makefiles. In order to take advantage of the secondary expansion +phase of the parser, then, it's necessary to @emph{escape} the +variable or function reference in the makefile. In this case the +first expansion merely un-escapes the reference but doesn't expand it, +and expansion is left to the secondary expansion phase. For example, +consider this makefile: + +@example +.SECONDEXPANSION: +ONEVAR = onefile +TWOVAR = twofile +myfile: $(ONEVAR) $$(TWOVAR) +@end example + +After the first expansion phase the prerequisites list of the +@file{myfile} target will be @code{onefile} and @code{$(TWOVAR)}; the +first (unescaped) variable reference to @var{ONEVAR} is expanded, +while the second (escaped) variable reference is simply unescaped, +without being recognized as a variable reference. Now during the +secondary expansion the first word is expanded again but since it +contains no variable or function references it remains the static +value @file{onefile}, while the second word is now a normal reference +to the variable @var{TWOVAR}, which is expanded to the value +@file{twofile}. The final result is that there are two prerequisites, +@file{onefile} and @file{twofile}. + +Obviously, this is not a very interesting case since the same result +could more easily have been achieved simply by having both variables +appear, unescaped, in the prerequisites list. One difference becomes +apparent if the variables are reset; consider this example: + +@example +.SECONDEXPANSION: +AVAR = top +onefile: $(AVAR) +twofile: $$(AVAR) +AVAR = bottom +@end example + +Here the prerequisite of @file{onefile} will be expanded immediately, +and resolve to the value @file{top}, while the prerequisite of +@file{twofile} will not be full expanded until the secondary expansion +and yield a value of @file{bottom}. + +This is marginally more exciting, but the true power of this feature +only becomes apparent when you discover that secondary expansions +always take place within the scope of the automatic variables for that +target. This means that you can use variables such as @code{$@@}, +@code{$*}, etc. during the second expansion and they will have their +expected values, just as in the recipe. All you have to do is defer +the expansion by escaping the @code{$}. Also, secondary expansion +occurs for both explicit and implicit (pattern) rules. Knowing this, +the possible uses for this feature increase dramatically. For +example: + +@example +.SECONDEXPANSION: +main_OBJS := main.o try.o test.o +lib_OBJS := lib.o api.o + +main lib: $$($$@@_OBJS) +@end example + +Here, after the initial expansion the prerequisites of both the +@file{main} and @file{lib} targets will be @code{$($@@_OBJS)}. During +the secondary expansion, the @code{$@@} variable is set to the name of +the target and so the expansion for the @file{main} target will yield +@code{$(main_OBJS)}, or @code{main.o try.o test.o}, while the +secondary expansion for the @file{lib} target will yield +@code{$(lib_OBJS)}, or @code{lib.o api.o}. + +You can also mix in functions here, as long as they are properly escaped: + +@example +main_SRCS := main.c try.c test.c +lib_SRCS := lib.c api.c + +.SECONDEXPANSION: +main lib: $$(patsubst %.c,%.o,$$($$@@_SRCS)) +@end example + +This version allows users to specify source files rather than object +files, but gives the same resulting prerequisites list as the previous +example. + +Evaluation of automatic variables during the secondary expansion +phase, especially of the target name variable @code{$$@@}, behaves +similarly to evaluation within recipes. However, there are some +subtle differences and ``corner cases'' which come into play for the +different types of rule definitions that @code{make} understands. The +subtleties of using the different automatic variables are described +below. + +@subheading Secondary Expansion of Explicit Rules +@cindex secondary expansion and explicit rules +@cindex explicit rules, secondary expansion of + +During the secondary expansion of explicit rules, @code{$$@@} and +@code{$$%} evaluate, respectively, to the file name of the target and, +when the target is an archive member, the target member name. The +@code{$$<} variable evaluates to the first prerequisite in the first +rule for this target. @code{$$^} and @code{$$+} evaluate to the list +of all prerequisites of rules @emph{that have already appeared} for +the same target (@code{$$+} with repetitions and @code{$$^} +without). The following example will help illustrate these behaviors: + +@example +.SECONDEXPANSION: + +foo: foo.1 bar.1 $$< $$^ $$+ # line #1 + +foo: foo.2 bar.2 $$< $$^ $$+ # line #2 + +foo: foo.3 bar.3 $$< $$^ $$+ # line #3 +@end example + +In the first prerequisite list, all three variables (@code{$$<}, +@code{$$^}, and @code{$$+}) expand to the empty string. In the +second, they will have values @code{foo.1}, @code{foo.1 bar.1}, and +@code{foo.1 bar.1} respectively. In the third they will have values +@code{foo.1}, @code{foo.1 bar.1 foo.2 bar.2}, and @code{foo.1 bar.1 +foo.2 bar.2 foo.1 foo.1 bar.1 foo.1 bar.1} respectively. + +Rules undergo secondary expansion in makefile order, except that +the rule with the recipe is always evaluated last. + +The variables @code{$$?} and @code{$$*} are not available and expand +to the empty string. + +@subheading Secondary Expansion of Static Pattern Rules +@cindex secondary expansion and static pattern rules +@cindex static pattern rules, secondary expansion of + +Rules for secondary expansion of static pattern rules are identical to +those for explicit rules, above, with one exception: for static +pattern rules the @code{$$*} variable is set to the pattern stem. As +with explicit rules, @code{$$?} is not available and expands to the +empty string. + +@subheading Secondary Expansion of Implicit Rules +@cindex secondary expansion and implicit rules +@cindex implicit rules, secondary expansion of + +As @code{make} searches for an implicit rule, it substitutes the stem +and then performs secondary expansion for every rule with a matching +target pattern. The value of the automatic variables is derived in +the same fashion as for static pattern rules. As an example: + +@example +.SECONDEXPANSION: + +foo: bar + +foo foz: fo%: bo% + +%oo: $$< $$^ $$+ $$* +@end example + +When the implicit rule is tried for target @file{foo}, @code{$$<} +expands to @file{bar}, @code{$$^} expands to @file{bar boo}, +@code{$$+} also expands to @file{bar boo}, and @code{$$*} expands to +@file{f}. + +Note that the directory prefix (D), as described in @ref{Implicit Rule +Search, ,Implicit Rule Search Algorithm}, is appended (after +expansion) to all the patterns in the prerequisites list. As an +example: + +@example +.SECONDEXPANSION: + +/tmp/foo.o: + +%.o: $$(addsuffix /%.c,foo bar) foo.h +@end example + +The prerequisite list after the secondary expansion and directory +prefix reconstruction will be @file{/tmp/foo/foo.c /tmp/var/bar/foo.c +foo.h}. If you are not interested in this reconstruction, you can use +@code{$$*} instead of @code{%} in the prerequisites list. + +@node Rules, Recipes, Makefiles, Top +@chapter Writing Rules +@cindex writing rules +@cindex rule, how to write +@cindex target +@cindex prerequisite + +A @dfn{rule} appears in the makefile and says when and how to remake +certain files, called the rule's @dfn{targets} (most often only one per rule). +It lists the other files that are the @dfn{prerequisites} of the target, and +the @dfn{recipe} to use to create or update the target. + +@cindex default goal +@cindex goal, default +The order of rules is not significant, except for determining the +@dfn{default goal}: the target for @code{make} to consider, if you do +not otherwise specify one. The default goal is the target of the first +rule in the first makefile. If the first rule has multiple targets, +only the first target is taken as the default. There are two +exceptions: a target starting with a period is not a default unless it +contains one or more slashes, @samp{/}, as well; and, a target that +defines a pattern rule has no effect on the default goal. +(@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}.) + +Therefore, we usually write the makefile so that the first rule is the +one for compiling the entire program or all the programs described by +the makefile (often with a target called @samp{all}). +@xref{Goals, ,Arguments to Specify the Goals}. + +@menu +* Rule Example:: An example explained. +* Rule Syntax:: General syntax explained. +* Prerequisite Types:: There are two types of prerequisites. +* Wildcards:: Using wildcard characters such as `*'. +* Directory Search:: Searching other directories for source files. +* Phony Targets:: Using a target that is not a real file's name. +* Force Targets:: You can use a target without recipes + or prerequisites to mark other targets + as phony. +* Empty Targets:: When only the date matters and the + files are empty. +* Special Targets:: Targets with special built-in meanings. +* Multiple Targets:: When to make use of several targets in a rule. +* Multiple Rules:: How to use several rules with the same target. +* Static Pattern:: Static pattern rules apply to multiple targets + and can vary the prerequisites according to + the target name. +* Double-Colon:: How to use a special kind of rule to allow + several independent rules for one target. +* Automatic Prerequisites:: How to automatically generate rules giving + prerequisites from source files themselves. +@end menu + +@ifnottex +@node Rule Example, Rule Syntax, Rules, Rules +@section Rule Example + +Here is an example of a rule: + +@example +foo.o : foo.c defs.h # module for twiddling the frobs + cc -c -g foo.c +@end example + +Its target is @file{foo.o} and its prerequisites are @file{foo.c} and +@file{defs.h}. It has one command in the recipe: @samp{cc -c -g foo.c}. +The recipe starts with a tab to identify it as a recipe. + +This rule says two things: + +@itemize @bullet +@item +How to decide whether @file{foo.o} is out of date: it is out of date +if it does not exist, or if either @file{foo.c} or @file{defs.h} is +more recent than it. + +@item +How to update the file @file{foo.o}: by running @code{cc} as stated. +The recipe does not explicitly mention @file{defs.h}, but we presume +that @file{foo.c} includes it, and that that is why @file{defs.h} was +added to the prerequisites. +@end itemize +@end ifnottex + +@node Rule Syntax, Prerequisite Types, Rule Example, Rules +@section Rule Syntax + +@cindex rule syntax +@cindex syntax of rules +In general, a rule looks like this: + +@example +@var{targets} : @var{prerequisites} + @var{recipe} + @dots{} +@end example + +@noindent +or like this: + +@example +@var{targets} : @var{prerequisites} ; @var{recipe} + @var{recipe} + @dots{} +@end example + +@cindex targets +@cindex rule targets +The @var{targets} are file names, separated by spaces. Wildcard +characters may be used (@pxref{Wildcards, ,Using Wildcard Characters +in File Names}) and a name of the form @file{@var{a}(@var{m})} +represents member @var{m} in archive file @var{a} +(@pxref{Archive Members, ,Archive Members as Targets}). +Usually there is only one +target per rule, but occasionally there is a reason to have more +(@pxref{Multiple Targets, , Multiple Targets in a Rule}).@refill + +@cindex recipes +@cindex tab character (in commands) +The @var{recipe} lines start with a tab character (or the first +character in the value of the @code{.RECIPEPREFIX} variable; +@pxref{Special Variables}). The first recipe line may appear on the line +after the prerequisites, with a tab character, or may appear on the +same line, with a semicolon. Either way, the effect is the same. +There are other differences in the syntax of recipes. +@xref{Recipes, ,Writing Recipes in Rules}. + +@cindex dollar sign (@code{$}), in rules +@cindex @code{$}, in rules +@cindex rules, and @code{$} +Because dollar signs are used to start @code{make} variable +references, if you really want a dollar sign in a target or +prerequisite you must write two of them, @samp{$$} (@pxref{Using +Variables, ,How to Use Variables}). If you have enabled secondary +expansion (@pxref{Secondary Expansion}) and you want a literal dollar +sign in the prerequisites list, you must actually write @emph{four} +dollar signs (@samp{$$$$}). + +You may split a long line by inserting a backslash followed by a +newline, but this is not required, as @code{make} places no limit on +the length of a line in a makefile. + +A rule tells @code{make} two things: when the targets are out of date, +and how to update them when necessary. + +@cindex prerequisites +@cindex rule prerequisites +The criterion for being out of date is specified in terms of the +@var{prerequisites}, which consist of file names separated by spaces. +(Wildcards and archive members (@pxref{Archives}) are allowed here too.) +A target is out of date if it does not exist or if it is older than any +of the prerequisites (by comparison of last-modification times). The +idea is that the contents of the target file are computed based on +information in the prerequisites, so if any of the prerequisites changes, +the contents of the existing target file are no longer necessarily +valid. + +How to update is specified by a @var{recipe}. This is one or more +lines to be executed by the shell (normally @samp{sh}), but with some +extra features (@pxref{Recipes, ,Writing Recipes in Rules}). + +@node Prerequisite Types, Wildcards, Rule Syntax, Rules +@comment node-name, next, previous, up +@section Types of Prerequisites +@cindex prerequisite types +@cindex types of prerequisites + +@cindex prerequisites, normal +@cindex normal prerequisites +@cindex prerequisites, order-only +@cindex order-only prerequisites +There are actually two different types of prerequisites understood by +GNU @code{make}: normal prerequisites such as described in the +previous section, and @dfn{order-only} prerequisites. A normal +prerequisite makes two statements: first, it imposes an order in which +recipes will be invoked: the recipes for all prerequisites of a target +will be completed before the recipe for the target is run. Second, it +imposes a dependency relationship: if any prerequisite is newer than +the target, then the target is considered out-of-date and must be +rebuilt. + +Normally, this is exactly what you want: if a target's prerequisite is +updated, then the target should also be updated. + +Occasionally, however, you have a situation where you want to impose a +specific ordering on the rules to be invoked @emph{without} forcing +the target to be updated if one of those rules is executed. In that +case, you want to define @dfn{order-only} prerequisites. Order-only +prerequisites can be specified by placing a pipe symbol (@code{|}) +in the prerequisites list: any prerequisites to the left of the pipe +symbol are normal; any prerequisites to the right are order-only: + +@example +@var{targets} : @var{normal-prerequisites} | @var{order-only-prerequisites} +@end example + +The normal prerequisites section may of course be empty. Also, you +may still declare multiple lines of prerequisites for the same target: +they are appended appropriately (normal prerequisites are appended to +the list of normal prerequisites; order-only prerequisites are +appended to the list of order-only prerequisites). Note that if you +declare the same file to be both a normal and an order-only +prerequisite, the normal prerequisite takes precedence (since they +have a strict superset of the behavior of an order-only prerequisite). + +Consider an example where your targets are to be placed in a separate +directory, and that directory might not exist before @code{make} is +run. In this situation, you want the directory to be created before +any targets are placed into it but, because the timestamps on +directories change whenever a file is added, removed, or renamed, we +certainly don't want to rebuild all the targets whenever the +directory's timestamp changes. One way to manage this is with +order-only prerequisites: make the directory an order-only +prerequisite on all the targets: + +@example +OBJDIR := objdir +OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o) + +$(OBJDIR)/%.o : %.c + $(COMPILE.c) $(OUTPUT_OPTION) $< + +all: $(OBJS) + +$(OBJS): | $(OBJDIR) + +$(OBJDIR): + mkdir $(OBJDIR) +@end example + +Now the rule to create the @file{objdir} directory will be run, if +needed, before any @samp{.o} is built, but no @samp{.o} will be built +because the @file{objdir} directory timestamp changed. + +@node Wildcards, Directory Search, Prerequisite Types, Rules +@section Using Wildcard Characters in File Names +@cindex wildcard +@cindex file name with wildcards +@cindex globbing (wildcards) + +@cindex @code{*} (wildcard character) +@cindex @code{?} (wildcard character) +@cindex @code{[@dots{}]} (wildcard characters) +A single file name can specify many files using @dfn{wildcard characters}. +The wildcard characters in @code{make} are @samp{*}, @samp{?} and +@samp{[@dots{}]}, the same as in the Bourne shell. For example, @file{*.c} +specifies a list of all the files (in the working directory) whose names +end in @samp{.c}.@refill + +@cindex @code{~} (tilde) +@cindex tilde (@code{~}) +@cindex home directory +The character @samp{~} at the beginning of a file name also has special +significance. If alone, or followed by a slash, it represents your home +directory. For example @file{~/bin} expands to @file{/home/you/bin}. +If the @samp{~} is followed by a word, the string represents the home +directory of the user named by that word. For example @file{~john/bin} +expands to @file{/home/john/bin}. On systems which don't have a home +directory for each user (such as MS-DOS or MS-Windows), this +functionality can be simulated by setting the environment variable +@var{HOME}.@refill + +Wildcard expansion is performed by @code{make} automatically in +targets and in prerequisites. In recipes, the shell is responsible +for wildcard expansion. In other contexts, wildcard expansion happens +only if you request it explicitly with the @code{wildcard} function. + +The special significance of a wildcard character can be turned off by +preceding it with a backslash. Thus, @file{foo\*bar} would refer to a +specific file whose name consists of @samp{foo}, an asterisk, and +@samp{bar}.@refill + +@menu +* Wildcard Examples:: Several examples +* Wildcard Pitfall:: Problems to avoid. +* Wildcard Function:: How to cause wildcard expansion where + it does not normally take place. +@end menu + +@node Wildcard Examples, Wildcard Pitfall, Wildcards, Wildcards +@subsection Wildcard Examples + +Wildcards can be used in the recipe of a rule, where they are expanded +by the shell. For example, here is a rule to delete all the object files: + +@example +@group +clean: + rm -f *.o +@end group +@end example +@cindex @code{rm} (shell command) + +Wildcards are also useful in the prerequisites of a rule. With the +following rule in the makefile, @samp{make print} will print all the +@samp{.c} files that have changed since the last time you printed them: + +@example +print: *.c + lpr -p $? + touch print +@end example + +@cindex @code{print} target +@cindex @code{lpr} (shell command) +@cindex @code{touch} (shell command) +@noindent +This rule uses @file{print} as an empty target file; see @ref{Empty +Targets, ,Empty Target Files to Record Events}. (The automatic variable +@samp{$?} is used to print only those files that have changed; see +@ref{Automatic Variables}.)@refill + +Wildcard expansion does not happen when you define a variable. Thus, if +you write this: + +@example +objects = *.o +@end example + +@noindent +then the value of the variable @code{objects} is the actual string +@samp{*.o}. However, if you use the value of @code{objects} in a +target or prerequisite, wildcard expansion will take place there. If +you use the value of @code{objects} in a recipe, the shell may perform +wildcard expansion when the recipe runs. To set @code{objects} to the +expansion, instead use: + +@example +objects := $(wildcard *.o) +@end example + +@noindent +@xref{Wildcard Function}. + +@node Wildcard Pitfall, Wildcard Function, Wildcard Examples, Wildcards +@subsection Pitfalls of Using Wildcards +@cindex wildcard pitfalls +@cindex pitfalls of wildcards +@cindex mistakes with wildcards +@cindex errors with wildcards +@cindex problems with wildcards + +Now here is an example of a naive way of using wildcard expansion, that +does not do what you would intend. Suppose you would like to say that the +executable file @file{foo} is made from all the object files in the +directory, and you write this: + +@example +objects = *.o + +foo : $(objects) + cc -o foo $(CFLAGS) $(objects) +@end example + +@noindent +The value of @code{objects} is the actual string @samp{*.o}. Wildcard +expansion happens in the rule for @file{foo}, so that each @emph{existing} +@samp{.o} file becomes a prerequisite of @file{foo} and will be recompiled if +necessary. + +But what if you delete all the @samp{.o} files? When a wildcard matches +no files, it is left as it is, so then @file{foo} will depend on the +oddly-named file @file{*.o}. Since no such file is likely to exist, +@code{make} will give you an error saying it cannot figure out how to +make @file{*.o}. This is not what you want! + +Actually it is possible to obtain the desired result with wildcard +expansion, but you need more sophisticated techniques, including the +@code{wildcard} function and string substitution. +@ifnottex +@xref{Wildcard Function, ,The Function @code{wildcard}}. +@end ifnottex +@iftex +These are described in the following section. +@end iftex + +@cindex wildcards and MS-DOS/MS-Windows backslashes +@cindex backslashes in pathnames and wildcard expansion + +Microsoft operating systems (MS-DOS and MS-Windows) use backslashes to +separate directories in pathnames, like so: + +@example + c:\foo\bar\baz.c +@end example + +This is equivalent to the Unix-style @file{c:/foo/bar/baz.c} (the +@file{c:} part is the so-called drive letter). When @code{make} runs on +these systems, it supports backslashes as well as the Unix-style forward +slashes in pathnames. However, this support does @emph{not} include the +wildcard expansion, where backslash is a quote character. Therefore, +you @emph{must} use Unix-style slashes in these cases. + + +@node Wildcard Function, , Wildcard Pitfall, Wildcards +@subsection The Function @code{wildcard} +@findex wildcard + +Wildcard expansion happens automatically in rules. But wildcard expansion +does not normally take place when a variable is set, or inside the +arguments of a function. If you want to do wildcard expansion in such +places, you need to use the @code{wildcard} function, like this: + +@example +$(wildcard @var{pattern}@dots{}) +@end example + +@noindent +This string, used anywhere in a makefile, is replaced by a +space-separated list of names of existing files that match one of the +given file name patterns. If no existing file name matches a pattern, +then that pattern is omitted from the output of the @code{wildcard} +function. Note that this is different from how unmatched wildcards +behave in rules, where they are used verbatim rather than ignored +(@pxref{Wildcard Pitfall}). + +One use of the @code{wildcard} function is to get a list of all the C source +files in a directory, like this: + +@example +$(wildcard *.c) +@end example + +We can change the list of C source files into a list of object files by +replacing the @samp{.c} suffix with @samp{.o} in the result, like this: + +@example +$(patsubst %.c,%.o,$(wildcard *.c)) +@end example + +@noindent +(Here we have used another function, @code{patsubst}. +@xref{Text Functions, ,Functions for String Substitution and Analysis}.)@refill + +Thus, a makefile to compile all C source files in the directory and then +link them together could be written as follows: + +@example +objects := $(patsubst %.c,%.o,$(wildcard *.c)) + +foo : $(objects) + cc -o foo $(objects) +@end example + +@noindent +(This takes advantage of the implicit rule for compiling C programs, so +there is no need to write explicit rules for compiling the files. +@xref{Flavors, ,The Two Flavors of Variables}, for an explanation of +@samp{:=}, which is a variant of @samp{=}.) + +@node Directory Search, Phony Targets, Wildcards, Rules +@section Searching Directories for Prerequisites +@vindex VPATH +@findex vpath +@cindex vpath +@cindex search path for prerequisites (@code{VPATH}) +@cindex directory search (@code{VPATH}) + +For large systems, it is often desirable to put sources in a separate +directory from the binaries. The @dfn{directory search} features of +@code{make} facilitate this by searching several directories +automatically to find a prerequisite. When you redistribute the files +among directories, you do not need to change the individual rules, +just the search paths. + +@menu +* General Search:: Specifying a search path that applies + to every prerequisite. +* Selective Search:: Specifying a search path + for a specified class of names. +* Search Algorithm:: When and how search paths are applied. +* Recipes/Search:: How to write recipes that work together + with search paths. +* Implicit/Search:: How search paths affect implicit rules. +* Libraries/Search:: Directory search for link libraries. +@end menu + +@node General Search, Selective Search, Directory Search, Directory Search +@subsection @code{VPATH}: Search Path for All Prerequisites +@vindex VPATH + +The value of the @code{make} variable @code{VPATH} specifies a list of +directories that @code{make} should search. Most often, the +directories are expected to contain prerequisite files that are not in the +current directory; however, @code{make} uses @code{VPATH} as a search +list for both prerequisites and targets of rules. + +Thus, if a file that is listed as a target or prerequisite does not exist +in the current directory, @code{make} searches the directories listed in +@code{VPATH} for a file with that name. If a file is found in one of +them, that file may become the prerequisite (see below). Rules may then +specify the names of files in the prerequisite list as if they all +existed in the current directory. @xref{Recipes/Search, ,Writing Recipes with Directory Search}. + +In the @code{VPATH} variable, directory names are separated by colons or +blanks. The order in which directories are listed is the order followed +by @code{make} in its search. (On MS-DOS and MS-Windows, semi-colons +are used as separators of directory names in @code{VPATH}, since the +colon can be used in the pathname itself, after the drive letter.) + +For example, + +@example +VPATH = src:../headers +@end example + +@noindent +specifies a path containing two directories, @file{src} and +@file{../headers}, which @code{make} searches in that order. + +With this value of @code{VPATH}, the following rule, + +@example +foo.o : foo.c +@end example + +@noindent +is interpreted as if it were written like this: + +@example +foo.o : src/foo.c +@end example + +@noindent +assuming the file @file{foo.c} does not exist in the current directory but +is found in the directory @file{src}. + +@node Selective Search, Search Algorithm, General Search, Directory Search +@subsection The @code{vpath} Directive +@findex vpath + +Similar to the @code{VPATH} variable, but more selective, is the +@code{vpath} directive (note lower case), which allows you to specify a +search path for a particular class of file names: those that match a +particular pattern. Thus you can supply certain search directories for +one class of file names and other directories (or none) for other file +names. + +There are three forms of the @code{vpath} directive: + +@table @code +@item vpath @var{pattern} @var{directories} +Specify the search path @var{directories} for file names that match +@var{pattern}. + +The search path, @var{directories}, is a list of directories to be +searched, separated by colons (semi-colons on MS-DOS and MS-Windows) or +blanks, just like the search path used in the @code{VPATH} variable. + +@item vpath @var{pattern} +Clear out the search path associated with @var{pattern}. + +@c Extra blank line makes sure this gets two lines. +@item vpath + +Clear all search paths previously specified with @code{vpath} directives. +@end table + +A @code{vpath} pattern is a string containing a @samp{%} character. The +string must match the file name of a prerequisite that is being searched +for, the @samp{%} character matching any sequence of zero or more +characters (as in pattern rules; @pxref{Pattern Rules, ,Defining and +Redefining Pattern Rules}). For example, @code{%.h} matches files that +end in @code{.h}. (If there is no @samp{%}, the pattern must match the +prerequisite exactly, which is not useful very often.) + +@cindex @code{%}, quoting in @code{vpath} +@cindex @code{%}, quoting with @code{\} (backslash) +@cindex @code{\} (backslash), to quote @code{%} +@cindex backslash (@code{\}), to quote @code{%} +@cindex quoting @code{%}, in @code{vpath} +@samp{%} characters in a @code{vpath} directive's pattern can be quoted +with preceding backslashes (@samp{\}). Backslashes that would otherwise +quote @samp{%} characters can be quoted with more backslashes. +Backslashes that quote @samp{%} characters or other backslashes are +removed from the pattern before it is compared to file names. Backslashes +that are not in danger of quoting @samp{%} characters go unmolested.@refill + +When a prerequisite fails to exist in the current directory, if the +@var{pattern} in a @code{vpath} directive matches the name of the +prerequisite file, then the @var{directories} in that directive are searched +just like (and before) the directories in the @code{VPATH} variable. + +For example, + +@example +vpath %.h ../headers +@end example + +@noindent +tells @code{make} to look for any prerequisite whose name ends in @file{.h} +in the directory @file{../headers} if the file is not found in the current +directory. + +If several @code{vpath} patterns match the prerequisite file's name, then +@code{make} processes each matching @code{vpath} directive one by one, +searching all the directories mentioned in each directive. @code{make} +handles multiple @code{vpath} directives in the order in which they +appear in the makefile; multiple directives with the same pattern are +independent of each other. + +@need 750 +Thus, + +@example +@group +vpath %.c foo +vpath % blish +vpath %.c bar +@end group +@end example + +@noindent +will look for a file ending in @samp{.c} in @file{foo}, then +@file{blish}, then @file{bar}, while + +@example +@group +vpath %.c foo:bar +vpath % blish +@end group +@end example + +@noindent +will look for a file ending in @samp{.c} in @file{foo}, then +@file{bar}, then @file{blish}. + +@node Search Algorithm, Recipes/Search, Selective Search, Directory Search +@subsection How Directory Searches are Performed +@cindex algorithm for directory search +@cindex directory search algorithm + +When a prerequisite is found through directory search, regardless of type +(general or selective), the pathname located may not be the one that +@code{make} actually provides you in the prerequisite list. Sometimes +the path discovered through directory search is thrown away. + +The algorithm @code{make} uses to decide whether to keep or abandon a +path found via directory search is as follows: + +@enumerate +@item +If a target file does not exist at the path specified in the makefile, +directory search is performed. + +@item +If the directory search is successful, that path is kept and this file +is tentatively stored as the target. + +@item +All prerequisites of this target are examined using this same method. + +@item +After processing the prerequisites, the target may or may not need to be +rebuilt: + +@enumerate a +@item +If the target does @emph{not} need to be rebuilt, the path to the file +found during directory search is used for any prerequisite lists which +contain this target. In short, if @code{make} doesn't need to rebuild +the target then you use the path found via directory search. + +@item +If the target @emph{does} need to be rebuilt (is out-of-date), the +pathname found during directory search is @emph{thrown away}, and the +target is rebuilt using the file name specified in the makefile. In +short, if @code{make} must rebuild, then the target is rebuilt locally, +not in the directory found via directory search. +@end enumerate +@end enumerate + +This algorithm may seem complex, but in practice it is quite often +exactly what you want. + +@cindex traditional directory search (GPATH) +@cindex directory search, traditional (GPATH) +Other versions of @code{make} use a simpler algorithm: if the file does +not exist, and it is found via directory search, then that pathname is +always used whether or not the target needs to be built. Thus, if the +target is rebuilt it is created at the pathname discovered during +directory search. + +@vindex GPATH +If, in fact, this is the behavior you want for some or all of your +directories, you can use the @code{GPATH} variable to indicate this to +@code{make}. + +@code{GPATH} has the same syntax and format as @code{VPATH} (that is, a +space- or colon-delimited list of pathnames). If an out-of-date target +is found by directory search in a directory that also appears in +@code{GPATH}, then that pathname is not thrown away. The target is +rebuilt using the expanded path. + +@node Recipes/Search, Implicit/Search, Search Algorithm, Directory Search +@subsection Writing Recipes with Directory Search +@cindex recipes, and directory search +@cindex directory search (@code{VPATH}), and recipes + +When a prerequisite is found in another directory through directory search, +this cannot change the recipe of the rule; they will execute as written. +Therefore, you must write the recipe with care so that it will look for +the prerequisite in the directory where @code{make} finds it. + +This is done with the @dfn{automatic variables} such as @samp{$^} +(@pxref{Automatic Variables}). +For instance, the value of @samp{$^} is a +list of all the prerequisites of the rule, including the names of +the directories in which they were found, and the value of +@samp{$@@} is the target. Thus:@refill + +@example +foo.o : foo.c + cc -c $(CFLAGS) $^ -o $@@ +@end example + +@noindent +(The variable @code{CFLAGS} exists so you can specify flags for C +compilation by implicit rules; we use it here for consistency so it will +affect all C compilations uniformly; +@pxref{Implicit Variables, ,Variables Used by Implicit Rules}.) + +Often the prerequisites include header files as well, which you do not +want to mention in the recipe. The automatic variable @samp{$<} is +just the first prerequisite: + +@example +VPATH = src:../headers +foo.o : foo.c defs.h hack.h + cc -c $(CFLAGS) $< -o $@@ +@end example + +@node Implicit/Search, Libraries/Search, Recipes/Search, Directory Search +@subsection Directory Search and Implicit Rules +@cindex @code{VPATH}, and implicit rules +@cindex directory search (@code{VPATH}), and implicit rules +@cindex search path for prerequisites (@code{VPATH}), and implicit rules +@cindex implicit rule, and directory search +@cindex implicit rule, and @code{VPATH} +@cindex rule, implicit, and directory search +@cindex rule, implicit, and @code{VPATH} + +The search through the directories specified in @code{VPATH} or with +@code{vpath} also happens during consideration of implicit rules +(@pxref{Implicit Rules, ,Using Implicit Rules}). + +For example, when a file @file{foo.o} has no explicit rule, @code{make} +considers implicit rules, such as the built-in rule to compile +@file{foo.c} if that file exists. If such a file is lacking in the +current directory, the appropriate directories are searched for it. If +@file{foo.c} exists (or is mentioned in the makefile) in any of the +directories, the implicit rule for C compilation is applied. + +The recipes of implicit rules normally use automatic variables as a +matter of necessity; consequently they will use the file names found by +directory search with no extra effort. + +@node Libraries/Search, , Implicit/Search, Directory Search +@subsection Directory Search for Link Libraries +@cindex link libraries, and directory search +@cindex libraries for linking, directory search +@cindex directory search (@code{VPATH}), and link libraries +@cindex @code{VPATH}, and link libraries +@cindex search path for prerequisites (@code{VPATH}), and link libraries +@cindex @code{-l} (library search) +@cindex link libraries, patterns matching +@cindex @code{.LIBPATTERNS}, and link libraries +@vindex .LIBPATTERNS + +Directory search applies in a special way to libraries used with the +linker. This special feature comes into play when you write a prerequisite +whose name is of the form @samp{-l@var{name}}. (You can tell something +strange is going on here because the prerequisite is normally the name of a +file, and the @emph{file name} of a library generally looks like +@file{lib@var{name}.a}, not like @samp{-l@var{name}}.)@refill + +When a prerequisite's name has the form @samp{-l@var{name}}, @code{make} +handles it specially by searching for the file @file{lib@var{name}.so}, +and, if it is not found, for the file @file{lib@var{name}.a} in the current +directory, in directories specified by matching @code{vpath} +search paths and the @code{VPATH} search path, and then in the +directories @file{/lib}, @file{/usr/lib}, and @file{@var{prefix}/lib} +(normally @file{/usr/local/lib}, but MS-DOS/MS-Windows versions of +@code{make} behave as if @var{prefix} is defined to be the root of the +DJGPP installation tree). + +For example, if there is a @file{/usr/lib/libcurses.a} library on your +system (and no @file{/usr/lib/libcurses.so} file), then + +@example +@group +foo : foo.c -lcurses + cc $^ -o $@@ +@end group +@end example + +@noindent +would cause the command @samp{cc foo.c /usr/lib/libcurses.a -o foo} to +be executed when @file{foo} is older than @file{foo.c} or than +@file{/usr/lib/libcurses.a}.@refill + +Although the default set of files to be searched for is +@file{lib@var{name}.so} and @file{lib@var{name}.a}, this is customizable +via the @code{.LIBPATTERNS} variable. Each word in the value of this +variable is a pattern string. When a prerequisite like +@samp{-l@var{name}} is seen, @code{make} will replace the percent in +each pattern in the list with @var{name} and perform the above directory +searches using each library filename. + +The default value for @code{.LIBPATTERNS} is @samp{lib%.so lib%.a}, +which provides the default behavior described above. + +You can turn off link library expansion completely by setting this +variable to an empty value. + +@node Phony Targets, Force Targets, Directory Search, Rules +@section Phony Targets +@cindex phony targets +@cindex targets, phony +@cindex targets without a file + +A phony target is one that is not really the name of a file; rather it +is just a name for a recipe to be executed when you make an explicit +request. There are two reasons to use a phony target: to avoid a +conflict with a file of the same name, and to improve performance. + +If you write a rule whose recipe will not create the target file, the +recipe will be executed every time the target comes up for remaking. +Here is an example: + +@example +@group +clean: + rm *.o temp +@end group +@end example + +@noindent +Because the @code{rm} command does not create a file named @file{clean}, +probably no such file will ever exist. Therefore, the @code{rm} command +will be executed every time you say @samp{make clean}. +@cindex @code{rm} (shell command) + +@findex .PHONY +The phony target will cease to work if anything ever does create a file +named @file{clean} in this directory. Since it has no prerequisites, the +file @file{clean} would inevitably be considered up to date, and its +recipe would not be executed. To avoid this problem, you can explicitly +declare the target to be phony, using the special target @code{.PHONY} +(@pxref{Special Targets, ,Special Built-in Target Names}) as follows: + +@example +.PHONY : clean +@end example + +@noindent +Once this is done, @samp{make clean} will run the recipe regardless of +whether there is a file named @file{clean}. + +Since it knows that phony targets do not name actual files that could be +remade from other files, @code{make} skips the implicit rule search for +phony targets (@pxref{Implicit Rules}). This is why declaring a target +phony is good for performance, even if you are not worried about the +actual file existing. + +Thus, you first write the line that states that @code{clean} is a +phony target, then you write the rule, like this: + +@example +@group +.PHONY: clean +clean: + rm *.o temp +@end group +@end example + +Another example of the usefulness of phony targets is in conjunction +with recursive invocations of @code{make} (for more information, see +@ref{Recursion, ,Recursive Use of @code{make}}). In this case the +makefile will often contain a variable which lists a number of +subdirectories to be built. One way to handle this is with one rule +whose recipe is a shell loop over the subdirectories, like this: + +@example +@group +SUBDIRS = foo bar baz + +subdirs: + for dir in $(SUBDIRS); do \ + $(MAKE) -C $$dir; \ + done +@end group +@end example + +There are problems with this method, however. First, any error +detected in a submake is ignored by this rule, so it will continue +to build the rest of the directories even when one fails. This can be +overcome by adding shell commands to note the error and exit, but then +it will do so even if @code{make} is invoked with the @code{-k} +option, which is unfortunate. Second, and perhaps more importantly, +you cannot take advantage of @code{make}'s ability to build targets in +parallel (@pxref{Parallel, ,Parallel Execution}), since there is only +one rule. + +By declaring the subdirectories as phony targets (you must do this as +the subdirectory obviously always exists; otherwise it won't be built) +you can remove these problems: + +@example +@group +SUBDIRS = foo bar baz + +.PHONY: subdirs $(SUBDIRS) + +subdirs: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -C $@@ + +foo: baz +@end group +@end example + +Here we've also declared that the @file{foo} subdirectory cannot be +built until after the @file{baz} subdirectory is complete; this kind of +relationship declaration is particularly important when attempting +parallel builds. + +A phony target should not be a prerequisite of a real target file; if it +is, its recipe will be run every time @code{make} goes to update that +file. As long as a phony target is never a prerequisite of a real +target, the phony target recipe will be executed only when the phony +target is a specified goal (@pxref{Goals, ,Arguments to Specify the +Goals}). + +Phony targets can have prerequisites. When one directory contains multiple +programs, it is most convenient to describe all of the programs in one +makefile @file{./Makefile}. Since the target remade by default will be the +first one in the makefile, it is common to make this a phony target named +@samp{all} and give it, as prerequisites, all the individual programs. For +example: + +@example +all : prog1 prog2 prog3 +.PHONY : all + +prog1 : prog1.o utils.o + cc -o prog1 prog1.o utils.o + +prog2 : prog2.o + cc -o prog2 prog2.o + +prog3 : prog3.o sort.o utils.o + cc -o prog3 prog3.o sort.o utils.o +@end example + +@noindent +Now you can say just @samp{make} to remake all three programs, or +specify as arguments the ones to remake (as in @samp{make prog1 +prog3}). Phoniness is not inherited: the prerequisites of a phony +target are not themselves phony, unless explicitly declared to be so. + +When one phony target is a prerequisite of another, it serves as a subroutine +of the other. For example, here @samp{make cleanall} will delete the +object files, the difference files, and the file @file{program}: + +@example +.PHONY: cleanall cleanobj cleandiff + +cleanall : cleanobj cleandiff + rm program + +cleanobj : + rm *.o + +cleandiff : + rm *.diff +@end example + +@node Force Targets, Empty Targets, Phony Targets, Rules +@section Rules without Recipes or Prerequisites +@cindex force targets +@cindex targets, force +@cindex @code{FORCE} +@cindex rule, no recipe or prerequisites + +If a rule has no prerequisites or recipe, and the target of the rule +is a nonexistent file, then @code{make} imagines this target to have +been updated whenever its rule is run. This implies that all targets +depending on this one will always have their recipe run. + +An example will illustrate this: + +@example +@group +clean: FORCE + rm $(objects) +FORCE: +@end group +@end example + +Here the target @samp{FORCE} satisfies the special conditions, so the +target @file{clean} that depends on it is forced to run its recipe. +There is nothing special about the name @samp{FORCE}, but that is one +name commonly used this way. + +As you can see, using @samp{FORCE} this way has the same results as using +@samp{.PHONY: clean}. + +Using @samp{.PHONY} is more explicit and more efficient. However, +other versions of @code{make} do not support @samp{.PHONY}; thus +@samp{FORCE} appears in many makefiles. @xref{Phony Targets}. + +@node Empty Targets, Special Targets, Force Targets, Rules +@section Empty Target Files to Record Events +@cindex empty targets +@cindex targets, empty +@cindex recording events with empty targets + +The @dfn{empty target} is a variant of the phony target; it is used to hold +recipes for an action that you request explicitly from time to time. +Unlike a phony target, this target file can really exist; but the file's +contents do not matter, and usually are empty. + +The purpose of the empty target file is to record, with its +last-modification time, when the rule's recipe was last executed. It +does so because one of the commands in the recipe is a @code{touch} +command to update the target file. + +The empty target file should have some prerequisites (otherwise it +doesn't make sense). When you ask to remake the empty target, the +recipe is executed if any prerequisite is more recent than the target; +in other words, if a prerequisite has changed since the last time you +remade the target. Here is an example: + +@example +print: foo.c bar.c + lpr -p $? + touch print +@end example +@cindex @code{print} target +@cindex @code{lpr} (shell command) +@cindex @code{touch} (shell command) + +@noindent +With this rule, @samp{make print} will execute the @code{lpr} command if +either source file has changed since the last @samp{make print}. The +automatic variable @samp{$?} is used to print only those files that have +changed (@pxref{Automatic Variables}). + +@node Special Targets, Multiple Targets, Empty Targets, Rules +@section Special Built-in Target Names +@cindex special targets +@cindex built-in special targets +@cindex targets, built-in special + +Certain names have special meanings if they appear as targets. + +@table @code +@findex .PHONY +@item .PHONY + +The prerequisites of the special target @code{.PHONY} are considered to +be phony targets. When it is time to consider such a target, +@code{make} will run its recipe unconditionally, regardless of +whether a file with that name exists or what its last-modification +time is. @xref{Phony Targets, ,Phony Targets}. + +@findex .SUFFIXES +@item .SUFFIXES + +The prerequisites of the special target @code{.SUFFIXES} are the list +of suffixes to be used in checking for suffix rules. +@xref{Suffix Rules, , Old-Fashioned Suffix Rules}. + +@findex .DEFAULT +@item .DEFAULT + +The recipe specified for @code{.DEFAULT} is used for any target for +which no rules are found (either explicit rules or implicit rules). +@xref{Last Resort}. If a @code{.DEFAULT} recipe is specified, every +file mentioned as a prerequisite, but not as a target in a rule, will have +that recipe executed on its behalf. @xref{Implicit Rule Search, +,Implicit Rule Search Algorithm}. + +@findex .PRECIOUS +@item .PRECIOUS +@cindex precious targets +@cindex preserving with @code{.PRECIOUS} + +The targets which @code{.PRECIOUS} depends on are given the following +special treatment: if @code{make} is killed or interrupted during the +execution of their recipes, the target is not deleted. +@xref{Interrupts, ,Interrupting or Killing @code{make}}. Also, if the +target is an intermediate file, it will not be deleted after it is no +longer needed, as is normally done. @xref{Chained Rules, ,Chains of +Implicit Rules}. In this latter respect it overlaps with the +@code{.SECONDARY} special target. + +You can also list the target pattern of an implicit rule (such as +@samp{%.o}) as a prerequisite file of the special target @code{.PRECIOUS} +to preserve intermediate files created by rules whose target patterns +match that file's name. + +@findex .INTERMEDIATE +@item .INTERMEDIATE +@cindex intermediate targets, explicit + +The targets which @code{.INTERMEDIATE} depends on are treated as +intermediate files. @xref{Chained Rules, ,Chains of Implicit Rules}. +@code{.INTERMEDIATE} with no prerequisites has no effect. + +@findex .SECONDARY +@item .SECONDARY +@cindex secondary targets +@cindex preserving with @code{.SECONDARY} + +The targets which @code{.SECONDARY} depends on are treated as +intermediate files, except that they are never automatically deleted. +@xref{Chained Rules, ,Chains of Implicit Rules}. + +@code{.SECONDARY} with no prerequisites causes all targets to be treated +as secondary (i.e., no target is removed because it is considered +intermediate). + +@findex .SECONDEXPANSION +@item .SECONDEXPANSION + +If @code{.SECONDEXPANSION} is mentioned as a target anywhere in the +makefile, then all prerequisite lists defined @emph{after} it appears +will be expanded a second time after all makefiles have been read in. +@xref{Secondary Expansion, ,Secondary Expansion}. + +@findex .DELETE_ON_ERROR +@item .DELETE_ON_ERROR +@cindex removing targets on failure + +If @code{.DELETE_ON_ERROR} is mentioned as a target anywhere in the +makefile, then @code{make} will delete the target of a rule if it has +changed and its recipe exits with a nonzero exit status, just as it +does when it receives a signal. @xref{Errors, ,Errors in Recipes}. + +@findex .IGNORE +@item .IGNORE + +If you specify prerequisites for @code{.IGNORE}, then @code{make} will +ignore errors in execution of the recipe for those particular files. +The recipe for @code{.IGNORE} (if any) is ignored. + +If mentioned as a target with no prerequisites, @code{.IGNORE} says to +ignore errors in execution of recipes for all files. This usage of +@samp{.IGNORE} is supported only for historical compatibility. Since +this affects every recipe in the makefile, it is not very useful; we +recommend you use the more selective ways to ignore errors in specific +recipes. @xref{Errors, ,Errors in Recipes}. + +@findex .LOW_RESOLUTION_TIME +@item .LOW_RESOLUTION_TIME + +If you specify prerequisites for @code{.LOW_RESOLUTION_TIME}, +@command{make} assumes that these files are created by commands that +generate low resolution time stamps. The recipe for the +@code{.LOW_RESOLUTION_TIME} target are ignored. + +The high resolution file time stamps of many modern file systems +lessen the chance of @command{make} incorrectly concluding that a file +is up to date. Unfortunately, some hosts do not provide a way to set a +high resolution file time stamp, so commands like @samp{cp -p} that +explicitly set a file's time stamp must discard its subsecond part. +If a file is created by such a command, you should list it as a +prerequisite of @code{.LOW_RESOLUTION_TIME} so that @command{make} +does not mistakenly conclude that the file is out of date. For +example: + +@example +@group +.LOW_RESOLUTION_TIME: dst +dst: src + cp -p src dst +@end group +@end example + +Since @samp{cp -p} discards the subsecond part of @file{src}'s time +stamp, @file{dst} is typically slightly older than @file{src} even when +it is up to date. The @code{.LOW_RESOLUTION_TIME} line causes +@command{make} to consider @file{dst} to be up to date if its time stamp +is at the start of the same second that @file{src}'s time stamp is in. + +Due to a limitation of the archive format, archive member time stamps +are always low resolution. You need not list archive members as +prerequisites of @code{.LOW_RESOLUTION_TIME}, as @command{make} does this +automatically. + +@findex .SILENT +@item .SILENT + +If you specify prerequisites for @code{.SILENT}, then @code{make} will +not print the recipe used to remake those particular files before +executing them. The recipe for @code{.SILENT} is ignored. + +If mentioned as a target with no prerequisites, @code{.SILENT} says not +to print any recipes before executing them. This usage of +@samp{.SILENT} is supported only for historical compatibility. We +recommend you use the more selective ways to silence specific recipes. +@xref{Echoing, ,Recipe Echoing}. If you want to silence all recipes +for a particular run of @code{make}, use the @samp{-s} or +@w{@samp{--silent}} option (@pxref{Options Summary}). + +@findex .EXPORT_ALL_VARIABLES +@item .EXPORT_ALL_VARIABLES + +Simply by being mentioned as a target, this tells @code{make} to +export all variables to child processes by default. +@xref{Variables/Recursion, ,Communicating Variables to a +Sub-@code{make}}. + +@findex .NOTPARALLEL +@item .NOTPARALLEL +@cindex parallel execution, overriding + +If @code{.NOTPARALLEL} is mentioned as a target, then this invocation +of @code{make} will be run serially, even if the @samp{-j} option is +given. Any recursively invoked @code{make} command will still run +recipes in parallel (unless its makefile also contains this target). +Any prerequisites on this target are ignored. + +@findex .ONESHELL +@item .ONESHELL +@cindex recipe execution, single invocation + +If @code{.ONESHELL} is mentioned as a target, then when a target is +built all lines of the recipe will be given to a single invocation of +the shell rather than each line being invoked separately +(@pxref{Execution, ,Recipe Execution}). + +@findex .POSIX +@item .POSIX +@cindex POSIX-conforming mode, setting + +If @code{.POSIX} is mentioned as a target, then the makefile will be +parsed and run in POSIX-conforming mode. This does @emph{not} mean +that only POSIX-conforming makefiles will be accepted: all advanced +GNU @code{make} features are still available. Rather, this target +causes @code{make} to behave as required by POSIX in those areas +where @code{make}'s default behavior differs. + +In particular, if this target is mentioned then recipes will be +invoked as if the shell had been passed the @code{-e} flag: the first +failing command in a recipe will cause the recipe to fail immediately. +@end table + +Any defined implicit rule suffix also counts as a special target if it +appears as a target, and so does the concatenation of two suffixes, such +as @samp{.c.o}. These targets are suffix rules, an obsolete way of +defining implicit rules (but a way still widely used). In principle, any +target name could be special in this way if you break it in two and add +both pieces to the suffix list. In practice, suffixes normally begin with +@samp{.}, so these special target names also begin with @samp{.}. +@xref{Suffix Rules, ,Old-Fashioned Suffix Rules}. + +@node Multiple Targets, Multiple Rules, Special Targets, Rules +@section Multiple Targets in a Rule +@cindex multiple targets +@cindex several targets in a rule +@cindex targets, multiple +@cindex rule, with multiple targets + +A rule with multiple targets is equivalent to writing many rules, each with +one target, and all identical aside from that. The same recipe applies to +all the targets, but its effect may vary because you can substitute the +actual target name into the recipe using @samp{$@@}. The rule contributes +the same prerequisites to all the targets also. + +This is useful in two cases. + +@itemize @bullet +@item +You want just prerequisites, no recipe. For example: + +@example +kbd.o command.o files.o: command.h +@end example + +@noindent +gives an additional prerequisite to each of the three object files +mentioned. + +@item +Similar recipes work for all the targets. The recipes do not need +to be absolutely identical, since the automatic variable @samp{$@@} +can be used to substitute the particular target to be remade into the +commands (@pxref{Automatic Variables}). For example: + +@example +@group +bigoutput littleoutput : text.g + generate text.g -$(subst output,,$@@) > $@@ +@end group +@end example +@findex subst + +@noindent +is equivalent to + +@example +bigoutput : text.g + generate text.g -big > bigoutput +littleoutput : text.g + generate text.g -little > littleoutput +@end example + +@noindent +Here we assume the hypothetical program @code{generate} makes two +types of output, one if given @samp{-big} and one if given +@samp{-little}. +@xref{Text Functions, ,Functions for String Substitution and Analysis}, +for an explanation of the @code{subst} function. +@end itemize + +Suppose you would like to vary the prerequisites according to the +target, much as the variable @samp{$@@} allows you to vary the recipe. +You cannot do this with multiple targets in an ordinary rule, but you +can do it with a @dfn{static pattern rule}. @xref{Static Pattern, +,Static Pattern Rules}. + +@node Multiple Rules, Static Pattern, Multiple Targets, Rules +@section Multiple Rules for One Target +@cindex multiple rules for one target +@cindex several rules for one target +@cindex rule, multiple for one target +@cindex target, multiple rules for one + +One file can be the target of several rules. All the prerequisites +mentioned in all the rules are merged into one list of prerequisites for +the target. If the target is older than any prerequisite from any rule, +the recipe is executed. + +There can only be one recipe to be executed for a file. If more than +one rule gives a recipe for the same file, @code{make} uses the last +one given and prints an error message. (As a special case, if the +file's name begins with a dot, no error message is printed. This odd +behavior is only for compatibility with other implementations of +@code{make}@dots{} you should avoid using it). Occasionally it is +useful to have the same target invoke multiple recipes which are +defined in different parts of your makefile; you can use +@dfn{double-colon rules} (@pxref{Double-Colon}) for this. + +An extra rule with just prerequisites can be used to give a few extra +prerequisites to many files at once. For example, makefiles often +have a variable, such as @code{objects}, containing a list of all the +compiler output files in the system being made. An easy way to say +that all of them must be recompiled if @file{config.h} changes is to +write the following: + +@example +objects = foo.o bar.o +foo.o : defs.h +bar.o : defs.h test.h +$(objects) : config.h +@end example + +This could be inserted or taken out without changing the rules that really +specify how to make the object files, making it a convenient form to use if +you wish to add the additional prerequisite intermittently. + +Another wrinkle is that the additional prerequisites could be +specified with a variable that you set with a command line argument to +@code{make} (@pxref{Overriding, ,Overriding Variables}). For example, + +@example +@group +extradeps= +$(objects) : $(extradeps) +@end group +@end example + +@noindent +means that the command @samp{make extradeps=foo.h} will consider +@file{foo.h} as a prerequisite of each object file, but plain @samp{make} +will not. + +If none of the explicit rules for a target has a recipe, then @code{make} +searches for an applicable implicit rule to find one +@pxref{Implicit Rules, ,Using Implicit Rules}). + +@node Static Pattern, Double-Colon, Multiple Rules, Rules +@section Static Pattern Rules +@cindex static pattern rule +@cindex rule, static pattern +@cindex pattern rules, static (not implicit) +@cindex varying prerequisites +@cindex prerequisites, varying (static pattern) + +@dfn{Static pattern rules} are rules which specify multiple targets and +construct the prerequisite names for each target based on the target name. +They are more general than ordinary rules with multiple targets because the +targets do not have to have identical prerequisites. Their prerequisites must +be @emph{analogous}, but not necessarily @emph{identical}. + +@menu +* Static Usage:: The syntax of static pattern rules. +* Static versus Implicit:: When are they better than implicit rules? +@end menu + +@node Static Usage, Static versus Implicit, Static Pattern, Static Pattern +@subsection Syntax of Static Pattern Rules +@cindex static pattern rule, syntax of +@cindex pattern rules, static, syntax of + +Here is the syntax of a static pattern rule: + +@example +@var{targets} @dots{}: @var{target-pattern}: @var{prereq-patterns} @dots{} + @var{recipe} + @dots{} +@end example + +@noindent +The @var{targets} list specifies the targets that the rule applies to. +The targets can contain wildcard characters, just like the targets of +ordinary rules (@pxref{Wildcards, ,Using Wildcard Characters in File +Names}). + +@cindex target pattern, static (not implicit) +@cindex stem +The @var{target-pattern} and @var{prereq-patterns} say how to compute the +prerequisites of each target. Each target is matched against the +@var{target-pattern} to extract a part of the target name, called the +@dfn{stem}. This stem is substituted into each of the @var{prereq-patterns} +to make the prerequisite names (one from each @var{prereq-pattern}). + +Each pattern normally contains the character @samp{%} just once. When the +@var{target-pattern} matches a target, the @samp{%} can match any part of +the target name; this part is called the @dfn{stem}. The rest of the +pattern must match exactly. For example, the target @file{foo.o} matches +the pattern @samp{%.o}, with @samp{foo} as the stem. The targets +@file{foo.c} and @file{foo.out} do not match that pattern.@refill + +@cindex prerequisite pattern, static (not implicit) +The prerequisite names for each target are made by substituting the stem +for the @samp{%} in each prerequisite pattern. For example, if one +prerequisite pattern is @file{%.c}, then substitution of the stem +@samp{foo} gives the prerequisite name @file{foo.c}. It is legitimate +to write a prerequisite pattern that does not contain @samp{%}; then this +prerequisite is the same for all targets. + +@cindex @code{%}, quoting in static pattern +@cindex @code{%}, quoting with @code{\} (backslash) +@cindex @code{\} (backslash), to quote @code{%} +@cindex backslash (@code{\}), to quote @code{%} +@cindex quoting @code{%}, in static pattern +@samp{%} characters in pattern rules can be quoted with preceding +backslashes (@samp{\}). Backslashes that would otherwise quote @samp{%} +characters can be quoted with more backslashes. Backslashes that quote +@samp{%} characters or other backslashes are removed from the pattern +before it is compared to file names or has a stem substituted into it. +Backslashes that are not in danger of quoting @samp{%} characters go +unmolested. For example, the pattern @file{the\%weird\\%pattern\\} has +@samp{the%weird\} preceding the operative @samp{%} character, and +@samp{pattern\\} following it. The final two backslashes are left alone +because they cannot affect any @samp{%} character.@refill + +Here is an example, which compiles each of @file{foo.o} and @file{bar.o} +from the corresponding @file{.c} file: + +@example +@group +objects = foo.o bar.o + +all: $(objects) + +$(objects): %.o: %.c + $(CC) -c $(CFLAGS) $< -o $@@ +@end group +@end example + +@noindent +Here @samp{$<} is the automatic variable that holds the name of the +prerequisite and @samp{$@@} is the automatic variable that holds the name +of the target; see @ref{Automatic Variables}. + +Each target specified must match the target pattern; a warning is issued +for each target that does not. If you have a list of files, only some of +which will match the pattern, you can use the @code{filter} function to +remove nonmatching file names (@pxref{Text Functions, ,Functions for String Substitution and Analysis}): + +@example +files = foo.elc bar.o lose.o + +$(filter %.o,$(files)): %.o: %.c + $(CC) -c $(CFLAGS) $< -o $@@ +$(filter %.elc,$(files)): %.elc: %.el + emacs -f batch-byte-compile $< +@end example + +@noindent +In this example the result of @samp{$(filter %.o,$(files))} is +@file{bar.o lose.o}, and the first static pattern rule causes each of +these object files to be updated by compiling the corresponding C source +file. The result of @w{@samp{$(filter %.elc,$(files))}} is +@file{foo.elc}, so that file is made from @file{foo.el}.@refill + +Another example shows how to use @code{$*} in static pattern rules: +@vindex $*@r{, and static pattern} + +@example +@group +bigoutput littleoutput : %output : text.g + generate text.g -$* > $@@ +@end group +@end example + +@noindent +When the @code{generate} command is run, @code{$*} will expand to the +stem, either @samp{big} or @samp{little}. + +@node Static versus Implicit, , Static Usage, Static Pattern +@subsection Static Pattern Rules versus Implicit Rules +@cindex rule, static pattern versus implicit +@cindex static pattern rule, versus implicit + +A static pattern rule has much in common with an implicit rule defined as a +pattern rule (@pxref{Pattern Rules, ,Defining and Redefining Pattern Rules}). +Both have a pattern for the target and patterns for constructing the +names of prerequisites. The difference is in how @code{make} decides +@emph{when} the rule applies. + +An implicit rule @emph{can} apply to any target that matches its pattern, +but it @emph{does} apply only when the target has no recipe otherwise +specified, and only when the prerequisites can be found. If more than one +implicit rule appears applicable, only one applies; the choice depends on +the order of rules. + +By contrast, a static pattern rule applies to the precise list of targets +that you specify in the rule. It cannot apply to any other target and it +invariably does apply to each of the targets specified. If two conflicting +rules apply, and both have recipes, that's an error. + +The static pattern rule can be better than an implicit rule for these +reasons: + +@itemize @bullet +@item +You may wish to override the usual implicit rule for a few +files whose names cannot be categorized syntactically but +can be given in an explicit list. + +@item +If you cannot be sure of the precise contents of the directories +you are using, you may not be sure which other irrelevant files +might lead @code{make} to use the wrong implicit rule. The choice +might depend on the order in which the implicit rule search is done. +With static pattern rules, there is no uncertainty: each rule applies +to precisely the targets specified. +@end itemize + +@node Double-Colon, Automatic Prerequisites, Static Pattern, Rules +@section Double-Colon Rules +@cindex double-colon rules +@cindex rule, double-colon (@code{::}) +@cindex multiple rules for one target (@code{::}) +@cindex @code{::} rules (double-colon) + +@dfn{Double-colon} rules are explicit rules written with @samp{::} +instead of @samp{:} after the target names. They are handled +differently from ordinary rules when the same target appears in more +than one rule. Pattern rules with double-colons have an entirely +different meaning (@pxref{Match-Anything Rules}). + +When a target appears in multiple rules, all the rules must be the same +type: all ordinary, or all double-colon. If they are double-colon, each +of them is independent of the others. Each double-colon rule's recipe +is executed if the target is older than any prerequisites of that rule. +If there are no prerequisites for that rule, its recipe is always +executed (even if the target already exists). This can result in +executing none, any, or all of the double-colon rules. + +Double-colon rules with the same target are in fact completely separate +from one another. Each double-colon rule is processed individually, just +as rules with different targets are processed. + +The double-colon rules for a target are executed in the order they appear +in the makefile. However, the cases where double-colon rules really make +sense are those where the order of executing the recipes would not matter. + +Double-colon rules are somewhat obscure and not often very useful; they +provide a mechanism for cases in which the method used to update a target +differs depending on which prerequisite files caused the update, and such +cases are rare. + +Each double-colon rule should specify a recipe; if it does not, an +implicit rule will be used if one applies. +@xref{Implicit Rules, ,Using Implicit Rules}. + +@node Automatic Prerequisites, , Double-Colon, Rules +@section Generating Prerequisites Automatically +@cindex prerequisites, automatic generation +@cindex automatic generation of prerequisites +@cindex generating prerequisites automatically + +In the makefile for a program, many of the rules you need to write often +say only that some object file depends on some header +file. For example, if @file{main.c} uses @file{defs.h} via an +@code{#include}, you would write: + +@example +main.o: defs.h +@end example + +@noindent +You need this rule so that @code{make} knows that it must remake +@file{main.o} whenever @file{defs.h} changes. You can see that for a +large program you would have to write dozens of such rules in your +makefile. And, you must always be very careful to update the makefile +every time you add or remove an @code{#include}. +@cindex @code{#include} + +@cindex @code{-M} (to compiler) +To avoid this hassle, most modern C compilers can write these rules for +you, by looking at the @code{#include} lines in the source files. +Usually this is done with the @samp{-M} option to the compiler. +For example, the command: + +@example +cc -M main.c +@end example + +@noindent +generates the output: + +@example +main.o : main.c defs.h +@end example + +@noindent +Thus you no longer have to write all those rules yourself. +The compiler will do it for you. + +Note that such a prerequisite constitutes mentioning @file{main.o} in a +makefile, so it can never be considered an intermediate file by implicit +rule search. This means that @code{make} won't ever remove the file +after using it; @pxref{Chained Rules, ,Chains of Implicit Rules}. + +@cindex @code{make depend} +With old @code{make} programs, it was traditional practice to use this +compiler feature to generate prerequisites on demand with a command like +@samp{make depend}. That command would create a file @file{depend} +containing all the automatically-generated prerequisites; then the +makefile could use @code{include} to read them in (@pxref{Include}). + +In GNU @code{make}, the feature of remaking makefiles makes this +practice obsolete---you need never tell @code{make} explicitly to +regenerate the prerequisites, because it always regenerates any makefile +that is out of date. @xref{Remaking Makefiles}. + +The practice we recommend for automatic prerequisite generation is to have +one makefile corresponding to each source file. For each source file +@file{@var{name}.c} there is a makefile @file{@var{name}.d} which lists +what files the object file @file{@var{name}.o} depends on. That way +only the source files that have changed need to be rescanned to produce +the new prerequisites. + +Here is the pattern rule to generate a file of prerequisites (i.e., a makefile) +called @file{@var{name}.d} from a C source file called @file{@var{name}.c}: + +@smallexample +@group +%.d: %.c + @@set -e; rm -f $@@; \ + $(CC) -M $(CPPFLAGS) $< > $@@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@@ : ,g' < $@@.$$$$ > $@@; \ + rm -f $@@.$$$$ +@end group +@end smallexample + +@noindent +@xref{Pattern Rules}, for information on defining pattern rules. The +@samp{-e} flag to the shell causes it to exit immediately if the +@code{$(CC)} command (or any other command) fails (exits with a +nonzero status). +@cindex @code{-e} (shell flag) + +@cindex @code{-MM} (to GNU compiler) +With the GNU C compiler, you may wish to use the @samp{-MM} flag instead +of @samp{-M}. This omits prerequisites on system header files. +@xref{Preprocessor Options, , Options Controlling the Preprocessor, +gcc.info, Using GNU CC}, for details. + +@cindex @code{sed} (shell command) +The purpose of the @code{sed} command is to translate (for example): + +@example +main.o : main.c defs.h +@end example + +@noindent +into: + +@example +main.o main.d : main.c defs.h +@end example + +@noindent +@cindex @code{.d} +This makes each @samp{.d} file depend on all the source and header files +that the corresponding @samp{.o} file depends on. @code{make} then +knows it must regenerate the prerequisites whenever any of the source or +header files changes. + +Once you've defined the rule to remake the @samp{.d} files, +you then use the @code{include} directive to read them all in. +@xref{Include}. For example: + +@example +@group +sources = foo.c bar.c + +include $(sources:.c=.d) +@end group +@end example + +@noindent +(This example uses a substitution variable reference to translate the +list of source files @samp{foo.c bar.c} into a list of prerequisite +makefiles, @samp{foo.d bar.d}. @xref{Substitution Refs}, for full +information on substitution references.) Since the @samp{.d} files are +makefiles like any others, @code{make} will remake them as necessary +with no further work from you. @xref{Remaking Makefiles}. + +Note that the @samp{.d} files contain target definitions; you should +be sure to place the @code{include} directive @emph{after} the first, +default goal in your makefiles or run the risk of having a random +object file become the default goal. +@xref{How Make Works}. + +@node Recipes, Using Variables, Rules, Top +@chapter Writing Recipes in Rules +@cindex recipes +@cindex recipes, how to write +@cindex writing recipes + +The recipe of a rule consists of one or more shell command lines to +be executed, one at a time, in the order they appear. Typically, the +result of executing these commands is that the target of the rule is +brought up to date. + +Users use many different shell programs, but recipes in makefiles are +always interpreted by @file{/bin/sh} unless the makefile specifies +otherwise. @xref{Execution, ,Recipe Execution}. + +@menu +* Recipe Syntax:: Recipe syntax features and pitfalls. +* Echoing:: How to control when recipes are echoed. +* Execution:: How recipes are executed. +* Parallel:: How recipes can be executed in parallel. +* Errors:: What happens after a recipe execution error. +* Interrupts:: What happens when a recipe is interrupted. +* Recursion:: Invoking @code{make} from makefiles. +* Canned Recipes:: Defining canned recipes. +* Empty Recipes:: Defining useful, do-nothing recipes. +@end menu + +@node Recipe Syntax, Echoing, Recipes, Recipes +@section Recipe Syntax +@cindex recipe syntax +@cindex syntax of recipe + +Makefiles have the unusual property that there are really two distinct +syntaxes in one file. Most of the makefile uses @code{make} syntax +(@pxref{Makefiles, ,Writing Makefiles}). However, recipes are meant +to be interpreted by the shell and so they are written using shell +syntax. The @code{make} program does not try to understand shell +syntax: it performs only a very few specific translations on the +content of the recipe before handing it to the shell. + +Each line in the recipe must start with a tab (or the first character +in the value of the @code{.RECIPEPREFIX} variable; @pxref{Special +Variables}), except that the first recipe line may be attached to the +target-and-prerequisites line with a semicolon in between. @emph{Any} +line in the makefile that begins with a tab and appears in a ``rule +context'' (that is, after a rule has been started until another rule +or variable definition) will be considered part of a recipe for that +rule. Blank lines and lines of just comments may appear among the +recipe lines; they are ignored. + +Some consequences of these rules include: + +@itemize @bullet +@item +A blank line that begins with a tab is not blank: it's an empty +recipe (@pxref{Empty Recipes}). + +@cindex comments, in recipes +@cindex recipes, comments in +@cindex @code{#} (comments), in recipes +@item +A comment in a recipe is not a @code{make} comment; it will be +passed to the shell as-is. Whether the shell treats it as a comment +or not depends on your shell. + +@item +A variable definition in a ``rule context'' which is indented by a tab +as the first character on the line, will be considered part of a +recipe, not a @code{make} variable definition, and passed to the +shell. + +@item +A conditional expression (@code{ifdef}, @code{ifeq}, +etc. @pxref{Conditional Syntax, ,Syntax of Conditionals}) in a ``rule +context'' which is indented by a tab as the first character on the +line, will be considered part of a recipe and be passed to the shell. + +@end itemize + +@menu +* Splitting Lines:: Breaking long recipe lines for readability. +* Variables in Recipes:: Using @code{make} variables in recipes. +@end menu + +@node Splitting Lines, Variables in Recipes, Recipe Syntax, Recipe Syntax +@subsection Splitting Recipe Lines +@cindex recipes, splitting +@cindex splitting recipes +@cindex recipes, backslash (@code{\}) in +@cindex recipes, quoting newlines in +@cindex backslash (@code{\}), in recipes +@cindex @code{\} (backslash), in recipes +@cindex quoting newline, in recipes +@cindex newline, quoting, in recipes + +One of the few ways in which @code{make} does interpret recipes is +checking for a backslash just before the newline. As in normal +makefile syntax, a single logical recipe line can be split into +multiple physical lines in the makefile by placing a backslash before +each newline. A sequence of lines like this is considered a single +recipe line, and one instance of the shell will be invoked to run it. + +However, in contrast to how they are treated in other places in a +makefile, backslash-newline pairs are @emph{not} removed from the +recipe. Both the backslash and the newline characters are preserved +and passed to the shell. How the backslash-newline is interpreted +depends on your shell. If the first character of the next line after +the backslash-newline is the recipe prefix character (a tab by +default; @pxref{Special Variables}), then that character (and only +that character) is removed. Whitespace is never added to the recipe. + +For example, the recipe for the all target in this makefile: + +@example +@group +all : + @@echo no\ +space + @@echo no\ + space + @@echo one \ + space + @@echo one\ + space +@end group +@end example + +@noindent +consists of four separate shell commands where the output is: + +@example +@group +nospace +nospace +one space +one space +@end group +@end example + +As a more complex example, this makefile: + +@example +@group +all : ; @@echo 'hello \ + world' ; echo "hello \ + world" +@end group +@end example + +@noindent +will invoke one shell with a command of: + +@example +@group +echo 'hello \ +world' ; echo "hello \ + world" +@end group +@end example + +@noindent +which, according to shell quoting rules, will yield the following output: + +@example +@group +hello \ +world +hello world +@end group +@end example + +@noindent +Notice how the backslash/newline pair was removed inside the string +quoted with double quotes (@code{"@dots{}"}), but not from the string +quoted with single quotes (@code{'@dots{}'}). This is the way the +default shell (@file{/bin/sh}) handles backslash/newline pairs. If +you specify a different shell in your makefiles it may treat them +differently. + +Sometimes you want to split a long line inside of single quotes, but +you don't want the backslash-newline to appear in the quoted content. +This is often the case when passing scripts to languages such as Perl, +where extraneous backslashes inside the script can change its meaning +or even be a syntax error. One simple way of handling this is to +place the quoted string, or even the entire command, into a +@code{make} variable then use the variable in the recipe. In this +situation the newline quoting rules for makefiles will be used, and +the backslash-newline will be removed. If we rewrite our example +above using this method: + +@example +@group +HELLO = 'hello \ +world' + +all : ; @@echo $(HELLO) +@end group +@end example + +@noindent +we will get output like this: + +@example +@group +hello world +@end group +@end example + +If you like, you can also use target-specific variables +(@pxref{Target-specific, ,Target-specific Variable Values}) to obtain +a tighter correspondence between the variable and the recipe that +uses it. + +@node Variables in Recipes, , Splitting Lines, Recipe Syntax +@subsection Using Variables in Recipes +@cindex variable references in recipes +@cindex recipes, using variables in + +The other way in which @code{make} processes recipes is by expanding +any variable references in them (@pxref{Reference,Basics of Variable +References}). This occurs after make has finished reading all the +makefiles and the target is determined to be out of date; so, the +recipes for targets which are not rebuilt are never expanded. + +Variable and function references in recipes have identical syntax and +semantics to references elsewhere in the makefile. They also have the +same quoting rules: if you want a dollar sign to appear in your +recipe, you must double it (@samp{$$}). For shells like the default +shell, that use dollar signs to introduce variables, it's important to +keep clear in your mind whether the variable you want to reference is +a @code{make} variable (use a single dollar sign) or a shell variable +(use two dollar signs). For example: + +@example +@group +LIST = one two three +all: + for i in $(LIST); do \ + echo $$i; \ + done +@end group +@end example + +@noindent +results in the following command being passed to the shell: + +@example +@group +for i in one two three; do \ + echo $i; \ +done +@end group +@end example + +@noindent +which generates the expected result: + +@example +@group +one +two +three +@end group +@end example + +@node Echoing, Execution, Recipe Syntax, Recipes +@section Recipe Echoing +@cindex echoing of recipes +@cindex silent operation +@cindex @code{@@} (in recipes) +@cindex recipes, echoing +@cindex printing of recipes + +Normally @code{make} prints each line of the recipe before it is +executed. We call this @dfn{echoing} because it gives the appearance +that you are typing the lines yourself. + +When a line starts with @samp{@@}, the echoing of that line is suppressed. +The @samp{@@} is discarded before the line is passed to the shell. +Typically you would use this for a command whose only effect is to print +something, such as an @code{echo} command to indicate progress through +the makefile: + +@example +@@echo About to make distribution files +@end example + +@cindex @code{-n} +@cindex @code{--just-print} +@cindex @code{--dry-run} +@cindex @code{--recon} +When @code{make} is given the flag @samp{-n} or @samp{--just-print} it +only echoes most recipes, without executing them. @xref{Options +Summary, ,Summary of Options}. In this case even the recipe lines +starting with @samp{@@} are printed. This flag is useful for finding +out which recipes @code{make} thinks are necessary without actually +doing them. + +@cindex @code{-s} +@cindex @code{--silent} +@cindex @code{--quiet} +@findex .SILENT +The @samp{-s} or @samp{--silent} +flag to @code{make} prevents all echoing, as if all recipes +started with @samp{@@}. A rule in the makefile for the special target +@code{.SILENT} without prerequisites has the same effect +(@pxref{Special Targets, ,Special Built-in Target Names}). +@code{.SILENT} is essentially obsolete since @samp{@@} is more flexible.@refill + +@node Execution, Parallel, Echoing, Recipes +@section Recipe Execution +@cindex recipe, execution +@cindex execution, of recipes +@vindex @code{SHELL} @r{(recipe execution)} + +When it is time to execute recipes to update a target, they are +executed by invoking a new subshell for each line of the recipe, +unless the @code{.ONESHELL} special target is in effect +(@pxref{One Shell, ,Using One Shell}) (In practice, @code{make} may +take shortcuts that do not affect the results.) + +@cindex @code{cd} (shell command) +@cindex shell variables, setting in recipes +@cindex recipes setting shell variables +@strong{Please note:} this implies that setting shell variables and +invoking shell commands such as @code{cd} that set a context local to +each process will not affect the following lines in the recipe.@footnote{On +MS-DOS, the value of current working directory is @strong{global}, so +changing it @emph{will} affect the following recipe lines on those +systems.} If you want to use @code{cd} to affect the next statement, +put both statements in a single recipe line. Then @code{make} will +invoke one shell to run the entire line, and the shell will execute +the statements in sequence. For example: + +@example +foo : bar/lose + cd $(@@D) && gobble $(@@F) > ../$@@ +@end example + +@noindent +Here we use the shell AND operator (@code{&&}) so that if the +@code{cd} command fails, the script will fail without trying to invoke +the @code{gobble} command in the wrong directory, which could cause +problems (in this case it would certainly cause @file{../foo} to be +truncated, at least). + +@menu +* One Shell:: One shell for all lines in a recipe +* Choosing the Shell:: How @code{make} chooses the shell used + to run recipes. +@end menu + +@node One Shell, Choosing the Shell, Execution, Execution +@subsection Using One Shell +@cindex recipe lines, single shell +@cindex @code{.ONESHELL}, use of +@findex .ONESHELL + +Sometimes you would prefer that all the lines in the recipe be passed +to a single invocation of the shell. There are generally two +situations where this is useful: first, it can improve performance in +makefiles where recipes consist of many command lines, by avoiding +extra processes. Second, you might want newlines to be included in +your recipe command (for example perhaps you are using a very +different interpreter as your @code{SHELL}). If the @code{.ONESHELL} +special target appears anywhere in the makefile then @emph{all} +recipe lines for each target will be provided to a single invocation +of the shell. Newlines between recipe lines will be preserved. For +example: + +@example +.ONESHELL: +foo : bar/lose + cd $(@@D) + gobble $(@@F) > ../$@@ +@end example + +@noindent +would now work as expected even though the commands are on different +recipe lines. + +If @code{.ONESHELL} is provided, then only the first line of the +recipe will be checked for the special prefix characters (@samp{@@}, +@samp{-}, and @samp{+}). Subsequent lines will include the special +characters in the recipe line when the @code{SHELL} is invoked. If +you want your recipe to start with one of these special characters +you'll need to arrange for them to not be the first characters on the +first line, perhaps by adding a comment or similar. For example, this +would be a syntax error in Perl because the first @samp{@@} is removed +by make: + +@example +.ONESHELL: +SHELL = /usr/bin/perl +.SHELLFLAGS = -e +show : + @@f = qw(a b c); + print "@@f\n"; +@end example + +@noindent +However, either of these alternatives would work properly: + +@example +.ONESHELL: +SHELL = /usr/bin/perl +.SHELLFLAGS = -e +show : + # Make sure "@@" is not the first character on the first line + @@f = qw(a b c); + print "@@f\n"; +@end example + +@noindent +or + +@example +.ONESHELL: +SHELL = /usr/bin/perl +.SHELLFLAGS = -e +show : + my @@f = qw(a b c); + print "@@f\n"; +@end example + +As a special feature, if @code{SHELL} is determined to be a +POSIX-style shell, the special prefix characters in ``internal'' +recipe lines will @emph{removed} before the recipe is processed. This +feature is intended to allow existing makefiles to add the +@code{.ONESHELL} special target and still run properly without +extensive modifications. Since the special prefix characters are not +legal at the beginning of a line in a POSIX shell script this is not a +loss in functionality. For example, this works as expected: + +@example +.ONESHELL: +foo : bar/lose + @@cd $(@@D) + @@gobble $(@@F) > ../$@@ +@end example + +Even with this special feature, however, makefiles with +@code{.ONESHELL} will behave differently in ways that could be +noticeable. For example, normally if any line in the recipe fails, +that causes the rule to fail and no more recipe lines are processed. +Under @code{.ONESHELL} a failure of any but the final recipe line will +not be noticed by @code{make}. You can modify @code{.SHELLFLAGS} to +add the @code{-e} option to the shell which will cause any failure +anywhere in the command line to cause the shell to fail, but this +could itself cause your recipe to behave differently. Ultimately you +may need to harden your recipe lines to allow them to work with +@code{.ONESHELL}. + +@node Choosing the Shell, , One Shell, Execution +@subsection Choosing the Shell +@cindex shell, choosing the +@cindex @code{SHELL}, value of +@cindex @code{.SHELLFLAGS}, value of + +@vindex SHELL +@vindex .SHELLFLAGS +The program used as the shell is taken from the variable @code{SHELL}. +If this variable is not set in your makefile, the program +@file{/bin/sh} is used as the shell. The argument(s) passed to the +shell are taken from the variable @code{.SHELLFLAGS}. The default +value of @code{.SHELLFLAGS} is @code{-c} normally, or @code{-ec} in +POSIX-conforming mode. + +@cindex environment, @code{SHELL} in +Unlike most variables, the variable @code{SHELL} is never set from the +environment. This is because the @code{SHELL} environment variable is +used to specify your personal choice of shell program for interactive +use. It would be very bad for personal choices like this to affect the +functioning of makefiles. @xref{Environment, ,Variables from the +Environment}. + +Furthermore, when you do set @code{SHELL} in your makefile that value +is @emph{not} exported in the environment to recipe lines that +@code{make} invokes. Instead, the value inherited from the user's +environment, if any, is exported. You can override this behavior by +explicitly exporting @code{SHELL} (@pxref{Variables/Recursion, +,Communicating Variables to a Sub-@code{make}}), forcing it to be +passed in the environment to recipe lines. + +@vindex @code{MAKESHELL} @r{(MS-DOS alternative to @code{SHELL})} +However, on MS-DOS and MS-Windows the value of @code{SHELL} in the +environment @strong{is} used, since on those systems most users do not +set this variable, and therefore it is most likely set specifically to +be used by @code{make}. On MS-DOS, if the setting of @code{SHELL} is +not suitable for @code{make}, you can set the variable +@code{MAKESHELL} to the shell that @code{make} should use; if set it +will be used as the shell instead of the value of @code{SHELL}. + +@subsubheading Choosing a Shell in DOS and Windows +@cindex shell, in DOS and Windows +@cindex DOS, choosing a shell in +@cindex Windows, choosing a shell in + +Choosing a shell in MS-DOS and MS-Windows is much more complex than on +other systems. + +@vindex COMSPEC +On MS-DOS, if @code{SHELL} is not set, the value of the variable +@code{COMSPEC} (which is always set) is used instead. + +@cindex @code{SHELL}, MS-DOS specifics +The processing of lines that set the variable @code{SHELL} in Makefiles +is different on MS-DOS. The stock shell, @file{command.com}, is +ridiculously limited in its functionality and many users of @code{make} +tend to install a replacement shell. Therefore, on MS-DOS, @code{make} +examines the value of @code{SHELL}, and changes its behavior based on +whether it points to a Unix-style or DOS-style shell. This allows +reasonable functionality even if @code{SHELL} points to +@file{command.com}. + +If @code{SHELL} points to a Unix-style shell, @code{make} on MS-DOS +additionally checks whether that shell can indeed be found; if not, it +ignores the line that sets @code{SHELL}. In MS-DOS, GNU @code{make} +searches for the shell in the following places: + +@enumerate +@item +In the precise place pointed to by the value of @code{SHELL}. For +example, if the makefile specifies @samp{SHELL = /bin/sh}, @code{make} +will look in the directory @file{/bin} on the current drive. + +@item +In the current directory. + +@item +In each of the directories in the @code{PATH} variable, in order. + +@end enumerate + +In every directory it examines, @code{make} will first look for the +specific file (@file{sh} in the example above). If this is not found, +it will also look in that directory for that file with one of the known +extensions which identify executable files. For example @file{.exe}, +@file{.com}, @file{.bat}, @file{.btm}, @file{.sh}, and some others. + +If any of these attempts is successful, the value of @code{SHELL} will +be set to the full pathname of the shell as found. However, if none of +these is found, the value of @code{SHELL} will not be changed, and thus +the line that sets it will be effectively ignored. This is so +@code{make} will only support features specific to a Unix-style shell if +such a shell is actually installed on the system where @code{make} runs. + +Note that this extended search for the shell is limited to the cases +where @code{SHELL} is set from the Makefile; if it is set in the +environment or command line, you are expected to set it to the full +pathname of the shell, exactly as things are on Unix. + +The effect of the above DOS-specific processing is that a Makefile that +contains @samp{SHELL = /bin/sh} (as many Unix makefiles do), will work +on MS-DOS unaltered if you have e.g.@: @file{sh.exe} installed in some +directory along your @code{PATH}. + +@vindex SHELL +@vindex .SHELLFLAGS + +@node Parallel, Errors, Execution, Recipes +@section Parallel Execution +@cindex recipes, execution in parallel +@cindex parallel execution +@cindex execution, in parallel +@cindex job slots +@cindex @code{-j} +@cindex @code{--jobs} + +GNU @code{make} knows how to execute several recipes at once. +Normally, @code{make} will execute only one recipe at a time, waiting +for it to finish before executing the next. However, the @samp{-j} or +@samp{--jobs} option tells @code{make} to execute many recipes +simultaneously. You can inhibit parallelism in a particular makefile +with the @code{.NOTPARALLEL} pseudo-target (@pxref{Special +Targets,Special Built-in Target Names}).@refill + +On MS-DOS, the @samp{-j} option has no effect, since that system doesn't +support multi-processing. + +If the @samp{-j} option is followed by an integer, this is the number of +recipes to execute at once; this is called the number of @dfn{job slots}. +If there is nothing looking like an integer after the @samp{-j} option, +there is no limit on the number of job slots. The default number of job +slots is one, which means serial execution (one thing at a time). + +One unpleasant consequence of running several recipes simultaneously is +that output generated by the recipes appears whenever each recipe +sends it, so messages from different recipes may be interspersed. + +Another problem is that two processes cannot both take input from the +same device; so to make sure that only one recipe tries to take input +from the terminal at once, @code{make} will invalidate the standard +input streams of all but one running recipe. This means that +attempting to read from standard input will usually be a fatal error (a +@samp{Broken pipe} signal) for most child processes if there are +several. +@cindex broken pipe +@cindex standard input + +It is unpredictable which recipe will have a valid standard input stream +(which will come from the terminal, or wherever you redirect the standard +input of @code{make}). The first recipe run will always get it first, and +the first recipe started after that one finishes will get it next, and so +on. + +We will change how this aspect of @code{make} works if we find a better +alternative. In the mean time, you should not rely on any recipe using +standard input at all if you are using the parallel execution feature; but +if you are not using this feature, then standard input works normally in +all recipes. + +Finally, handling recursive @code{make} invocations raises issues. For +more information on this, see +@ref{Options/Recursion, ,Communicating Options to a Sub-@code{make}}. + +If a recipe fails (is killed by a signal or exits with a nonzero +status), and errors are not ignored for that recipe +(@pxref{Errors, ,Errors in Recipes}), +the remaining recipe lines to remake the same target will not be run. +If a recipe fails and the @samp{-k} or @samp{--keep-going} +option was not given +(@pxref{Options Summary, ,Summary of Options}), +@code{make} aborts execution. If make +terminates for any reason (including a signal) with child processes +running, it waits for them to finish before actually exiting.@refill + +@cindex load average +@cindex limiting jobs based on load +@cindex jobs, limiting based on load +@cindex @code{-l} (load average) +@cindex @code{--max-load} +@cindex @code{--load-average} +When the system is heavily loaded, you will probably want to run fewer jobs +than when it is lightly loaded. You can use the @samp{-l} option to tell +@code{make} to limit the number of jobs to run at once, based on the load +average. The @samp{-l} or @samp{--max-load} +option is followed by a floating-point number. For +example, + +@example +-l 2.5 +@end example + +@noindent +will not let @code{make} start more than one job if the load average is +above 2.5. The @samp{-l} option with no following number removes the +load limit, if one was given with a previous @samp{-l} option.@refill + +More precisely, when @code{make} goes to start up a job, and it already has +at least one job running, it checks the current load average; if it is not +lower than the limit given with @samp{-l}, @code{make} waits until the load +average goes below that limit, or until all the other jobs finish. + +By default, there is no load limit. + +@node Errors, Interrupts, Parallel, Recipes +@section Errors in Recipes +@cindex errors (in recipes) +@cindex recipes, errors in +@cindex exit status (errors) + +After each shell invocation returns, @code{make} looks at its exit +status. If the shell completed successfully (the exit status is +zero), the next line in the recipe is executed in a new shell; after +the last line is finished, the rule is finished. + +If there is an error (the exit status is nonzero), @code{make} gives up on +the current rule, and perhaps on all rules. + +Sometimes the failure of a certain recipe line does not indicate a problem. +For example, you may use the @code{mkdir} command to ensure that a +directory exists. If the directory already exists, @code{mkdir} will +report an error, but you probably want @code{make} to continue regardless. + +@cindex @code{-} (in recipes) +To ignore errors in a recipe line, write a @samp{-} at the beginning +of the line's text (after the initial tab). The @samp{-} is discarded +before the line is passed to the shell for execution. + +For example, + +@example +@group +clean: + -rm -f *.o +@end group +@end example +@cindex @code{rm} (shell command) + +@noindent +This causes @code{make} to continue even if @code{rm} is unable to +remove a file. + +@cindex @code{-i} +@cindex @code{--ignore-errors} +@findex .IGNORE +When you run @code{make} with the @samp{-i} or @samp{--ignore-errors} +flag, errors are ignored in all recipes of all rules. A rule in the +makefile for the special target @code{.IGNORE} has the same effect, if +there are no prerequisites. These ways of ignoring errors are obsolete +because @samp{-} is more flexible. + +When errors are to be ignored, because of either a @samp{-} or the +@samp{-i} flag, @code{make} treats an error return just like success, +except that it prints out a message that tells you the status code +the shell exited with, and says that the error has been ignored. + +When an error happens that @code{make} has not been told to ignore, +it implies that the current target cannot be correctly remade, and neither +can any other that depends on it either directly or indirectly. No further +recipes will be executed for these targets, since their preconditions +have not been achieved. + + +@cindex @code{-k} +@cindex @code{--keep-going} +Normally @code{make} gives up immediately in this circumstance, returning a +nonzero status. However, if the @samp{-k} or @samp{--keep-going} +flag is specified, @code{make} +continues to consider the other prerequisites of the pending targets, +remaking them if necessary, before it gives up and returns nonzero status. +For example, after an error in compiling one object file, @samp{make -k} +will continue compiling other object files even though it already knows +that linking them will be impossible. @xref{Options Summary, ,Summary of Options}. + +The usual behavior assumes that your purpose is to get the specified +targets up to date; once @code{make} learns that this is impossible, it +might as well report the failure immediately. The @samp{-k} option says +that the real purpose is to test as many of the changes made in the +program as possible, perhaps to find several independent problems so +that you can correct them all before the next attempt to compile. This +is why Emacs' @code{compile} command passes the @samp{-k} flag by +default. +@cindex Emacs (@code{M-x compile}) + +@findex .DELETE_ON_ERROR +@cindex deletion of target files +@cindex removal of target files +@cindex target, deleting on error +Usually when a recipe line fails, if it has changed the target file at all, +the file is corrupted and cannot be used---or at least it is not +completely updated. Yet the file's time stamp says that it is now up to +date, so the next time @code{make} runs, it will not try to update that +file. The situation is just the same as when the shell is killed by a +signal; @pxref{Interrupts}. So generally the right thing to do is to +delete the target file if the recipe fails after beginning to change +the file. @code{make} will do this if @code{.DELETE_ON_ERROR} appears +as a target. This is almost always what you want @code{make} to do, but +it is not historical practice; so for compatibility, you must explicitly +request it. + +@node Interrupts, Recursion, Errors, Recipes +@section Interrupting or Killing @code{make} +@cindex interrupt +@cindex signal +@cindex deletion of target files +@cindex removal of target files +@cindex target, deleting on interrupt +@cindex killing (interruption) + +If @code{make} gets a fatal signal while a shell is executing, it may +delete the target file that the recipe was supposed to update. This is +done if the target file's last-modification time has changed since +@code{make} first checked it. + +The purpose of deleting the target is to make sure that it is remade from +scratch when @code{make} is next run. Why is this? Suppose you type +@kbd{Ctrl-c} while a compiler is running, and it has begun to write an +object file @file{foo.o}. The @kbd{Ctrl-c} kills the compiler, resulting +in an incomplete file whose last-modification time is newer than the source +file @file{foo.c}. But @code{make} also receives the @kbd{Ctrl-c} signal +and deletes this incomplete file. If @code{make} did not do this, the next +invocation of @code{make} would think that @file{foo.o} did not require +updating---resulting in a strange error message from the linker when it +tries to link an object file half of which is missing. + +@findex .PRECIOUS +You can prevent the deletion of a target file in this way by making the +special target @code{.PRECIOUS} depend on it. Before remaking a target, +@code{make} checks to see whether it appears on the prerequisites of +@code{.PRECIOUS}, and thereby decides whether the target should be deleted +if a signal happens. Some reasons why you might do this are that the +target is updated in some atomic fashion, or exists only to record a +modification-time (its contents do not matter), or must exist at all +times to prevent other sorts of trouble. + +@node Recursion, Canned Recipes, Interrupts, Recipes +@section Recursive Use of @code{make} +@cindex recursion +@cindex subdirectories, recursion for + +Recursive use of @code{make} means using @code{make} as a command in a +makefile. This technique is useful when you want separate makefiles for +various subsystems that compose a larger system. For example, suppose you +have a subdirectory @file{subdir} which has its own makefile, and you would +like the containing directory's makefile to run @code{make} on the +subdirectory. You can do it by writing this: + +@example +subsystem: + cd subdir && $(MAKE) +@end example + +@noindent +or, equivalently, this (@pxref{Options Summary, ,Summary of Options}): + +@example +subsystem: + $(MAKE) -C subdir +@end example +@cindex @code{-C} +@cindex @code{--directory} + +You can write recursive @code{make} commands just by copying this example, +but there are many things to know about how they work and why, and about +how the sub-@code{make} relates to the top-level @code{make}. You may +also find it useful to declare targets that invoke recursive +@code{make} commands as @samp{.PHONY} (for more discussion on when +this is useful, see @ref{Phony Targets}). + +@vindex @code{CURDIR} +For your convenience, when GNU @code{make} starts (after it has +processed any @code{-C} options) it sets the variable @code{CURDIR} to +the pathname of the current working directory. This value is never +touched by @code{make} again: in particular note that if you include +files from other directories the value of @code{CURDIR} does not +change. The value has the same precedence it would have if it were +set in the makefile (by default, an environment variable @code{CURDIR} +will not override this value). Note that setting this variable has no +impact on the operation of @code{make} (it does not cause @code{make} +to change its working directory, for example). + +@menu +* MAKE Variable:: The special effects of using @samp{$(MAKE)}. +* Variables/Recursion:: How to communicate variables to a sub-@code{make}. +* Options/Recursion:: How to communicate options to a sub-@code{make}. +* -w Option:: How the @samp{-w} or @samp{--print-directory} option + helps debug use of recursive @code{make} commands. +@end menu + +@node MAKE Variable, Variables/Recursion, Recursion, Recursion +@subsection How the @code{MAKE} Variable Works +@vindex MAKE +@cindex recursion, and @code{MAKE} variable + +Recursive @code{make} commands should always use the variable @code{MAKE}, +not the explicit command name @samp{make}, as shown here: + +@example +@group +subsystem: + cd subdir && $(MAKE) +@end group +@end example + +The value of this variable is the file name with which @code{make} was +invoked. If this file name was @file{/bin/make}, then the recipe executed +is @samp{cd subdir && /bin/make}. If you use a special version of +@code{make} to run the top-level makefile, the same special version will be +executed for recursive invocations. +@cindex @code{cd} (shell command) + +@cindex +, and recipes +As a special feature, using the variable @code{MAKE} in the recipe of +a rule alters the effects of the @samp{-t} (@samp{--touch}), @samp{-n} +(@samp{--just-print}), or @samp{-q} (@w{@samp{--question}}) option. +Using the @code{MAKE} variable has the same effect as using a @samp{+} +character at the beginning of the recipe line. @xref{Instead of +Execution, ,Instead of Executing the Recipes}. This special feature +is only enabled if the @code{MAKE} variable appears directly in the +recipe: it does not apply if the @code{MAKE} variable is referenced +through expansion of another variable. In the latter case you must +use the @samp{+} token to get these special effects.@refill + +Consider the command @samp{make -t} in the above example. (The +@samp{-t} option marks targets as up to date without actually running +any recipes; see @ref{Instead of Execution}.) Following the usual +definition of @samp{-t}, a @samp{make -t} command in the example would +create a file named @file{subsystem} and do nothing else. What you +really want it to do is run @samp{@w{cd subdir &&} @w{make -t}}; but +that would require executing the recipe, and @samp{-t} says not to +execute recipes.@refill +@cindex @code{-t}, and recursion +@cindex recursion, and @code{-t} +@cindex @code{--touch}, and recursion + +The special feature makes this do what you want: whenever a recipe +line of a rule contains the variable @code{MAKE}, the flags @samp{-t}, +@samp{-n} and @samp{-q} do not apply to that line. Recipe lines +containing @code{MAKE} are executed normally despite the presence of a +flag that causes most recipes not to be run. The usual +@code{MAKEFLAGS} mechanism passes the flags to the sub-@code{make} +(@pxref{Options/Recursion, ,Communicating Options to a +Sub-@code{make}}), so your request to touch the files, or print the +recipes, is propagated to the subsystem.@refill + +@node Variables/Recursion, Options/Recursion, MAKE Variable, Recursion +@subsection Communicating Variables to a Sub-@code{make} +@cindex sub-@code{make} +@cindex environment, and recursion +@cindex exporting variables +@cindex variables, environment +@cindex variables, exporting +@cindex recursion, and environment +@cindex recursion, and variables + +Variable values of the top-level @code{make} can be passed to the +sub-@code{make} through the environment by explicit request. These +variables are defined in the sub-@code{make} as defaults, but do not +override what is specified in the makefile used by the sub-@code{make} +makefile unless you use the @samp{-e} switch (@pxref{Options Summary, +,Summary of Options}).@refill + +To pass down, or @dfn{export}, a variable, @code{make} adds the +variable and its value to the environment for running each line of the +recipe. The sub-@code{make}, in turn, uses the environment to +initialize its table of variable values. @xref{Environment, +,Variables from the Environment}. + +Except by explicit request, @code{make} exports a variable only if it +is either defined in the environment initially or set on the command +line, and if its name consists only of letters, numbers, and underscores. +Some shells cannot cope with environment variable names consisting of +characters other than letters, numbers, and underscores. + +@cindex SHELL, exported value +The value of the @code{make} variable @code{SHELL} is not exported. +Instead, the value of the @code{SHELL} variable from the invoking +environment is passed to the sub-@code{make}. You can force +@code{make} to export its value for @code{SHELL} by using the +@code{export} directive, described below. @xref{Choosing the Shell}. + +The special variable @code{MAKEFLAGS} is always exported (unless you +unexport it). @code{MAKEFILES} is exported if you set it to anything. + +@code{make} automatically passes down variable values that were defined +on the command line, by putting them in the @code{MAKEFLAGS} variable. +@iftex +See the next section. +@end iftex +@ifnottex +@xref{Options/Recursion}. +@end ifnottex + +Variables are @emph{not} normally passed down if they were created by +default by @code{make} (@pxref{Implicit Variables, ,Variables Used by +Implicit Rules}). The sub-@code{make} will define these for +itself.@refill + +@findex export +If you want to export specific variables to a sub-@code{make}, use the +@code{export} directive, like this: + +@example +export @var{variable} @dots{} +@end example + +@noindent +@findex unexport +If you want to @emph{prevent} a variable from being exported, use the +@code{unexport} directive, like this: + +@example +unexport @var{variable} @dots{} +@end example + +@noindent +In both of these forms, the arguments to @code{export} and +@code{unexport} are expanded, and so could be variables or functions +which expand to a (list of) variable names to be (un)exported. + +As a convenience, you can define a variable and export it at the same +time by doing: + +@example +export @var{variable} = value +@end example + +@noindent +has the same result as: + +@example +@var{variable} = value +export @var{variable} +@end example + +@noindent +and + +@example +export @var{variable} := value +@end example + +@noindent +has the same result as: + +@example +@var{variable} := value +export @var{variable} +@end example + +Likewise, + +@example +export @var{variable} += value +@end example + +@noindent +is just like: + +@example +@var{variable} += value +export @var{variable} +@end example + +@noindent +@xref{Appending, ,Appending More Text to Variables}. + +You may notice that the @code{export} and @code{unexport} directives +work in @code{make} in the same way they work in the shell, @code{sh}. + +If you want all variables to be exported by default, you can use +@code{export} by itself: + +@example +export +@end example + +@noindent +This tells @code{make} that variables which are not explicitly mentioned +in an @code{export} or @code{unexport} directive should be exported. +Any variable given in an @code{unexport} directive will still @emph{not} +be exported. If you use @code{export} by itself to export variables by +default, variables whose names contain characters other than +alphanumerics and underscores will not be exported unless specifically +mentioned in an @code{export} directive.@refill + +@findex .EXPORT_ALL_VARIABLES +The behavior elicited by an @code{export} directive by itself was the +default in older versions of GNU @code{make}. If your makefiles depend +on this behavior and you want to be compatible with old versions of +@code{make}, you can write a rule for the special target +@code{.EXPORT_ALL_VARIABLES} instead of using the @code{export} directive. +This will be ignored by old @code{make}s, while the @code{export} +directive will cause a syntax error.@refill +@cindex compatibility in exporting + +Likewise, you can use @code{unexport} by itself to tell @code{make} +@emph{not} to export variables by default. Since this is the default +behavior, you would only need to do this if @code{export} had been used +by itself earlier (in an included makefile, perhaps). You +@strong{cannot} use @code{export} and @code{unexport} by themselves to +have variables exported for some recipes and not for others. The last +@code{export} or @code{unexport} directive that appears by itself +determines the behavior for the entire run of @code{make}.@refill + +@vindex MAKELEVEL +@cindex recursion, level of +As a special feature, the variable @code{MAKELEVEL} is changed when it +is passed down from level to level. This variable's value is a string +which is the depth of the level as a decimal number. The value is +@samp{0} for the top-level @code{make}; @samp{1} for a sub-@code{make}, +@samp{2} for a sub-sub-@code{make}, and so on. The incrementation +happens when @code{make} sets up the environment for a recipe.@refill + +The main use of @code{MAKELEVEL} is to test it in a conditional +directive (@pxref{Conditionals, ,Conditional Parts of Makefiles}); this +way you can write a makefile that behaves one way if run recursively and +another way if run directly by you.@refill + +@vindex MAKEFILES +You can use the variable @code{MAKEFILES} to cause all sub-@code{make} +commands to use additional makefiles. The value of @code{MAKEFILES} is +a whitespace-separated list of file names. This variable, if defined in +the outer-level makefile, is passed down through the environment; then +it serves as a list of extra makefiles for the sub-@code{make} to read +before the usual or specified ones. @xref{MAKEFILES Variable, ,The +Variable @code{MAKEFILES}}.@refill + +@node Options/Recursion, -w Option, Variables/Recursion, Recursion +@subsection Communicating Options to a Sub-@code{make} +@cindex options, and recursion +@cindex recursion, and options + +@vindex MAKEFLAGS +Flags such as @samp{-s} and @samp{-k} are passed automatically to the +sub-@code{make} through the variable @code{MAKEFLAGS}. This variable is +set up automatically by @code{make} to contain the flag letters that +@code{make} received. Thus, if you do @w{@samp{make -ks}} then +@code{MAKEFLAGS} gets the value @samp{ks}.@refill + +As a consequence, every sub-@code{make} gets a value for @code{MAKEFLAGS} +in its environment. In response, it takes the flags from that value and +processes them as if they had been given as arguments. +@xref{Options Summary, ,Summary of Options}. + +@cindex command line variable definitions, and recursion +@cindex variables, command line, and recursion +@cindex recursion, and command line variable definitions +Likewise variables defined on the command line are passed to the +sub-@code{make} through @code{MAKEFLAGS}. Words in the value of +@code{MAKEFLAGS} that contain @samp{=}, @code{make} treats as variable +definitions just as if they appeared on the command line. +@xref{Overriding, ,Overriding Variables}. + +@cindex @code{-C}, and recursion +@cindex @code{-f}, and recursion +@cindex @code{-o}, and recursion +@cindex @code{-W}, and recursion +@cindex @code{--directory}, and recursion +@cindex @code{--file}, and recursion +@cindex @code{--old-file}, and recursion +@cindex @code{--assume-old}, and recursion +@cindex @code{--assume-new}, and recursion +@cindex @code{--new-file}, and recursion +@cindex recursion, and @code{-C} +@cindex recursion, and @code{-f} +@cindex recursion, and @code{-o} +@cindex recursion, and @code{-W} +The options @samp{-C}, @samp{-f}, @samp{-o}, and @samp{-W} are not put +into @code{MAKEFLAGS}; these options are not passed down.@refill + +@cindex @code{-j}, and recursion +@cindex @code{--jobs}, and recursion +@cindex recursion, and @code{-j} +@cindex job slots, and recursion +The @samp{-j} option is a special case (@pxref{Parallel, ,Parallel Execution}). +If you set it to some numeric value @samp{N} and your operating system +supports it (most any UNIX system will; others typically won't), the +parent @code{make} and all the sub-@code{make}s will communicate to +ensure that there are only @samp{N} jobs running at the same time +between them all. Note that any job that is marked recursive +(@pxref{Instead of Execution, ,Instead of Executing Recipes}) +doesn't count against the total jobs (otherwise we could get @samp{N} +sub-@code{make}s running and have no slots left over for any real work!) + +If your operating system doesn't support the above communication, then +@samp{-j 1} is always put into @code{MAKEFLAGS} instead of the value you +specified. This is because if the @w{@samp{-j}} option were passed down +to sub-@code{make}s, you would get many more jobs running in parallel +than you asked for. If you give @samp{-j} with no numeric argument, +meaning to run as many jobs as possible in parallel, this is passed +down, since multiple infinities are no more than one.@refill + +If you do not want to pass the other flags down, you must change the +value of @code{MAKEFLAGS}, like this: + +@example +subsystem: + cd subdir && $(MAKE) MAKEFLAGS= +@end example + +@vindex MAKEOVERRIDES +The command line variable definitions really appear in the variable +@code{MAKEOVERRIDES}, and @code{MAKEFLAGS} contains a reference to this +variable. If you do want to pass flags down normally, but don't want to +pass down the command line variable definitions, you can reset +@code{MAKEOVERRIDES} to empty, like this: + +@example +MAKEOVERRIDES = +@end example + +@noindent +@cindex Arg list too long +@cindex E2BIG +This is not usually useful to do. However, some systems have a small +fixed limit on the size of the environment, and putting so much +information into the value of @code{MAKEFLAGS} can exceed it. If you +see the error message @samp{Arg list too long}, this may be the problem. +@findex .POSIX +@cindex POSIX.2 +(For strict compliance with POSIX.2, changing @code{MAKEOVERRIDES} does +not affect @code{MAKEFLAGS} if the special target @samp{.POSIX} appears +in the makefile. You probably do not care about this.) + +@vindex MFLAGS +A similar variable @code{MFLAGS} exists also, for historical +compatibility. It has the same value as @code{MAKEFLAGS} except that it +does not contain the command line variable definitions, and it always +begins with a hyphen unless it is empty (@code{MAKEFLAGS} begins with a +hyphen only when it begins with an option that has no single-letter +version, such as @samp{--warn-undefined-variables}). @code{MFLAGS} was +traditionally used explicitly in the recursive @code{make} command, like +this: + +@example +subsystem: + cd subdir && $(MAKE) $(MFLAGS) +@end example + +@noindent +but now @code{MAKEFLAGS} makes this usage redundant. If you want your +makefiles to be compatible with old @code{make} programs, use this +technique; it will work fine with more modern @code{make} versions too. + +@cindex setting options from environment +@cindex options, setting from environment +@cindex setting options in makefiles +@cindex options, setting in makefiles +The @code{MAKEFLAGS} variable can also be useful if you want to have +certain options, such as @samp{-k} (@pxref{Options Summary, ,Summary of +Options}), set each time you run @code{make}. You simply put a value for +@code{MAKEFLAGS} in your environment. You can also set @code{MAKEFLAGS} in +a makefile, to specify additional flags that should also be in effect for +that makefile. (Note that you cannot use @code{MFLAGS} this way. That +variable is set only for compatibility; @code{make} does not interpret a +value you set for it in any way.) + +When @code{make} interprets the value of @code{MAKEFLAGS} (either from the +environment or from a makefile), it first prepends a hyphen if the value +does not already begin with one. Then it chops the value into words +separated by blanks, and parses these words as if they were options given +on the command line (except that @samp{-C}, @samp{-f}, @samp{-h}, +@samp{-o}, @samp{-W}, and their long-named versions are ignored; and there +is no error for an invalid option). + +If you do put @code{MAKEFLAGS} in your environment, you should be sure not +to include any options that will drastically affect the actions of +@code{make} and undermine the purpose of makefiles and of @code{make} +itself. For instance, the @samp{-t}, @samp{-n}, and @samp{-q} options, if +put in one of these variables, could have disastrous consequences and would +certainly have at least surprising and probably annoying effects.@refill + +@node -w Option, , Options/Recursion, Recursion +@subsection The @samp{--print-directory} Option +@cindex directories, printing them +@cindex printing directories +@cindex recursion, and printing directories + +If you use several levels of recursive @code{make} invocations, the +@samp{-w} or @w{@samp{--print-directory}} option can make the output a +lot easier to understand by showing each directory as @code{make} +starts processing it and as @code{make} finishes processing it. For +example, if @samp{make -w} is run in the directory @file{/u/gnu/make}, +@code{make} will print a line of the form:@refill + +@example +make: Entering directory `/u/gnu/make'. +@end example + +@noindent +before doing anything else, and a line of the form: + +@example +make: Leaving directory `/u/gnu/make'. +@end example + +@noindent +when processing is completed. + +@cindex @code{-C}, and @code{-w} +@cindex @code{--directory}, and @code{--print-directory} +@cindex recursion, and @code{-w} +@cindex @code{-w}, and @code{-C} +@cindex @code{-w}, and recursion +@cindex @code{--print-directory}, and @code{--directory} +@cindex @code{--print-directory}, and recursion +@cindex @code{--no-print-directory} +@cindex @code{--print-directory}, disabling +@cindex @code{-w}, disabling +Normally, you do not need to specify this option because @samp{make} +does it for you: @samp{-w} is turned on automatically when you use the +@samp{-C} option, and in sub-@code{make}s. @code{make} will not +automatically turn on @samp{-w} if you also use @samp{-s}, which says to +be silent, or if you use @samp{--no-print-directory} to explicitly +disable it. + +@node Canned Recipes, Empty Recipes, Recursion, Recipes +@section Defining Canned Recipes +@cindex canned recipes +@cindex recipes, canned +@cindex sequences of commands +@cindex commands, sequences of + +When the same sequence of commands is useful in making various +targets, you can define it as a canned sequence with the @code{define} +directive, and refer to the canned sequence from the recipes for those +targets. The canned sequence is actually a variable, so the name must +not conflict with other variable names. + +Here is an example of defining a canned recipe: + +@example +define run-yacc = +yacc $(firstword $^) +mv y.tab.c $@@ +endef +@end example +@cindex @code{yacc} + +@noindent +Here @code{run-yacc} is the name of the variable being defined; +@code{endef} marks the end of the definition; the lines in between are the +commands. The @code{define} directive does not expand variable references +and function calls in the canned sequence; the @samp{$} characters, +parentheses, variable names, and so on, all become part of the value of the +variable you are defining. +@xref{Multi-Line, ,Defining Multi-Line Variables}, +for a complete explanation of @code{define}. + +The first command in this example runs Yacc on the first prerequisite of +whichever rule uses the canned sequence. The output file from Yacc is +always named @file{y.tab.c}. The second command moves the output to the +rule's target file name. + +To use the canned sequence, substitute the variable into the recipe of a +rule. You can substitute it like any other variable +(@pxref{Reference, ,Basics of Variable References}). +Because variables defined by @code{define} are recursively expanded +variables, all the variable references you wrote inside the @code{define} +are expanded now. For example: + +@example +foo.c : foo.y + $(run-yacc) +@end example + +@noindent +@samp{foo.y} will be substituted for the variable @samp{$^} when it occurs in +@code{run-yacc}'s value, and @samp{foo.c} for @samp{$@@}.@refill + +This is a realistic example, but this particular one is not needed in +practice because @code{make} has an implicit rule to figure out these +commands based on the file names involved +(@pxref{Implicit Rules, ,Using Implicit Rules}). + +@cindex @@, and @code{define} +@cindex -, and @code{define} +@cindex +, and @code{define} +In recipe execution, each line of a canned sequence is treated just as +if the line appeared on its own in the rule, preceded by a tab. In +particular, @code{make} invokes a separate subshell for each line. You +can use the special prefix characters that affect command lines +(@samp{@@}, @samp{-}, and @samp{+}) on each line of a canned sequence. +@xref{Recipes, ,Writing Recipes in Rules}. +For example, using this canned sequence: + +@example +define frobnicate = +@@echo "frobnicating target $@@" +frob-step-1 $< -o $@@-step-1 +frob-step-2 $@@-step-1 -o $@@ +endef +@end example + +@noindent +@code{make} will not echo the first line, the @code{echo} command. +But it @emph{will} echo the following two recipe lines. + +On the other hand, prefix characters on the recipe line that refers to +a canned sequence apply to every line in the sequence. So the rule: + +@example +frob.out: frob.in + @@$(frobnicate) +@end example + +@noindent +does not echo @emph{any} recipe lines. +(@xref{Echoing, ,Recipe Echoing}, for a full explanation of @samp{@@}.) + +@node Empty Recipes, , Canned Recipes, Recipes +@section Using Empty Recipes +@cindex empty recipes +@cindex recipes, empty + +It is sometimes useful to define recipes which do nothing. This is done +simply by giving a recipe that consists of nothing but whitespace. For +example: + +@example +target: ; +@end example + +@noindent +defines an empty recipe for @file{target}. You could also use a line +beginning with a recipe prefix character to define an empty recipe, +but this would be confusing because such a line looks empty. + +@findex .DEFAULT@r{, and empty recipes} +You may be wondering why you would want to define a recipe that +does nothing. The only reason this is useful is to prevent a target +from getting implicit recipes (from implicit rules or the +@code{.DEFAULT} special target; @pxref{Implicit Rules} and +@pxref{Last Resort, ,Defining Last-Resort Default Rules}).@refill + +@c !!! another reason is for canonical stamp files: +@ignore +@example +foo: stamp-foo ; +stamp-foo: foo.in + create foo frm foo.in + touch $@ +@end example +@end ignore + +You may be inclined to define empty recipes for targets that are +not actual files, but only exist so that their prerequisites can be +remade. However, this is not the best way to do that, because the +prerequisites may not be remade properly if the target file actually does exist. +@xref{Phony Targets, ,Phony Targets}, for a better way to do this. + +@node Using Variables, Conditionals, Recipes, Top +@chapter How to Use Variables +@cindex variable +@cindex value +@cindex recursive variable expansion +@cindex simple variable expansion + +A @dfn{variable} is a name defined in a makefile to represent a string +of text, called the variable's @dfn{value}. These values are +substituted by explicit request into targets, prerequisites, recipes, +and other parts of the makefile. (In some other versions of @code{make}, +variables are called @dfn{macros}.) +@cindex macro + +Variables and functions in all parts of a makefile are expanded when +read, except for in recipes, the right-hand sides of variable +definitions using @samp{=}, and the bodies of variable definitions +using the @code{define} directive.@refill + +Variables can represent lists of file names, options to pass to compilers, +programs to run, directories to look in for source files, directories to +write output in, or anything else you can imagine. + +A variable name may be any sequence of characters not containing @samp{:}, +@samp{#}, @samp{=}, or leading or trailing whitespace. However, +variable names containing characters other than letters, numbers, and +underscores should be avoided, as they may be given special meanings in the +future, and with some shells they cannot be passed through the environment to a +sub-@code{make} +(@pxref{Variables/Recursion, ,Communicating Variables to a Sub-@code{make}}). + +Variable names are case-sensitive. The names @samp{foo}, @samp{FOO}, +and @samp{Foo} all refer to different variables. + +It is traditional to use upper case letters in variable names, but we +recommend using lower case letters for variable names that serve internal +purposes in the makefile, and reserving upper case for parameters that +control implicit rules or for parameters that the user should override with +command options (@pxref{Overriding, ,Overriding Variables}). + +A few variables have names that are a single punctuation character or +just a few characters. These are the @dfn{automatic variables}, and +they have particular specialized uses. @xref{Automatic Variables}. + +@menu +* Reference:: How to use the value of a variable. +* Flavors:: Variables come in two flavors. +* Advanced:: Advanced features for referencing a variable. +* Values:: All the ways variables get their values. +* Setting:: How to set a variable in the makefile. +* Appending:: How to append more text to the old value + of a variable. +* Override Directive:: How to set a variable in the makefile even if + the user has set it with a command argument. +* Multi-Line:: An alternate way to set a variable + to a multi-line string. +* Undefine Directive:: How to undefine a variable so that it appears + as if it was never set. +* Environment:: Variable values can come from the environment. +* Target-specific:: Variable values can be defined on a per-target + basis. +* Pattern-specific:: Target-specific variable values can be applied + to a group of targets that match a pattern. +* Suppressing Inheritance:: Suppress inheritance of variables. +* Special Variables:: Variables with special meaning or behavior. +@end menu + +@node Reference, Flavors, Using Variables, Using Variables +@section Basics of Variable References +@cindex variables, how to reference +@cindex reference to variables +@cindex @code{$}, in variable reference +@cindex dollar sign (@code{$}), in variable reference + +To substitute a variable's value, write a dollar sign followed by the name +of the variable in parentheses or braces: either @samp{$(foo)} or +@samp{$@{foo@}} is a valid reference to the variable @code{foo}. This +special significance of @samp{$} is why you must write @samp{$$} to have +the effect of a single dollar sign in a file name or recipe. + +Variable references can be used in any context: targets, prerequisites, +recipes, most directives, and new variable values. Here is an +example of a common case, where a variable holds the names of all the +object files in a program: + +@example +@group +objects = program.o foo.o utils.o +program : $(objects) + cc -o program $(objects) + +$(objects) : defs.h +@end group +@end example + +Variable references work by strict textual substitution. Thus, the rule + +@example +@group +foo = c +prog.o : prog.$(foo) + $(foo)$(foo) -$(foo) prog.$(foo) +@end group +@end example + +@noindent +could be used to compile a C program @file{prog.c}. Since spaces before +the variable value are ignored in variable assignments, the value of +@code{foo} is precisely @samp{c}. (Don't actually write your makefiles +this way!) + +A dollar sign followed by a character other than a dollar sign, +open-parenthesis or open-brace treats that single character as the +variable name. Thus, you could reference the variable @code{x} with +@samp{$x}. However, this practice is strongly discouraged, except in +the case of the automatic variables (@pxref{Automatic Variables}). + +@node Flavors, Advanced, Reference, Using Variables +@section The Two Flavors of Variables +@cindex flavors of variables +@cindex recursive variable expansion +@cindex variables, flavors +@cindex recursively expanded variables +@cindex variables, recursively expanded + +There are two ways that a variable in GNU @code{make} can have a value; +we call them the two @dfn{flavors} of variables. The two flavors are +distinguished in how they are defined and in what they do when expanded. + +@cindex = +The first flavor of variable is a @dfn{recursively expanded} variable. +Variables of this sort are defined by lines using @samp{=} +(@pxref{Setting, ,Setting Variables}) or by the @code{define} directive +(@pxref{Multi-Line, ,Defining Multi-Line Variables}). The value you specify +is installed verbatim; if it contains references to other variables, +these references are expanded whenever this variable is substituted (in +the course of expanding some other string). When this happens, it is +called @dfn{recursive expansion}.@refill + +For example, + +@example +foo = $(bar) +bar = $(ugh) +ugh = Huh? + +all:;echo $(foo) +@end example + +@noindent +will echo @samp{Huh?}: @samp{$(foo)} expands to @samp{$(bar)} which +expands to @samp{$(ugh)} which finally expands to @samp{Huh?}.@refill + +This flavor of variable is the only sort supported by other versions of +@code{make}. It has its advantages and its disadvantages. An advantage +(most would say) is that: + +@example +CFLAGS = $(include_dirs) -O +include_dirs = -Ifoo -Ibar +@end example + +@noindent +will do what was intended: when @samp{CFLAGS} is expanded in a recipe, +it will expand to @samp{-Ifoo -Ibar -O}. A major disadvantage is that you +cannot append something on the end of a variable, as in + +@example +CFLAGS = $(CFLAGS) -O +@end example + +@noindent +because it will cause an infinite loop in the variable expansion. +(Actually @code{make} detects the infinite loop and reports an error.) +@cindex loops in variable expansion +@cindex variables, loops in expansion + +Another disadvantage is that any functions +(@pxref{Functions, ,Functions for Transforming Text}) +referenced in the definition will be executed every time the variable is +expanded. This makes @code{make} run slower; worse, it causes the +@code{wildcard} and @code{shell} functions to give unpredictable results +because you cannot easily control when they are called, or even how many +times. + +To avoid all the problems and inconveniences of recursively expanded +variables, there is another flavor: simply expanded variables. + +@cindex simply expanded variables +@cindex variables, simply expanded +@cindex := +@dfn{Simply expanded variables} are defined by lines using @samp{:=} +(@pxref{Setting, ,Setting Variables}). +The value of a simply expanded variable is scanned +once and for all, expanding any references to other variables and +functions, when the variable is defined. The actual value of the simply +expanded variable is the result of expanding the text that you write. +It does not contain any references to other variables; it contains their +values @emph{as of the time this variable was defined}. Therefore, + +@example +x := foo +y := $(x) bar +x := later +@end example + +@noindent +is equivalent to + +@example +y := foo bar +x := later +@end example + +When a simply expanded variable is referenced, its value is substituted +verbatim. + +Here is a somewhat more complicated example, illustrating the use of +@samp{:=} in conjunction with the @code{shell} function. +(@xref{Shell Function, , The @code{shell} Function}.) This example +also shows use of the variable @code{MAKELEVEL}, which is changed +when it is passed down from level to level. +(@xref{Variables/Recursion, , Communicating Variables to a +Sub-@code{make}}, for information about @code{MAKELEVEL}.) + +@vindex MAKELEVEL +@vindex MAKE +@example +@group +ifeq (0,$@{MAKELEVEL@}) +whoami := $(shell whoami) +host-type := $(shell arch) +MAKE := $@{MAKE@} host-type=$@{host-type@} whoami=$@{whoami@} +endif +@end group +@end example + +@noindent +An advantage of this use of @samp{:=} is that a typical +`descend into a directory' recipe then looks like this: + +@example +@group +$@{subdirs@}: + $@{MAKE@} -C $@@ all +@end group +@end example + +Simply expanded variables generally make complicated makefile programming +more predictable because they work like variables in most programming +languages. They allow you to redefine a variable using its own value (or +its value processed in some way by one of the expansion functions) and to +use the expansion functions much more efficiently +(@pxref{Functions, ,Functions for Transforming Text}). + +@cindex spaces, in variable values +@cindex whitespace, in variable values +@cindex variables, spaces in values +You can also use them to introduce controlled leading whitespace into +variable values. Leading whitespace characters are discarded from your +input before substitution of variable references and function calls; +this means you can include leading spaces in a variable value by +protecting them with variable references, like this: + +@example +nullstring := +space := $(nullstring) # end of the line +@end example + +@noindent +Here the value of the variable @code{space} is precisely one space. The +comment @w{@samp{# end of the line}} is included here just for clarity. +Since trailing space characters are @emph{not} stripped from variable +values, just a space at the end of the line would have the same effect +(but be rather hard to read). If you put whitespace at the end of a +variable value, it is a good idea to put a comment like that at the end +of the line to make your intent clear. Conversely, if you do @emph{not} +want any whitespace characters at the end of your variable value, you +must remember not to put a random comment on the end of the line after +some whitespace, such as this: + +@example +dir := /foo/bar # directory to put the frobs in +@end example + +@noindent +Here the value of the variable @code{dir} is @w{@samp{/foo/bar }} +(with four trailing spaces), which was probably not the intention. +(Imagine something like @w{@samp{$(dir)/file}} with this definition!) + +@cindex conditional variable assignment +@cindex variables, conditional assignment +@cindex ?= +There is another assignment operator for variables, @samp{?=}. This +is called a conditional variable assignment operator, because it only +has an effect if the variable is not yet defined. This statement: + +@example +FOO ?= bar +@end example + +@noindent +is exactly equivalent to this +(@pxref{Origin Function, ,The @code{origin} Function}): + +@example +ifeq ($(origin FOO), undefined) + FOO = bar +endif +@end example + +Note that a variable set to an empty value is still defined, so +@samp{?=} will not set that variable. + +@node Advanced, Values, Flavors, Using Variables +@section Advanced Features for Reference to Variables +@cindex reference to variables + +This section describes some advanced features you can use to reference +variables in more flexible ways. + +@menu +* Substitution Refs:: Referencing a variable with + substitutions on the value. +* Computed Names:: Computing the name of the variable to refer to. +@end menu + +@node Substitution Refs, Computed Names, Advanced, Advanced +@subsection Substitution References +@cindex modified variable reference +@cindex substitution variable reference +@cindex variables, modified reference +@cindex variables, substitution reference + +@cindex variables, substituting suffix in +@cindex suffix, substituting in variables +A @dfn{substitution reference} substitutes the value of a variable with +alterations that you specify. It has the form +@samp{$(@var{var}:@var{a}=@var{b})} (or +@samp{$@{@var{var}:@var{a}=@var{b}@}}) and its meaning is to take the value +of the variable @var{var}, replace every @var{a} at the end of a word with +@var{b} in that value, and substitute the resulting string. + +When we say ``at the end of a word'', we mean that @var{a} must appear +either followed by whitespace or at the end of the value in order to be +replaced; other occurrences of @var{a} in the value are unaltered. For +example:@refill + +@example +foo := a.o b.o c.o +bar := $(foo:.o=.c) +@end example + +@noindent +sets @samp{bar} to @samp{a.c b.c c.c}. @xref{Setting, ,Setting Variables}. + +A substitution reference is actually an abbreviation for use of the +@code{patsubst} expansion function (@pxref{Text Functions, ,Functions for String Substitution and Analysis}). We provide +substitution references as well as @code{patsubst} for compatibility with +other implementations of @code{make}. + +@findex patsubst +Another type of substitution reference lets you use the full power of +the @code{patsubst} function. It has the same form +@samp{$(@var{var}:@var{a}=@var{b})} described above, except that now +@var{a} must contain a single @samp{%} character. This case is +equivalent to @samp{$(patsubst @var{a},@var{b},$(@var{var}))}. +@xref{Text Functions, ,Functions for String Substitution and Analysis}, +for a description of the @code{patsubst} function.@refill + +@example +@group +@exdent For example: + +foo := a.o b.o c.o +bar := $(foo:%.o=%.c) +@end group +@end example + +@noindent +sets @samp{bar} to @samp{a.c b.c c.c}. + +@node Computed Names, , Substitution Refs, Advanced +@subsection Computed Variable Names +@cindex nested variable reference +@cindex computed variable name +@cindex variables, computed names +@cindex variables, nested references +@cindex variables, @samp{$} in name +@cindex @code{$}, in variable name +@cindex dollar sign (@code{$}), in variable name + +Computed variable names are a complicated concept needed only for +sophisticated makefile programming. For most purposes you need not +consider them, except to know that making a variable with a dollar sign +in its name might have strange results. However, if you are the type +that wants to understand everything, or you are actually interested in +what they do, read on. + +Variables may be referenced inside the name of a variable. This is +called a @dfn{computed variable name} or a @dfn{nested variable +reference}. For example, + +@example +x = y +y = z +a := $($(x)) +@end example + +@noindent +defines @code{a} as @samp{z}: the @samp{$(x)} inside @samp{$($(x))} expands +to @samp{y}, so @samp{$($(x))} expands to @samp{$(y)} which in turn expands +to @samp{z}. Here the name of the variable to reference is not stated +explicitly; it is computed by expansion of @samp{$(x)}. The reference +@samp{$(x)} here is nested within the outer variable reference. + +The previous example shows two levels of nesting, but any number of levels +is possible. For example, here are three levels: + +@example +x = y +y = z +z = u +a := $($($(x))) +@end example + +@noindent +Here the innermost @samp{$(x)} expands to @samp{y}, so @samp{$($(x))} +expands to @samp{$(y)} which in turn expands to @samp{z}; now we have +@samp{$(z)}, which becomes @samp{u}. + +References to recursively-expanded variables within a variable name are +reexpanded in the usual fashion. For example: + +@example +x = $(y) +y = z +z = Hello +a := $($(x)) +@end example + +@noindent +defines @code{a} as @samp{Hello}: @samp{$($(x))} becomes @samp{$($(y))} +which becomes @samp{$(z)} which becomes @samp{Hello}. + +Nested variable references can also contain modified references and +function invocations (@pxref{Functions, ,Functions for Transforming Text}), +just like any other reference. +For example, using the @code{subst} function +(@pxref{Text Functions, ,Functions for String Substitution and Analysis}): + +@example +@group +x = variable1 +variable2 := Hello +y = $(subst 1,2,$(x)) +z = y +a := $($($(z))) +@end group +@end example + +@noindent +eventually defines @code{a} as @samp{Hello}. It is doubtful that anyone +would ever want to write a nested reference as convoluted as this one, but +it works: @samp{$($($(z)))} expands to @samp{$($(y))} which becomes +@samp{$($(subst 1,2,$(x)))}. This gets the value @samp{variable1} from +@code{x} and changes it by substitution to @samp{variable2}, so that the +entire string becomes @samp{$(variable2)}, a simple variable reference +whose value is @samp{Hello}.@refill + +A computed variable name need not consist entirely of a single variable +reference. It can contain several variable references, as well as some +invariant text. For example, + +@example +@group +a_dirs := dira dirb +1_dirs := dir1 dir2 +@end group + +@group +a_files := filea fileb +1_files := file1 file2 +@end group + +@group +ifeq "$(use_a)" "yes" +a1 := a +else +a1 := 1 +endif +@end group + +@group +ifeq "$(use_dirs)" "yes" +df := dirs +else +df := files +endif + +dirs := $($(a1)_$(df)) +@end group +@end example + +@noindent +will give @code{dirs} the same value as @code{a_dirs}, @code{1_dirs}, +@code{a_files} or @code{1_files} depending on the settings of @code{use_a} +and @code{use_dirs}.@refill + +Computed variable names can also be used in substitution references: + +@example +@group +a_objects := a.o b.o c.o +1_objects := 1.o 2.o 3.o + +sources := $($(a1)_objects:.o=.c) +@end group +@end example + +@noindent +defines @code{sources} as either @samp{a.c b.c c.c} or @samp{1.c 2.c 3.c}, +depending on the value of @code{a1}. + +The only restriction on this sort of use of nested variable references +is that they cannot specify part of the name of a function to be called. +This is because the test for a recognized function name is done before +the expansion of nested references. For example, + +@example +@group +ifdef do_sort +func := sort +else +func := strip +endif +@end group + +@group +bar := a d b g q c +@end group + +@group +foo := $($(func) $(bar)) +@end group +@end example + +@noindent +attempts to give @samp{foo} the value of the variable @samp{sort a d b g +q c} or @samp{strip a d b g q c}, rather than giving @samp{a d b g q c} +as the argument to either the @code{sort} or the @code{strip} function. +This restriction could be removed in the future if that change is shown +to be a good idea. + +You can also use computed variable names in the left-hand side of a +variable assignment, or in a @code{define} directive, as in: + +@example +dir = foo +$(dir)_sources := $(wildcard $(dir)/*.c) +define $(dir)_print = +lpr $($(dir)_sources) +endef +@end example + +@noindent +This example defines the variables @samp{dir}, @samp{foo_sources}, and +@samp{foo_print}. + +Note that @dfn{nested variable references} are quite different from +@dfn{recursively expanded variables} +(@pxref{Flavors, ,The Two Flavors of Variables}), though both are +used together in complex ways when doing makefile programming.@refill + +@node Values, Setting, Advanced, Using Variables +@section How Variables Get Their Values +@cindex variables, how they get their values +@cindex value, how a variable gets it + +Variables can get values in several different ways: + +@itemize @bullet +@item +You can specify an overriding value when you run @code{make}. +@xref{Overriding, ,Overriding Variables}. + +@item +You can specify a value in the makefile, either +with an assignment (@pxref{Setting, ,Setting Variables}) or with a +verbatim definition (@pxref{Multi-Line, ,Defining Multi-Line Variables}).@refill + +@item +Variables in the environment become @code{make} variables. +@xref{Environment, ,Variables from the Environment}. + +@item +Several @dfn{automatic} variables are given new values for each rule. +Each of these has a single conventional use. +@xref{Automatic Variables}. + +@item +Several variables have constant initial values. +@xref{Implicit Variables, ,Variables Used by Implicit Rules}. +@end itemize + +@node Setting, Appending, Values, Using Variables +@section Setting Variables +@cindex setting variables +@cindex variables, setting +@cindex = +@cindex := +@cindex ?= + +To set a variable from the makefile, write a line starting with the +variable name followed by @samp{=} or @samp{:=}. Whatever follows the +@samp{=} or @samp{:=} on the line becomes the value. For example, + +@example +objects = main.o foo.o bar.o utils.o +@end example + +@noindent +defines a variable named @code{objects}. Whitespace around the variable +name and immediately after the @samp{=} is ignored. + +Variables defined with @samp{=} are @dfn{recursively expanded} variables. +Variables defined with @samp{:=} are @dfn{simply expanded} variables; these +definitions can contain variable references which will be expanded before +the definition is made. @xref{Flavors, ,The Two Flavors of Variables}. + +The variable name may contain function and variable references, which +are expanded when the line is read to find the actual variable name to use. + +There is no limit on the length of the value of a variable except the +amount of swapping space on the computer. When a variable definition is +long, it is a good idea to break it into several lines by inserting +backslash-newline at convenient places in the definition. This will not +affect the functioning of @code{make}, but it will make the makefile easier +to read. + +Most variable names are considered to have the empty string as a value if +you have never set them. Several variables have built-in initial values +that are not empty, but you can set them in the usual ways +(@pxref{Implicit Variables, ,Variables Used by Implicit Rules}). +Several special variables are set +automatically to a new value for each rule; these are called the +@dfn{automatic} variables (@pxref{Automatic Variables}). + +If you'd like a variable to be set to a value only if it's not already +set, then you can use the shorthand operator @samp{?=} instead of +@samp{=}. These two settings of the variable @samp{FOO} are identical +(@pxref{Origin Function, ,The @code{origin} Function}): + +@example +FOO ?= bar +@end example + +@noindent +and + +@example +ifeq ($(origin FOO), undefined) +FOO = bar +endif +@end example + +@node Appending, Override Directive, Setting, Using Variables +@section Appending More Text to Variables +@cindex += +@cindex appending to variables +@cindex variables, appending to + +Often it is useful to add more text to the value of a variable already defined. +You do this with a line containing @samp{+=}, like this: + +@example +objects += another.o +@end example + +@noindent +This takes the value of the variable @code{objects}, and adds the text +@samp{another.o} to it (preceded by a single space). Thus: + +@example +objects = main.o foo.o bar.o utils.o +objects += another.o +@end example + +@noindent +sets @code{objects} to @samp{main.o foo.o bar.o utils.o another.o}. + +Using @samp{+=} is similar to: + +@example +objects = main.o foo.o bar.o utils.o +objects := $(objects) another.o +@end example + +@noindent +but differs in ways that become important when you use more complex values. + +When the variable in question has not been defined before, @samp{+=} +acts just like normal @samp{=}: it defines a recursively-expanded +variable. However, when there @emph{is} a previous definition, exactly +what @samp{+=} does depends on what flavor of variable you defined +originally. @xref{Flavors, ,The Two Flavors of Variables}, for an +explanation of the two flavors of variables. + +When you add to a variable's value with @samp{+=}, @code{make} acts +essentially as if you had included the extra text in the initial +definition of the variable. If you defined it first with @samp{:=}, +making it a simply-expanded variable, @samp{+=} adds to that +simply-expanded definition, and expands the new text before appending it +to the old value just as @samp{:=} does +(see @ref{Setting, ,Setting Variables}, for a full explanation of @samp{:=}). +In fact, + +@example +variable := value +variable += more +@end example + +@noindent +is exactly equivalent to: + +@noindent +@example +variable := value +variable := $(variable) more +@end example + +On the other hand, when you use @samp{+=} with a variable that you defined +first to be recursively-expanded using plain @samp{=}, @code{make} does +something a bit different. Recall that when you define a +recursively-expanded variable, @code{make} does not expand the value you set +for variable and function references immediately. Instead it stores the text +verbatim, and saves these variable and function references to be expanded +later, when you refer to the new variable (@pxref{Flavors, ,The Two Flavors +of Variables}). When you use @samp{+=} on a recursively-expanded variable, +it is this unexpanded text to which @code{make} appends the new text you +specify. + +@example +@group +variable = value +variable += more +@end group +@end example + +@noindent +is roughly equivalent to: + +@example +@group +temp = value +variable = $(temp) more +@end group +@end example + +@noindent +except that of course it never defines a variable called @code{temp}. +The importance of this comes when the variable's old value contains +variable references. Take this common example: + +@example +CFLAGS = $(includes) -O +@dots{} +CFLAGS += -pg # enable profiling +@end example + +@noindent +The first line defines the @code{CFLAGS} variable with a reference to another +variable, @code{includes}. (@code{CFLAGS} is used by the rules for C +compilation; @pxref{Catalogue of Rules, ,Catalogue of Implicit Rules}.) +Using @samp{=} for the definition makes @code{CFLAGS} a recursively-expanded +variable, meaning @w{@samp{$(includes) -O}} is @emph{not} expanded when +@code{make} processes the definition of @code{CFLAGS}. Thus, @code{includes} +need not be defined yet for its value to take effect. It only has to be +defined before any reference to @code{CFLAGS}. If we tried to append to the +value of @code{CFLAGS} without using @samp{+=}, we might do it like this: + +@example +CFLAGS := $(CFLAGS) -pg # enable profiling +@end example + +@noindent +This is pretty close, but not quite what we want. Using @samp{:=} +redefines @code{CFLAGS} as a simply-expanded variable; this means +@code{make} expands the text @w{@samp{$(CFLAGS) -pg}} before setting the +variable. If @code{includes} is not yet defined, we get @w{@samp{ -O +-pg}}, and a later definition of @code{includes} will have no effect. +Conversely, by using @samp{+=} we set @code{CFLAGS} to the +@emph{unexpanded} value @w{@samp{$(includes) -O -pg}}. Thus we preserve +the reference to @code{includes}, so if that variable gets defined at +any later point, a reference like @samp{$(CFLAGS)} still uses its +value. + +@node Override Directive, Multi-Line, Appending, Using Variables +@section The @code{override} Directive +@findex override +@cindex overriding with @code{override} +@cindex variables, overriding + +If a variable has been set with a command argument +(@pxref{Overriding, ,Overriding Variables}), +then ordinary assignments in the makefile are ignored. If you want to set +the variable in the makefile even though it was set with a command +argument, you can use an @code{override} directive, which is a line that +looks like this:@refill + +@example +override @var{variable} = @var{value} +@end example + +@noindent +or + +@example +override @var{variable} := @var{value} +@end example + +To append more text to a variable defined on the command line, use: + +@example +override @var{variable} += @var{more text} +@end example + +@noindent +@xref{Appending, ,Appending More Text to Variables}. + +Variable assignments marked with the @code{override} flag have a +higher priority than all other assignments, except another +@code{override}. Subsequent assignments or appends to this variable +which are not marked @code{override} will be ignored. + +The @code{override} directive was not invented for escalation in the war +between makefiles and command arguments. It was invented so you can alter +and add to values that the user specifies with command arguments. + +For example, suppose you always want the @samp{-g} switch when you run the +C compiler, but you would like to allow the user to specify the other +switches with a command argument just as usual. You could use this +@code{override} directive: + +@example +override CFLAGS += -g +@end example + +You can also use @code{override} directives with @code{define} directives. +This is done as you might expect: + +@example +override define foo = +bar +endef +@end example + +@noindent +@iftex +See the next section for information about @code{define}. +@end iftex +@ifnottex +@xref{Multi-Line, ,Defining Multi-Line Variables}. +@end ifnottex + +@node Multi-Line, Undefine Directive, Override Directive, Using Variables +@section Defining Multi-Line Variables +@findex define +@findex endef +@cindex multi-line variable definition +@cindex variables, multi-line +@cindex verbatim variable definition +@cindex defining variables verbatim +@cindex variables, defining verbatim + +Another way to set the value of a variable is to use the @code{define} +directive. This directive has an unusual syntax which allows newline +characters to be included in the value, which is convenient for +defining both canned sequences of commands (@pxref{Canned Recipes, +,Defining Canned Recipes}), and also sections of makefile syntax to +use with @code{eval} (@pxref{Eval Function}).@refill + +The @code{define} directive is followed on the same line by the name +of the variable being defined and an (optional) assignment operator, +and nothing more. The value to give the variable appears on the +following lines. The end of the value is marked by a line containing +just the word @code{endef}. Aside from this difference in syntax, +@code{define} works just like any other variable definition. The +variable name may contain function and variable references, which are +expanded when the directive is read to find the actual variable name +to use. + +You may omit the variable assignment operator if you prefer. If +omitted, @code{make} assumes it to be @samp{=} and creates a +recursively-expanded variable (@pxref{Flavors, ,The Two Flavors of Variables}). +When using a @samp{+=} operator, the value is appended to the previous +value as with any other append operation: with a single space +separating the old and new values. + +You may nest @code{define} directives: @code{make} will keep track of +nested directives and report an error if they are not all properly +closed with @code{endef}. Note that lines beginning with the recipe +prefix character are considered part of a recipe, so any @code{define} +or @code{endef} strings appearing on such a line will not be +considered @code{make} directives. + +@example +define two-lines = +echo foo +echo $(bar) +endef +@end example + +The value in an ordinary assignment cannot contain a newline; but the +newlines that separate the lines of the value in a @code{define} become +part of the variable's value (except for the final newline which precedes +the @code{endef} and is not considered part of the value).@refill + +@need 800 +When used in a recipe, the previous example is functionally equivalent +to this: + +@example +two-lines = echo foo; echo $(bar) +@end example + +@noindent +since two commands separated by semicolon behave much like two separate +shell commands. However, note that using two separate lines means +@code{make} will invoke the shell twice, running an independent subshell +for each line. @xref{Execution, ,Recipe Execution}. + +If you want variable definitions made with @code{define} to take +precedence over command-line variable definitions, you can use the +@code{override} directive together with @code{define}: + +@example +override define two-lines = +foo +$(bar) +endef +@end example + +@noindent +@xref{Override Directive, ,The @code{override} Directive}. + +@node Undefine Directive, Environment, Multi-Line, Using Variables +@section Undefining Variables +@findex undefine +@cindex undefining variable + +If you want to clear a variable, setting its value to empty is usually +sufficient. Expanding such a variable will yield the same result (empty +string) regardless of whether it was set or not. However, if you are +using the @code{flavor} (@pxref{Flavor Function}) and +@code{origin} (@pxref{Origin Function}) functions, there is a difference +between a variable that was never set and a variable with an empty value. +In such situations you may want to use the @code{undefine} directive to +make a variable appear as if it was never set. For example: + +@example +foo := foo +bar = bar + +undefine foo +undefine bar + +$(info $(origin foo)) +$(info $(flavor bar)) +@end example + +This example will print ``undefined'' for both variables. + +If you want to undefine a command-line variable definition, you can use +the @code{override} directive together with @code{undefine}, similar to +how this is done for variable definitions: + +@example +override undefine CFLAGS +@end example + +@node Environment, Target-specific, Undefine Directive, Using Variables +@section Variables from the Environment + +@cindex variables, environment +@cindex environment +Variables in @code{make} can come from the environment in which +@code{make} is run. Every environment variable that @code{make} sees +when it starts up is transformed into a @code{make} variable with the +same name and value. However, an explicit assignment in the makefile, +or with a command argument, overrides the environment. (If the +@samp{-e} flag is specified, then values from the environment override +assignments in the makefile. @xref{Options Summary, ,Summary of +Options}. But this is not recommended practice.) + +Thus, by setting the variable @code{CFLAGS} in your environment, you can +cause all C compilations in most makefiles to use the compiler switches you +prefer. This is safe for variables with standard or conventional meanings +because you know that no makefile will use them for other things. (Note +this is not totally reliable; some makefiles set @code{CFLAGS} explicitly +and therefore are not affected by the value in the environment.) + +When @code{make} runs a recipe, variables defined in the +makefile are placed into the environment of each shell. This allows +you to pass values to sub-@code{make} invocations (@pxref{Recursion, +,Recursive Use of @code{make}}). By default, only variables that came +from the environment or the command line are passed to recursive +invocations. You can use the @code{export} directive to pass other +variables. @xref{Variables/Recursion, , Communicating Variables to a +Sub-@code{make}}, for full details. + +Other use of variables from the environment is not recommended. It is not +wise for makefiles to depend for their functioning on environment variables +set up outside their control, since this would cause different users to get +different results from the same makefile. This is against the whole +purpose of most makefiles. + +@cindex SHELL, import from environment +Such problems would be especially likely with the variable +@code{SHELL}, which is normally present in the environment to specify +the user's choice of interactive shell. It would be very undesirable +for this choice to affect @code{make}; so, @code{make} handles the +@code{SHELL} environment variable in a special way; see @ref{Choosing +the Shell}.@refill + +@node Target-specific, Pattern-specific, Environment, Using Variables +@section Target-specific Variable Values +@cindex target-specific variables +@cindex variables, target-specific + +Variable values in @code{make} are usually global; that is, they are the +same regardless of where they are evaluated (unless they're reset, of +course). One exception to that is automatic variables +(@pxref{Automatic Variables}). + +The other exception is @dfn{target-specific variable values}. This +feature allows you to define different values for the same variable, +based on the target that @code{make} is currently building. As with +automatic variables, these values are only available within the context +of a target's recipe (and in other target-specific assignments). + +Set a target-specific variable value like this: + +@example +@var{target} @dots{} : @var{variable-assignment} +@end example + +Target-specific variable assignments can be prefixed with any or all of the +special keywords @code{export}, @code{override}, or @code{private}; +these apply their normal behavior to this instance of the variable only. + +Multiple @var{target} values create a target-specific variable value for +each member of the target list individually. + +The @var{variable-assignment} can be any valid form of assignment; +recursive (@samp{=}), static (@samp{:=}), appending (@samp{+=}), or +conditional (@samp{?=}). All variables that appear within the +@var{variable-assignment} are evaluated within the context of the +target: thus, any previously-defined target-specific variable values +will be in effect. Note that this variable is actually distinct from +any ``global'' value: the two variables do not have to have the same +flavor (recursive vs.@: static). + +Target-specific variables have the same priority as any other makefile +variable. Variables provided on the command line (and in the +environment if the @samp{-e} option is in force) will take precedence. +Specifying the @code{override} directive will allow the target-specific +variable value to be preferred. + +There is one more special feature of target-specific variables: when +you define a target-specific variable that variable value is also in +effect for all prerequisites of this target, and all their +prerequisites, etc.@: (unless those prerequisites override that variable +with their own target-specific variable value). So, for example, a +statement like this: + +@example +prog : CFLAGS = -g +prog : prog.o foo.o bar.o +@end example + +@noindent +will set @code{CFLAGS} to @samp{-g} in the recipe for @file{prog}, but +it will also set @code{CFLAGS} to @samp{-g} in the recipes that create +@file{prog.o}, @file{foo.o}, and @file{bar.o}, and any recipes which +create their prerequisites. + +Be aware that a given prerequisite will only be built once per +invocation of make, at most. If the same file is a prerequisite of +multiple targets, and each of those targets has a different value for +the same target-specific variable, then the first target to be built +will cause that prerequisite to be built and the prerequisite will +inherit the target-specific value from the first target. It will +ignore the target-specific values from any other targets. + +@node Pattern-specific, Suppressing Inheritance, Target-specific, Using Variables +@section Pattern-specific Variable Values +@cindex pattern-specific variables +@cindex variables, pattern-specific + +In addition to target-specific variable values +(@pxref{Target-specific, ,Target-specific Variable Values}), GNU +@code{make} supports pattern-specific variable values. In this form, +the variable is defined for any target that matches the pattern +specified. + +Set a pattern-specific variable value like this: + +@example +@var{pattern} @dots{} : @var{variable-assignment} +@end example +where @var{pattern} is a %-pattern. As with target-specific variable +values, multiple @var{pattern} values create a pattern-specific variable +value for each pattern individually. The @var{variable-assignment} can +be any valid form of assignment. Any command line variable setting will +take precedence, unless @code{override} is specified. + +For example: + +@example +%.o : CFLAGS = -O +@end example + +@noindent +will assign @code{CFLAGS} the value of @samp{-O} for all targets +matching the pattern @code{%.o}. + +If a target matches more than one pattern, the matching pattern-specific +variables with longer stems are interpreted first. This results in more +specific variables taking precedence over the more generic ones, for +example: + +@example +%.o: %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@@ + +lib/%.o: CFLAGS := -fPIC -g +%.o: CFLAGS := -g + +all: foo.o lib/bar.o +@end example + +In this example the first definition of the @code{CFLAGS} variable +will be used to update @file{lib/bar.o} even though the second one +also applies to this target. Pattern-specific variables which result +in the same stem length are considered in the order in which they +were defined in the makefile. + +Pattern-specific variables are searched after any target-specific +variables defined explicitly for that target, and before target-specific +variables defined for the parent target. + +@node Suppressing Inheritance, Special Variables, Pattern-specific, Using Variables +@section Suppressing Inheritance +@findex private +@cindex suppressing inheritance +@cindex inheritance, suppressing + +As described in previous sections, @code{make} variables are inherited +by prerequisites. This capability allows you to modify the behavior +of a prerequisite based on which targets caused it to be rebuilt. For +example, you might set a target-specific variable on a @code{debug} +target, then running @samp{make debug} will cause that variable to be +inherited by all prerequisites of @code{debug}, while just running +@samp{make all} (for example) would not have that assignment. + +Sometimes, however, you may not want a variable to be inherited. For +these situations, @code{make} provides the @code{private} modifier. +Although this modifier can be used with any variable assignment, it +makes the most sense with target- and pattern-specific variables. Any +variable marked @code{private} will be visible to its local target but +will not be inherited by prerequisites of that target. A global +variable marked @code{private} will be visible in the global scope but +will not be inherited by any target, and hence will not be visible +in any recipe. + +As an example, consider this makefile: +@example +EXTRA_CFLAGS = + +prog: private EXTRA_CFLAGS = -L/usr/local/lib +prog: a.o b.o +@end example + +Due to the @code{private} modifier, @code{a.o} and @code{b.o} will not +inherit the @code{EXTRA_CFLAGS} variable assignment from the +@code{progs} target. + +@node Special Variables, , Suppressing Inheritance, Using Variables +@comment node-name, next, previous, up +@section Other Special Variables +@cindex makefiles, and special variables +@cindex special variables + +GNU @code{make} supports some variables that have special properties. + +@table @code + +@vindex MAKEFILE_LIST @r{(list of parsed makefiles)} +@cindex makefiles, and @code{MAKEFILE_LIST} variable +@cindex including (@code{MAKEFILE_LIST} variable) +@item MAKEFILE_LIST +Contains the name of each makefile that is parsed by @code{make}, in +the order in which it was parsed. The name is appended just +before @code{make} begins to parse the makefile. Thus, if the first +thing a makefile does is examine the last word in this variable, it +will be the name of the current makefile. Once the current makefile +has used @code{include}, however, the last word will be the +just-included makefile. + +If a makefile named @code{Makefile} has this content: + +@example +@group +name1 := $(lastword $(MAKEFILE_LIST)) + +include inc.mk + +name2 := $(lastword $(MAKEFILE_LIST)) + +all: + @@echo name1 = $(name1) + @@echo name2 = $(name2) +@end group +@end example + +@noindent +then you would expect to see this output: + +@example +@group +name1 = Makefile +name2 = inc.mk +@end group +@end example + +@vindex .DEFAULT_GOAL @r{(define default goal)} +@item .DEFAULT_GOAL +Sets the default goal to be used if no targets were specified on the +command line (@pxref{Goals, , Arguments to Specify the Goals}). The +@code{.DEFAULT_GOAL} variable allows you to discover the current +default goal, restart the default goal selection algorithm by clearing +its value, or to explicitly set the default goal. The following +example illustrates these cases: + +@example +@group +# Query the default goal. +ifeq ($(.DEFAULT_GOAL),) + $(warning no default goal is set) +endif + +.PHONY: foo +foo: ; @@echo $@@ + +$(warning default goal is $(.DEFAULT_GOAL)) + +# Reset the default goal. +.DEFAULT_GOAL := + +.PHONY: bar +bar: ; @@echo $@@ + +$(warning default goal is $(.DEFAULT_GOAL)) + +# Set our own. +.DEFAULT_GOAL := foo +@end group +@end example + +This makefile prints: + +@example +@group +no default goal is set +default goal is foo +default goal is bar +foo +@end group +@end example + +Note that assigning more than one target name to @code{.DEFAULT_GOAL} is +illegal and will result in an error. + +@vindex MAKE_RESTARTS @r{(number of times @code{make} has restarted)} +@item MAKE_RESTARTS +This variable is set only if this instance of @code{make} has +restarted (@pxref{Remaking Makefiles, , How Makefiles Are Remade}): it +will contain the number of times this instance has restarted. Note +this is not the same as recursion (counted by the @code{MAKELEVEL} +variable). You should not set, modify, or export this variable. + +@vindex .RECIPEPREFIX @r{(change the recipe prefix character)} +@item .RECIPEPREFIX +The first character of the value of this variable is used as the +character make assumes is introducing a recipe line. If the variable +is empty (as it is by default) that character is the standard tab +character. For example, this is a valid makefile: + +@example +@group +.RECIPEPREFIX = > +all: +> @@echo Hello, world +@end group +@end example + +The value of @code{.RECIPEPREFIX} can be changed multiple times; once set +it stays in effect for all rules parsed until it is modified. + +@vindex .VARIABLES @r{(list of variables)} +@item .VARIABLES +Expands to a list of the @emph{names} of all global variables defined +so far. This includes variables which have empty values, as well as +built-in variables (@pxref{Implicit Variables, , Variables Used by +Implicit Rules}), but does not include any variables which are only +defined in a target-specific context. Note that any value you assign +to this variable will be ignored; it will always return its special +value. + +@c @vindex .TARGETS @r{(list of targets)} +@c @item .TARGETS +@c The second special variable is @code{.TARGETS}. When expanded, the +@c value consists of a list of all targets defined in all makefiles read +@c up until that point. Note it's not enough for a file to be simply +@c mentioned in the makefile to be listed in this variable, even if it +@c would match an implicit rule and become an ``implicit target''. The +@c file must appear as a target, on the left-hand side of a ``:'', to be +@c considered a target for the purposes of this variable. + +@vindex .FEATURES @r{(list of supported features)} +@item .FEATURES +Expands to a list of special features supported by this version of +@code{make}. Possible values include: + +@table @samp + +@item archives +Supports @code{ar} (archive) files using special filename syntax. +@xref{Archives, ,Using @code{make} to Update Archive Files}. + +@item check-symlink +Supports the @code{-L} (@code{--check-symlink-times}) flag. +@xref{Options Summary, ,Summary of Options}. + +@item else-if +Supports ``else if'' non-nested conditionals. @xref{Conditional +Syntax, ,Syntax of Conditionals}. + +@item jobserver +Supports ``job server'' enhanced parallel builds. @xref{Parallel, +,Parallel Execution}. + +@item second-expansion +Supports secondary expansion of prerequisite lists. + +@item order-only +Supports order-only prerequisites. @xref{Prerequisite Types, ,Types +of Prerequisites}. + +@item target-specific +Supports target-specific and pattern-specific variable assignments. +@xref{Target-specific, ,Target-specific Variable Values}. + +@end table + +@vindex .INCLUDE_DIRS @r{(list of include directories)} +@item .INCLUDE_DIRS +Expands to a list of directories that @code{make} searches for +included makefiles (@pxref{Include, , Including Other Makefiles}). + +@end table + +@node Conditionals, Functions, Using Variables, Top +@chapter Conditional Parts of Makefiles + +@cindex conditionals +A @dfn{conditional} directive causes part of a makefile to be obeyed +or ignored depending on the values of variables. Conditionals can +compare the value of one variable to another, or the value of a +variable to a constant string. Conditionals control what @code{make} +actually ``sees'' in the makefile, so they @emph{cannot} be used to +control recipes at the time of execution.@refill + +@menu +* Conditional Example:: Example of a conditional +* Conditional Syntax:: The syntax of conditionals. +* Testing Flags:: Conditionals that test flags. +@end menu + +@node Conditional Example, Conditional Syntax, Conditionals, Conditionals +@section Example of a Conditional + +The following example of a conditional tells @code{make} to use one +set of libraries if the @code{CC} variable is @samp{gcc}, and a +different set of libraries otherwise. It works by controlling which +of two recipe lines will be used for the rule. The result is that +@samp{CC=gcc} as an argument to @code{make} changes not only which +compiler is used but also which libraries are linked. + +@example +libs_for_gcc = -lgnu +normal_libs = + +foo: $(objects) +ifeq ($(CC),gcc) + $(CC) -o foo $(objects) $(libs_for_gcc) +else + $(CC) -o foo $(objects) $(normal_libs) +endif +@end example + +This conditional uses three directives: one @code{ifeq}, one @code{else} +and one @code{endif}. + +The @code{ifeq} directive begins the conditional, and specifies the +condition. It contains two arguments, separated by a comma and surrounded +by parentheses. Variable substitution is performed on both arguments and +then they are compared. The lines of the makefile following the +@code{ifeq} are obeyed if the two arguments match; otherwise they are +ignored. + +The @code{else} directive causes the following lines to be obeyed if the +previous conditional failed. In the example above, this means that the +second alternative linking command is used whenever the first alternative +is not used. It is optional to have an @code{else} in a conditional. + +The @code{endif} directive ends the conditional. Every conditional must +end with an @code{endif}. Unconditional makefile text follows. + +As this example illustrates, conditionals work at the textual level: +the lines of the conditional are treated as part of the makefile, or +ignored, according to the condition. This is why the larger syntactic +units of the makefile, such as rules, may cross the beginning or the +end of the conditional. + +When the variable @code{CC} has the value @samp{gcc}, the above example has +this effect: + +@example +foo: $(objects) + $(CC) -o foo $(objects) $(libs_for_gcc) +@end example + +@noindent +When the variable @code{CC} has any other value, the effect is this: + +@example +foo: $(objects) + $(CC) -o foo $(objects) $(normal_libs) +@end example + +Equivalent results can be obtained in another way by conditionalizing a +variable assignment and then using the variable unconditionally: + +@example +libs_for_gcc = -lgnu +normal_libs = + +ifeq ($(CC),gcc) + libs=$(libs_for_gcc) +else + libs=$(normal_libs) +endif + +foo: $(objects) + $(CC) -o foo $(objects) $(libs) +@end example + +@node Conditional Syntax, Testing Flags, Conditional Example, Conditionals +@section Syntax of Conditionals +@findex ifdef +@findex ifeq +@findex ifndef +@findex ifneq +@findex else +@findex endif + +The syntax of a simple conditional with no @code{else} is as follows: + +@example +@var{conditional-directive} +@var{text-if-true} +endif +@end example + +@noindent +The @var{text-if-true} may be any lines of text, to be considered as part +of the makefile if the condition is true. If the condition is false, no +text is used instead. + +The syntax of a complex conditional is as follows: + +@example +@var{conditional-directive} +@var{text-if-true} +else +@var{text-if-false} +endif +@end example + +or: + +@example +@var{conditional-directive} +@var{text-if-one-is-true} +else @var{conditional-directive} +@var{text-if-true} +else +@var{text-if-false} +endif +@end example + +@noindent +There can be as many ``@code{else} @var{conditional-directive}'' +clauses as necessary. Once a given condition is true, +@var{text-if-true} is used and no other clause is used; if no +condition is true then @var{text-if-false} is used. The +@var{text-if-true} and @var{text-if-false} can be any number of lines +of text. + +The syntax of the @var{conditional-directive} is the same whether the +conditional is simple or complex; after an @code{else} or not. There +are four different directives that test different conditions. Here is +a table of them: + +@table @code +@item ifeq (@var{arg1}, @var{arg2}) +@itemx ifeq '@var{arg1}' '@var{arg2}' +@itemx ifeq "@var{arg1}" "@var{arg2}" +@itemx ifeq "@var{arg1}" '@var{arg2}' +@itemx ifeq '@var{arg1}' "@var{arg2}" +Expand all variable references in @var{arg1} and @var{arg2} and +compare them. If they are identical, the @var{text-if-true} is +effective; otherwise, the @var{text-if-false}, if any, is effective. + +Often you want to test if a variable has a non-empty value. When the +value results from complex expansions of variables and functions, +expansions you would consider empty may actually contain whitespace +characters and thus are not seen as empty. However, you can use the +@code{strip} function (@pxref{Text Functions}) to avoid interpreting +whitespace as a non-empty value. For example: + +@example +@group +ifeq ($(strip $(foo)),) +@var{text-if-empty} +endif +@end group +@end example + +@noindent +will evaluate @var{text-if-empty} even if the expansion of +@code{$(foo)} contains whitespace characters. + +@item ifneq (@var{arg1}, @var{arg2}) +@itemx ifneq '@var{arg1}' '@var{arg2}' +@itemx ifneq "@var{arg1}" "@var{arg2}" +@itemx ifneq "@var{arg1}" '@var{arg2}' +@itemx ifneq '@var{arg1}' "@var{arg2}" +Expand all variable references in @var{arg1} and @var{arg2} and +compare them. If they are different, the @var{text-if-true} is +effective; otherwise, the @var{text-if-false}, if any, is effective. + +@item ifdef @var{variable-name} +The @code{ifdef} form takes the @emph{name} of a variable as its +argument, not a reference to a variable. The value of that variable +has a non-empty value, the @var{text-if-true} is effective; otherwise, +the @var{text-if-false}, if any, is effective. Variables that have +never been defined have an empty value. The text @var{variable-name} +is expanded, so it could be a variable or function that expands +to the name of a variable. For example: + +@example +bar = true +foo = bar +ifdef $(foo) +frobozz = yes +endif +@end example + +The variable reference @code{$(foo)} is expanded, yielding @code{bar}, +which is considered to be the name of a variable. The variable +@code{bar} is not expanded, but its value is examined to determine if +it is non-empty. + +Note that @code{ifdef} only tests whether a variable has a value. It +does not expand the variable to see if that value is nonempty. +Consequently, tests using @code{ifdef} return true for all definitions +except those like @code{foo =}. To test for an empty value, use +@w{@code{ifeq ($(foo),)}}. For example, + +@example +bar = +foo = $(bar) +ifdef foo +frobozz = yes +else +frobozz = no +endif +@end example + +@noindent +sets @samp{frobozz} to @samp{yes}, while: + +@example +foo = +ifdef foo +frobozz = yes +else +frobozz = no +endif +@end example + +@noindent +sets @samp{frobozz} to @samp{no}. + +@item ifndef @var{variable-name} +If the variable @var{variable-name} has an empty value, the +@var{text-if-true} is effective; otherwise, the @var{text-if-false}, +if any, is effective. The rules for expansion and testing of +@var{variable-name} are identical to the @code{ifdef} directive. +@end table + +Extra spaces are allowed and ignored at the beginning of the +conditional directive line, but a tab is not allowed. (If the line +begins with a tab, it will be considered part of a recipe for a rule.) +Aside from this, extra spaces or tabs may be inserted with no effect +anywhere except within the directive name or within an argument. A +comment starting with @samp{#} may appear at the end of the line. + +The other two directives that play a part in a conditional are @code{else} +and @code{endif}. Each of these directives is written as one word, with no +arguments. Extra spaces are allowed and ignored at the beginning of the +line, and spaces or tabs at the end. A comment starting with @samp{#} may +appear at the end of the line. + +Conditionals affect which lines of the makefile @code{make} uses. If +the condition is true, @code{make} reads the lines of the +@var{text-if-true} as part of the makefile; if the condition is false, +@code{make} ignores those lines completely. It follows that syntactic +units of the makefile, such as rules, may safely be split across the +beginning or the end of the conditional.@refill + +@code{make} evaluates conditionals when it reads a makefile. +Consequently, you cannot use automatic variables in the tests of +conditionals because they are not defined until recipes are run +(@pxref{Automatic Variables}). + +To prevent intolerable confusion, it is not permitted to start a +conditional in one makefile and end it in another. However, you may +write an @code{include} directive within a conditional, provided you do +not attempt to terminate the conditional inside the included file. + +@node Testing Flags, , Conditional Syntax, Conditionals +@section Conditionals that Test Flags + +You can write a conditional that tests @code{make} command flags such as +@samp{-t} by using the variable @code{MAKEFLAGS} together with the +@code{findstring} function +(@pxref{Text Functions, , Functions for String Substitution and Analysis}). +This is useful when @code{touch} is not enough to make a file appear up +to date. + +The @code{findstring} function determines whether one string appears as a +substring of another. If you want to test for the @samp{-t} flag, +use @samp{t} as the first string and the value of @code{MAKEFLAGS} as +the other. + +For example, here is how to arrange to use @samp{ranlib -t} to finish +marking an archive file up to date: + +@example +archive.a: @dots{} +ifneq (,$(findstring t,$(MAKEFLAGS))) + +touch archive.a + +ranlib -t archive.a +else + ranlib archive.a +endif +@end example + +@noindent +The @samp{+} prefix marks those recipe lines as ``recursive'' so that +they will be executed despite use of the @samp{-t} flag. +@xref{Recursion, ,Recursive Use of @code{make}}. + +@node Functions, Running, Conditionals, Top +@chapter Functions for Transforming Text +@cindex functions + +@dfn{Functions} allow you to do text processing in the makefile to +compute the files to operate on or the commands to use in recipes. +You use a function in a @dfn{function call}, where you give the name +of the function and some text (the @dfn{arguments}) for the function +to operate on. The result of the function's processing is substituted +into the makefile at the point of the call, just as a variable might +be substituted. + +@menu +* Syntax of Functions:: How to write a function call. +* Text Functions:: General-purpose text manipulation functions. +* File Name Functions:: Functions for manipulating file names. +* Conditional Functions:: Functions that implement conditions. +* Foreach Function:: Repeat some text with controlled variation. +* Call Function:: Expand a user-defined function. +* Value Function:: Return the un-expanded value of a variable. +* Eval Function:: Evaluate the arguments as makefile syntax. +* Origin Function:: Find where a variable got its value. +* Flavor Function:: Find out the flavor of a variable. +* Shell Function:: Substitute the output of a shell command. +* Make Control Functions:: Functions that control how make runs. +@end menu + +@node Syntax of Functions, Text Functions, Functions, Functions +@section Function Call Syntax +@cindex @code{$}, in function call +@cindex dollar sign (@code{$}), in function call +@cindex arguments of functions +@cindex functions, syntax of + +A function call resembles a variable reference. It looks like this: + +@example +$(@var{function} @var{arguments}) +@end example + +@noindent +or like this: + +@example +$@{@var{function} @var{arguments}@} +@end example + +Here @var{function} is a function name; one of a short list of names +that are part of @code{make}. You can also essentially create your own +functions by using the @code{call} builtin function. + +The @var{arguments} are the arguments of the function. They are +separated from the function name by one or more spaces or tabs, and if +there is more than one argument, then they are separated by commas. +Such whitespace and commas are not part of an argument's value. The +delimiters which you use to surround the function call, whether +parentheses or braces, can appear in an argument only in matching pairs; +the other kind of delimiters may appear singly. If the arguments +themselves contain other function calls or variable references, it is +wisest to use the same kind of delimiters for all the references; write +@w{@samp{$(subst a,b,$(x))}}, not @w{@samp{$(subst a,b,$@{x@})}}. This +is because it is clearer, and because only one type of delimiter is +matched to find the end of the reference. + +The text written for each argument is processed by substitution of +variables and function calls to produce the argument value, which +is the text on which the function acts. The substitution is done in the +order in which the arguments appear. + +Commas and unmatched parentheses or braces cannot appear in the text of an +argument as written; leading spaces cannot appear in the text of the first +argument as written. These characters can be put into the argument value +by variable substitution. First define variables @code{comma} and +@code{space} whose values are isolated comma and space characters, then +substitute these variables where such characters are wanted, like this: + +@example +@group +comma:= , +empty:= +space:= $(empty) $(empty) +foo:= a b c +bar:= $(subst $(space),$(comma),$(foo)) +# @r{bar is now `a,b,c'.} +@end group +@end example + +@noindent +Here the @code{subst} function replaces each space with a comma, through +the value of @code{foo}, and substitutes the result. + +@node Text Functions, File Name Functions, Syntax of Functions, Functions +@section Functions for String Substitution and Analysis +@cindex functions, for text + +Here are some functions that operate on strings: + +@table @code +@item $(subst @var{from},@var{to},@var{text}) +@findex subst +Performs a textual replacement on the text @var{text}: each occurrence +of @var{from} is replaced by @var{to}. The result is substituted for +the function call. For example, + +@example +$(subst ee,EE,feet on the street) +@end example + +substitutes the string @samp{fEEt on the strEEt}. + +@item $(patsubst @var{pattern},@var{replacement},@var{text}) +@findex patsubst +Finds whitespace-separated words in @var{text} that match +@var{pattern} and replaces them with @var{replacement}. Here +@var{pattern} may contain a @samp{%} which acts as a wildcard, +matching any number of any characters within a word. If +@var{replacement} also contains a @samp{%}, the @samp{%} is replaced +by the text that matched the @samp{%} in @var{pattern}. Only the first +@samp{%} in the @var{pattern} and @var{replacement} is treated this +way; any subsequent @samp{%} is unchanged.@refill + +@cindex @code{%}, quoting in @code{patsubst} +@cindex @code{%}, quoting with @code{\} (backslash) +@cindex @code{\} (backslash), to quote @code{%} +@cindex backslash (@code{\}), to quote @code{%} +@cindex quoting @code{%}, in @code{patsubst} +@samp{%} characters in @code{patsubst} function invocations can be +quoted with preceding backslashes (@samp{\}). Backslashes that would +otherwise quote @samp{%} characters can be quoted with more backslashes. +Backslashes that quote @samp{%} characters or other backslashes are +removed from the pattern before it is compared file names or has a stem +substituted into it. Backslashes that are not in danger of quoting +@samp{%} characters go unmolested. For example, the pattern +@file{the\%weird\\%pattern\\} has @samp{the%weird\} preceding the +operative @samp{%} character, and @samp{pattern\\} following it. The +final two backslashes are left alone because they cannot affect any +@samp{%} character.@refill + +Whitespace between words is folded into single space characters; +leading and trailing whitespace is discarded. + +For example, + +@example +$(patsubst %.c,%.o,x.c.c bar.c) +@end example + +@noindent +produces the value @samp{x.c.o bar.o}. + +Substitution references (@pxref{Substitution Refs, ,Substitution +References}) are a simpler way to get the effect of the @code{patsubst} +function: + +@example +$(@var{var}:@var{pattern}=@var{replacement}) +@end example + +@noindent +is equivalent to + +@example +$(patsubst @var{pattern},@var{replacement},$(@var{var})) +@end example + +The second shorthand simplifies one of the most common uses of +@code{patsubst}: replacing the suffix at the end of file names. + +@example +$(@var{var}:@var{suffix}=@var{replacement}) +@end example + +@noindent +is equivalent to + +@example +$(patsubst %@var{suffix},%@var{replacement},$(@var{var})) +@end example + +@noindent +For example, you might have a list of object files: + +@example +objects = foo.o bar.o baz.o +@end example + +@noindent +To get the list of corresponding source files, you could simply write: + +@example +$(objects:.o=.c) +@end example + +@noindent +instead of using the general form: + +@example +$(patsubst %.o,%.c,$(objects)) +@end example + +@item $(strip @var{string}) +@cindex stripping whitespace +@cindex whitespace, stripping +@cindex spaces, stripping +@findex strip +Removes leading and trailing whitespace from @var{string} and replaces +each internal sequence of one or more whitespace characters with a +single space. Thus, @samp{$(strip a b c )} results in @w{@samp{a b c}}. + +The function @code{strip} can be very useful when used in conjunction +with conditionals. When comparing something with the empty string +@samp{} using @code{ifeq} or @code{ifneq}, you usually want a string of +just whitespace to match the empty string (@pxref{Conditionals}). + +Thus, the following may fail to have the desired results: + +@example +.PHONY: all +ifneq "$(needs_made)" "" +all: $(needs_made) +else +all:;@@echo 'Nothing to make!' +endif +@end example + +@noindent +Replacing the variable reference @w{@samp{$(needs_made)}} with the +function call @w{@samp{$(strip $(needs_made))}} in the @code{ifneq} +directive would make it more robust.@refill + +@item $(findstring @var{find},@var{in}) +@findex findstring +@cindex searching for strings +@cindex finding strings +@cindex strings, searching for +Searches @var{in} for an occurrence of @var{find}. If it occurs, the +value is @var{find}; otherwise, the value is empty. You can use this +function in a conditional to test for the presence of a specific +substring in a given string. Thus, the two examples, + +@example +$(findstring a,a b c) +$(findstring a,b c) +@end example + +@noindent +produce the values @samp{a} and @samp{} (the empty string), +respectively. @xref{Testing Flags}, for a practical application of +@code{findstring}.@refill + +@need 750 +@findex filter +@cindex filtering words +@cindex words, filtering +@item $(filter @var{pattern}@dots{},@var{text}) +Returns all whitespace-separated words in @var{text} that @emph{do} match +any of the @var{pattern} words, removing any words that @emph{do not} +match. The patterns are written using @samp{%}, just like the patterns +used in the @code{patsubst} function above.@refill + +The @code{filter} function can be used to separate out different types +of strings (such as file names) in a variable. For example: + +@example +sources := foo.c bar.c baz.s ugh.h +foo: $(sources) + cc $(filter %.c %.s,$(sources)) -o foo +@end example + +@noindent +says that @file{foo} depends of @file{foo.c}, @file{bar.c}, +@file{baz.s} and @file{ugh.h} but only @file{foo.c}, @file{bar.c} and +@file{baz.s} should be specified in the command to the +compiler.@refill + +@item $(filter-out @var{pattern}@dots{},@var{text}) +@findex filter-out +@cindex filtering out words +@cindex words, filtering out +Returns all whitespace-separated words in @var{text} that @emph{do not} +match any of the @var{pattern} words, removing the words that @emph{do} +match one or more. This is the exact opposite of the @code{filter} +function.@refill + +For example, given: + +@example +@group +objects=main1.o foo.o main2.o bar.o +mains=main1.o main2.o +@end group +@end example + +@noindent +the following generates a list which contains all the object files not +in @samp{mains}: + +@example +$(filter-out $(mains),$(objects)) +@end example + +@need 1500 +@findex sort +@cindex sorting words +@item $(sort @var{list}) +Sorts the words of @var{list} in lexical order, removing duplicate +words. The output is a list of words separated by single spaces. +Thus, + +@example +$(sort foo bar lose) +@end example + +@noindent +returns the value @samp{bar foo lose}. + +@cindex removing duplicate words +@cindex duplicate words, removing +@cindex words, removing duplicates +Incidentally, since @code{sort} removes duplicate words, you can use +it for this purpose even if you don't care about the sort order. + +@item $(word @var{n},@var{text}) +@findex word +@cindex word, selecting a +@cindex selecting a word +Returns the @var{n}th word of @var{text}. The legitimate values of +@var{n} start from 1. If @var{n} is bigger than the number of words +in @var{text}, the value is empty. For example, + +@example +$(word 2, foo bar baz) +@end example + +@noindent +returns @samp{bar}. + +@item $(wordlist @var{s},@var{e},@var{text}) +@findex wordlist +@cindex words, selecting lists of +@cindex selecting word lists +Returns the list of words in @var{text} starting with word @var{s} and +ending with word @var{e} (inclusive). The legitimate values of @var{s} +start from 1; @var{e} may start from 0. If @var{s} is bigger than the +number of words in @var{text}, the value is empty. If @var{e} is +bigger than the number of words in @var{text}, words up to the end of +@var{text} are returned. If @var{s} is greater than @var{e}, nothing +is returned. For example, + +@example +$(wordlist 2, 3, foo bar baz) +@end example + +@noindent +returns @samp{bar baz}. + +@c Following item phrased to prevent overfull hbox. --RJC 17 Jul 92 +@item $(words @var{text}) +@findex words +@cindex words, finding number +Returns the number of words in @var{text}. +Thus, the last word of @var{text} is +@w{@code{$(word $(words @var{text}),@var{text})}}.@refill + +@item $(firstword @var{names}@dots{}) +@findex firstword +@cindex words, extracting first +The argument @var{names} is regarded as a series of names, separated +by whitespace. The value is the first name in the series. The rest +of the names are ignored. + +For example, + +@example +$(firstword foo bar) +@end example + +@noindent +produces the result @samp{foo}. Although @code{$(firstword +@var{text})} is the same as @code{$(word 1,@var{text})}, the +@code{firstword} function is retained for its simplicity.@refill + + +@item $(lastword @var{names}@dots{}) +@findex lastword +@cindex words, extracting last +The argument @var{names} is regarded as a series of names, separated +by whitespace. The value is the last name in the series. + +For example, + +@example +$(lastword foo bar) +@end example + +@noindent +produces the result @samp{bar}. Although @code{$(lastword +@var{text})} is the same as @code{$(word $(words @var{text}),@var{text})}, +the @code{lastword} function was added for its simplicity and better +performance.@refill +@end table + + +Here is a realistic example of the use of @code{subst} and +@code{patsubst}. Suppose that a makefile uses the @code{VPATH} variable +to specify a list of directories that @code{make} should search for +prerequisite files +(@pxref{General Search, , @code{VPATH} Search Path for All Prerequisites}). +This example shows how to +tell the C compiler to search for header files in the same list of +directories.@refill + +The value of @code{VPATH} is a list of directories separated by colons, +such as @samp{src:../headers}. First, the @code{subst} function is used to +change the colons to spaces: + +@example +$(subst :, ,$(VPATH)) +@end example + +@noindent +This produces @samp{src ../headers}. Then @code{patsubst} is used to turn +each directory name into a @samp{-I} flag. These can be added to the +value of the variable @code{CFLAGS}, which is passed automatically to the C +compiler, like this: + +@example +override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH))) +@end example + +@noindent +The effect is to append the text @samp{-Isrc -I../headers} to the +previously given value of @code{CFLAGS}. The @code{override} directive is +used so that the new value is assigned even if the previous value of +@code{CFLAGS} was specified with a command argument (@pxref{Override +Directive, , The @code{override} Directive}). + +@node File Name Functions, Conditional Functions, Text Functions, Functions +@section Functions for File Names +@cindex functions, for file names +@cindex file name functions + +Several of the built-in expansion functions relate specifically to +taking apart file names or lists of file names. + +Each of the following functions performs a specific transformation on a +file name. The argument of the function is regarded as a series of file +names, separated by whitespace. (Leading and trailing whitespace is +ignored.) Each file name in the series is transformed in the same way and +the results are concatenated with single spaces between them. + +@table @code +@item $(dir @var{names}@dots{}) +@findex dir +@cindex directory part +@cindex file name, directory part +Extracts the directory-part of each file name in @var{names}. The +directory-part of the file name is everything up through (and +including) the last slash in it. If the file name contains no slash, +the directory part is the string @samp{./}. For example, + +@example +$(dir src/foo.c hacks) +@end example + +@noindent +produces the result @samp{src/ ./}. + +@item $(notdir @var{names}@dots{}) +@findex notdir +@cindex file name, nondirectory part +@cindex nondirectory part +Extracts all but the directory-part of each file name in @var{names}. +If the file name contains no slash, it is left unchanged. Otherwise, +everything through the last slash is removed from it. + +A file name that ends with a slash becomes an empty string. This is +unfortunate, because it means that the result does not always have the +same number of whitespace-separated file names as the argument had; +but we do not see any other valid alternative. + +For example, + +@example +$(notdir src/foo.c hacks) +@end example + +@noindent +produces the result @samp{foo.c hacks}. + +@item $(suffix @var{names}@dots{}) +@findex suffix +@cindex suffix, function to find +@cindex file name suffix +Extracts the suffix of each file name in @var{names}. If the file name +contains a period, the suffix is everything starting with the last +period. Otherwise, the suffix is the empty string. This frequently +means that the result will be empty when @var{names} is not, and if +@var{names} contains multiple file names, the result may contain fewer +file names. + +For example, + +@example +$(suffix src/foo.c src-1.0/bar.c hacks) +@end example + +@noindent +produces the result @samp{.c .c}. + +@item $(basename @var{names}@dots{}) +@findex basename +@cindex basename +@cindex file name, basename of +Extracts all but the suffix of each file name in @var{names}. If the +file name contains a period, the basename is everything starting up to +(and not including) the last period. Periods in the directory part are +ignored. If there is no period, the basename is the entire file name. +For example, + +@example +$(basename src/foo.c src-1.0/bar hacks) +@end example + +@noindent +produces the result @samp{src/foo src-1.0/bar hacks}. + +@c plural convention with dots (be consistent) +@item $(addsuffix @var{suffix},@var{names}@dots{}) +@findex addsuffix +@cindex suffix, adding +@cindex file name suffix, adding +The argument @var{names} is regarded as a series of names, separated +by whitespace; @var{suffix} is used as a unit. The value of +@var{suffix} is appended to the end of each individual name and the +resulting larger names are concatenated with single spaces between +them. For example, + +@example +$(addsuffix .c,foo bar) +@end example + +@noindent +produces the result @samp{foo.c bar.c}. + +@item $(addprefix @var{prefix},@var{names}@dots{}) +@findex addprefix +@cindex prefix, adding +@cindex file name prefix, adding +The argument @var{names} is regarded as a series of names, separated +by whitespace; @var{prefix} is used as a unit. The value of +@var{prefix} is prepended to the front of each individual name and the +resulting larger names are concatenated with single spaces between +them. For example, + +@example +$(addprefix src/,foo bar) +@end example + +@noindent +produces the result @samp{src/foo src/bar}. + +@item $(join @var{list1},@var{list2}) +@findex join +@cindex joining lists of words +@cindex words, joining lists +Concatenates the two arguments word by word: the two first words (one +from each argument) concatenated form the first word of the result, the +two second words form the second word of the result, and so on. So the +@var{n}th word of the result comes from the @var{n}th word of each +argument. If one argument has more words that the other, the extra +words are copied unchanged into the result. + +For example, @samp{$(join a b,.c .o)} produces @samp{a.c b.o}. + +Whitespace between the words in the lists is not preserved; it is +replaced with a single space. + +This function can merge the results of the @code{dir} and +@code{notdir} functions, to produce the original list of files which +was given to those two functions.@refill + +@item $(wildcard @var{pattern}) +@findex wildcard +@cindex wildcard, function +The argument @var{pattern} is a file name pattern, typically containing +wildcard characters (as in shell file name patterns). The result of +@code{wildcard} is a space-separated list of the names of existing files +that match the pattern. +@xref{Wildcards, ,Using Wildcard Characters in File Names}. + +@item $(realpath @var{names}@dots{}) +@findex realpath +@cindex realpath +@cindex file name, realpath of +For each file name in @var{names} return the canonical absolute name. +A canonical name does not contain any @code{.} or @code{..} components, +nor any repeated path separators (@code{/}) or symlinks. In case of a +failure the empty string is returned. Consult the @code{realpath(3)} +documentation for a list of possible failure causes. + +@item $(abspath @var{names}@dots{}) +@findex abspath +@cindex abspath +@cindex file name, abspath of +For each file name in @var{names} return an absolute name that does +not contain any @code{.} or @code{..} components, nor any repeated path +separators (@code{/}). Note that, in contrast to @code{realpath} +function, @code{abspath} does not resolve symlinks and does not require +the file names to refer to an existing file or directory. Use the +@code{wildcard} function to test for existence. +@end table + +@node Conditional Functions, Foreach Function, File Name Functions, Functions +@section Functions for Conditionals +@findex if +@cindex conditional expansion +There are three functions that provide conditional expansion. A key +aspect of these functions is that not all of the arguments are +expanded initially. Only those arguments which need to be expanded, +will be expanded. + +@table @code +@item $(if @var{condition},@var{then-part}[,@var{else-part}]) +@findex if +The @code{if} function provides support for conditional expansion in a +functional context (as opposed to the GNU @code{make} makefile +conditionals such as @code{ifeq} (@pxref{Conditional Syntax, ,Syntax of +Conditionals}). + +The first argument, @var{condition}, first has all preceding and +trailing whitespace stripped, then is expanded. If it expands to any +non-empty string, then the condition is considered to be true. If it +expands to an empty string, the condition is considered to be false. + +If the condition is true then the second argument, @var{then-part}, is +evaluated and this is used as the result of the evaluation of the entire +@code{if} function. + +If the condition is false then the third argument, @var{else-part}, is +evaluated and this is the result of the @code{if} function. If there is +no third argument, the @code{if} function evaluates to nothing (the +empty string). + +Note that only one of the @var{then-part} or the @var{else-part} will be +evaluated, never both. Thus, either can contain side-effects (such as +@code{shell} function calls, etc.) + +@item $(or @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]]) +@findex or +The @code{or} function provides a ``short-circuiting'' OR operation. +Each argument is expanded, in order. If an argument expands to a +non-empty string the processing stops and the result of the expansion +is that string. If, after all arguments are expanded, all of them are +false (empty), then the result of the expansion is the empty string. + +@item $(and @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]]) +@findex and +The @code{and} function provides a ``short-circuiting'' AND operation. +Each argument is expanded, in order. If an argument expands to an +empty string the processing stops and the result of the expansion is +the empty string. If all arguments expand to a non-empty string then +the result of the expansion is the expansion of the last argument. + +@end table + +@node Foreach Function, Call Function, Conditional Functions, Functions +@section The @code{foreach} Function +@findex foreach +@cindex words, iterating over + +The @code{foreach} function is very different from other functions. It +causes one piece of text to be used repeatedly, each time with a different +substitution performed on it. It resembles the @code{for} command in the +shell @code{sh} and the @code{foreach} command in the C-shell @code{csh}. + +The syntax of the @code{foreach} function is: + +@example +$(foreach @var{var},@var{list},@var{text}) +@end example + +@noindent +The first two arguments, @var{var} and @var{list}, are expanded before +anything else is done; note that the last argument, @var{text}, is +@strong{not} expanded at the same time. Then for each word of the expanded +value of @var{list}, the variable named by the expanded value of @var{var} +is set to that word, and @var{text} is expanded. Presumably @var{text} +contains references to that variable, so its expansion will be different +each time. + +The result is that @var{text} is expanded as many times as there are +whitespace-separated words in @var{list}. The multiple expansions of +@var{text} are concatenated, with spaces between them, to make the result +of @code{foreach}. + +This simple example sets the variable @samp{files} to the list of all files +in the directories in the list @samp{dirs}: + +@example +dirs := a b c d +files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) +@end example + +Here @var{text} is @samp{$(wildcard $(dir)/*)}. The first repetition +finds the value @samp{a} for @code{dir}, so it produces the same result +as @samp{$(wildcard a/*)}; the second repetition produces the result +of @samp{$(wildcard b/*)}; and the third, that of @samp{$(wildcard c/*)}. + +This example has the same result (except for setting @samp{dirs}) as +the following example: + +@example +files := $(wildcard a/* b/* c/* d/*) +@end example + +When @var{text} is complicated, you can improve readability by giving it +a name, with an additional variable: + +@example +find_files = $(wildcard $(dir)/*) +dirs := a b c d +files := $(foreach dir,$(dirs),$(find_files)) +@end example + +@noindent +Here we use the variable @code{find_files} this way. We use plain @samp{=} +to define a recursively-expanding variable, so that its value contains an +actual function call to be reexpanded under the control of @code{foreach}; +a simply-expanded variable would not do, since @code{wildcard} would be +called only once at the time of defining @code{find_files}. + +The @code{foreach} function has no permanent effect on the variable +@var{var}; its value and flavor after the @code{foreach} function call are +the same as they were beforehand. The other values which are taken from +@var{list} are in effect only temporarily, during the execution of +@code{foreach}. The variable @var{var} is a simply-expanded variable +during the execution of @code{foreach}. If @var{var} was undefined +before the @code{foreach} function call, it is undefined after the call. +@xref{Flavors, ,The Two Flavors of Variables}.@refill + +You must take care when using complex variable expressions that result in +variable names because many strange things are valid variable names, but +are probably not what you intended. For example, + +@smallexample +files := $(foreach Esta escrito en espanol!,b c ch,$(find_files)) +@end smallexample + +@noindent +might be useful if the value of @code{find_files} references the variable +whose name is @samp{Esta escrito en espanol!} (es un nombre bastante largo, +no?), but it is more likely to be a mistake. + +@node Call Function, Value Function, Foreach Function, Functions +@section The @code{call} Function +@findex call +@cindex functions, user defined +@cindex user defined functions + +The @code{call} function is unique in that it can be used to create new +parameterized functions. You can write a complex expression as the +value of a variable, then use @code{call} to expand it with different +values. + +The syntax of the @code{call} function is: + +@example +$(call @var{variable},@var{param},@var{param},@dots{}) +@end example + +When @code{make} expands this function, it assigns each @var{param} to +temporary variables @code{$(1)}, @code{$(2)}, etc. The variable +@code{$(0)} will contain @var{variable}. There is no maximum number of +parameter arguments. There is no minimum, either, but it doesn't make +sense to use @code{call} with no parameters. + +Then @var{variable} is expanded as a @code{make} variable in the context +of these temporary assignments. Thus, any reference to @code{$(1)} in +the value of @var{variable} will resolve to the first @var{param} in the +invocation of @code{call}. + +Note that @var{variable} is the @emph{name} of a variable, not a +@emph{reference} to that variable. Therefore you would not normally use +a @samp{$} or parentheses when writing it. (You can, however, use a +variable reference in the name if you want the name not to be a +constant.) + +If @var{variable} is the name of a builtin function, the builtin function +is always invoked (even if a @code{make} variable by that name also +exists). + +The @code{call} function expands the @var{param} arguments before +assigning them to temporary variables. This means that @var{variable} +values containing references to builtin functions that have special +expansion rules, like @code{foreach} or @code{if}, may not work as you +expect. + +Some examples may make this clearer. + +This macro simply reverses its arguments: + +@smallexample +reverse = $(2) $(1) + +foo = $(call reverse,a,b) +@end smallexample + +@noindent +Here @var{foo} will contain @samp{b a}. + +This one is slightly more interesting: it defines a macro to search for +the first instance of a program in @code{PATH}: + +@smallexample +pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH))))) + +LS := $(call pathsearch,ls) +@end smallexample + +@noindent +Now the variable LS contains @code{/bin/ls} or similar. + +The @code{call} function can be nested. Each recursive invocation gets +its own local values for @code{$(1)}, etc.@: that mask the values of +higher-level @code{call}. For example, here is an implementation of a +@dfn{map} function: + +@smallexample +map = $(foreach a,$(2),$(call $(1),$(a))) +@end smallexample + +Now you can @var{map} a function that normally takes only one argument, +such as @code{origin}, to multiple values in one step: + +@smallexample +o = $(call map,origin,o map MAKE) +@end smallexample + +and end up with @var{o} containing something like @samp{file file default}. + +A final caution: be careful when adding whitespace to the arguments to +@code{call}. As with other functions, any whitespace contained in the +second and subsequent arguments is kept; this can cause strange +effects. It's generally safest to remove all extraneous whitespace when +providing parameters to @code{call}. + +@node Value Function, Eval Function, Call Function, Functions +@comment node-name, next, previous, up +@section The @code{value} Function +@findex value +@cindex variables, unexpanded value + +The @code{value} function provides a way for you to use the value of a +variable @emph{without} having it expanded. Please note that this +does not undo expansions which have already occurred; for example if +you create a simply expanded variable its value is expanded during the +definition; in that case the @code{value} function will return the +same result as using the variable directly. + +The syntax of the @code{value} function is: + +@example +$(value @var{variable}) +@end example + +Note that @var{variable} is the @emph{name} of a variable; not a +@emph{reference} to that variable. Therefore you would not normally +use a @samp{$} or parentheses when writing it. (You can, however, use +a variable reference in the name if you want the name not to be a +constant.) + +The result of this function is a string containing the value of +@var{variable}, without any expansion occurring. For example, in this +makefile: + +@example +@group +FOO = $PATH + +all: + @@echo $(FOO) + @@echo $(value FOO) +@end group +@end example + +@noindent +The first output line would be @code{ATH}, since the ``$P'' would be +expanded as a @code{make} variable, while the second output line would +be the current value of your @code{$PATH} environment variable, since +the @code{value} function avoided the expansion. + +The @code{value} function is most often used in conjunction with the +@code{eval} function (@pxref{Eval Function}). + +@node Eval Function, Origin Function, Value Function, Functions +@comment node-name, next, previous, up +@section The @code{eval} Function +@findex eval +@cindex evaluating makefile syntax +@cindex makefile syntax, evaluating + +The @code{eval} function is very special: it allows you to define new +makefile constructs that are not constant; which are the result of +evaluating other variables and functions. The argument to the +@code{eval} function is expanded, then the results of that expansion +are parsed as makefile syntax. The expanded results can define new +@code{make} variables, targets, implicit or explicit rules, etc. + +The result of the @code{eval} function is always the empty string; +thus, it can be placed virtually anywhere in a makefile without +causing syntax errors. + +It's important to realize that the @code{eval} argument is expanded +@emph{twice}; first by the @code{eval} function, then the results of +that expansion are expanded again when they are parsed as makefile +syntax. This means you may need to provide extra levels of escaping +for ``$'' characters when using @code{eval}. The @code{value} +function (@pxref{Value Function}) can sometimes be useful in these +situations, to circumvent unwanted expansions. + +Here is an example of how @code{eval} can be used; this example +combines a number of concepts and other functions. Although it might +seem overly complex to use @code{eval} in this example, rather than +just writing out the rules, consider two things: first, the template +definition (in @code{PROGRAM_template}) could need to be much more +complex than it is here; and second, you might put the complex, +``generic'' part of this example into another makefile, then include +it in all the individual makefiles. Now your individual makefiles are +quite straightforward. + +@example +@group +PROGRAMS = server client + +server_OBJS = server.o server_priv.o server_access.o +server_LIBS = priv protocol + +client_OBJS = client.o client_api.o client_mem.o +client_LIBS = protocol + +# Everything after this is generic + +.PHONY: all +all: $(PROGRAMS) + +define PROGRAM_template = + $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) + ALL_OBJS += $$($(1)_OBJS) +endef + +$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog)))) + +$(PROGRAMS): + $(LINK.o) $^ $(LDLIBS) -o $@@ + +clean: + rm -f $(ALL_OBJS) $(PROGRAMS) +@end group +@end example + +@node Origin Function, Flavor Function, Eval Function, Functions +@section The @code{origin} Function +@findex origin +@cindex variables, origin of +@cindex origin of variable + +The @code{origin} function is unlike most other functions in that it does +not operate on the values of variables; it tells you something @emph{about} +a variable. Specifically, it tells you where it came from. + +The syntax of the @code{origin} function is: + +@example +$(origin @var{variable}) +@end example + +Note that @var{variable} is the @emph{name} of a variable to inquire about; +not a @emph{reference} to that variable. Therefore you would not normally +use a @samp{$} or parentheses when writing it. (You can, however, use a +variable reference in the name if you want the name not to be a constant.) + +The result of this function is a string telling you how the variable +@var{variable} was defined: + +@table @samp +@item undefined + +if @var{variable} was never defined. + +@item default + +if @var{variable} has a default definition, as is usual with @code{CC} +and so on. @xref{Implicit Variables, ,Variables Used by Implicit Rules}. +Note that if you have redefined a default variable, the @code{origin} +function will return the origin of the later definition. + +@item environment + +if @var{variable} was inherited from the environment provided to +@code{make}. + +@item environment override + +if @var{variable} was inherited from the environment provided to +@code{make}, and is overriding a setting for @var{variable} in the +makefile as a result of the @w{@samp{-e}} option (@pxref{Options +Summary, ,Summary of Options}).@refill + +@item file + +if @var{variable} was defined in a makefile. + +@item command line + +if @var{variable} was defined on the command line. + +@item override + +if @var{variable} was defined with an @code{override} directive in a +makefile (@pxref{Override Directive, ,The @code{override} Directive}). + +@item automatic + +if @var{variable} is an automatic variable defined for the execution +of the recipe for each rule (@pxref{Automatic Variables}). +@end table + +This information is primarily useful (other than for your curiosity) to +determine if you want to believe the value of a variable. For example, +suppose you have a makefile @file{foo} that includes another makefile +@file{bar}. You want a variable @code{bletch} to be defined in @file{bar} +if you run the command @w{@samp{make -f bar}}, even if the environment contains +a definition of @code{bletch}. However, if @file{foo} defined +@code{bletch} before including @file{bar}, you do not want to override that +definition. This could be done by using an @code{override} directive in +@file{foo}, giving that definition precedence over the later definition in +@file{bar}; unfortunately, the @code{override} directive would also +override any command line definitions. So, @file{bar} could +include:@refill + +@example +@group +ifdef bletch +ifeq "$(origin bletch)" "environment" +bletch = barf, gag, etc. +endif +endif +@end group +@end example + +@noindent +If @code{bletch} has been defined from the environment, this will redefine +it. + +If you want to override a previous definition of @code{bletch} if it came +from the environment, even under @samp{-e}, you could instead write: + +@example +@group +ifneq "$(findstring environment,$(origin bletch))" "" +bletch = barf, gag, etc. +endif +@end group +@end example + +Here the redefinition takes place if @samp{$(origin bletch)} returns either +@samp{environment} or @samp{environment override}. +@xref{Text Functions, , Functions for String Substitution and Analysis}. + +@node Flavor Function, Shell Function, Origin Function, Functions +@section The @code{flavor} Function +@findex flavor +@cindex variables, flavor of +@cindex flavor of variable + +The @code{flavor} function is unlike most other functions (and like +@code{origin} function) in that it does not operate on the values of +variables; it tells you something @emph{about} a variable. +Specifically, it tells you the flavor of a variable (@pxref{Flavors, +,The Two Flavors of Variables}). + +The syntax of the @code{flavor} function is: + +@example +$(flavor @var{variable}) +@end example + +Note that @var{variable} is the @emph{name} of a variable to inquire about; +not a @emph{reference} to that variable. Therefore you would not normally +use a @samp{$} or parentheses when writing it. (You can, however, use a +variable reference in the name if you want the name not to be a constant.) + +The result of this function is a string that identifies the flavor of the +variable @var{variable}: + +@table @samp +@item undefined + +if @var{variable} was never defined. + +@item recursive + +if @var{variable} is a recursively expanded variable. + +@item simple + +if @var{variable} is a simply expanded variable. + +@end table + + +@node Shell Function, Make Control Functions, Flavor Function, Functions +@section The @code{shell} Function +@findex shell +@cindex command expansion +@cindex backquotes +@cindex shell command, function for + +The @code{shell} function is unlike any other function other than the +@code{wildcard} function +(@pxref{Wildcard Function, ,The Function @code{wildcard}}) in that it +communicates with the world outside of @code{make}. + +The @code{shell} function performs the same function that backquotes +(@samp{`}) perform in most shells: it does @dfn{command expansion}. +This means that it takes as an argument a shell command and evaluates +to the output of the command. The only processing @code{make} does on +the result is to convert each newline (or carriage-return / newline +pair) to a single space. If there is a trailing (carriage-return +and) newline it will simply be removed.@refill + +The commands run by calls to the @code{shell} function are run when the +function calls are expanded (@pxref{Reading Makefiles, , How +@code{make} Reads a Makefile}). Because this function involves +spawning a new shell, you should carefully consider the performance +implications of using the @code{shell} function within recursively +expanded variables vs.@: simply expanded variables (@pxref{Flavors, ,The +Two Flavors of Variables}). + +Here are some examples of the use of the @code{shell} function: + +@example +contents := $(shell cat foo) +@end example + +@noindent +sets @code{contents} to the contents of the file @file{foo}, with a space +(rather than a newline) separating each line. + +@example +files := $(shell echo *.c) +@end example + +@noindent +sets @code{files} to the expansion of @samp{*.c}. Unless @code{make} is +using a very strange shell, this has the same result as +@w{@samp{$(wildcard *.c)}} (as long as at least one @samp{.c} file +exists).@refill + +@node Make Control Functions, , Shell Function, Functions +@section Functions That Control Make +@cindex functions, for controlling make +@cindex controlling make + +These functions control the way make runs. Generally, they are used to +provide information to the user of the makefile or to cause make to stop +if some sort of environmental error is detected. + +@table @code +@item $(error @var{text}@dots{}) +@findex error +@cindex error, stopping on +@cindex stopping make +Generates a fatal error where the message is @var{text}. Note that +the error is generated whenever this function is evaluated. So, if +you put it inside a recipe or on the right side of a recursive +variable assignment, it won't be evaluated until later. The +@var{text} will be expanded before the error is generated. + +For example, + +@example +ifdef ERROR1 +$(error error is $(ERROR1)) +endif +@end example + +@noindent +will generate a fatal error during the read of the makefile if the +@code{make} variable @code{ERROR1} is defined. Or, + +@example +ERR = $(error found an error!) + +.PHONY: err +err: ; $(ERR) +@end example + +@noindent +will generate a fatal error while @code{make} is running, if the +@code{err} target is invoked. + +@item $(warning @var{text}@dots{}) +@findex warning +@cindex warnings, printing +@cindex printing user warnings +This function works similarly to the @code{error} function, above, +except that @code{make} doesn't exit. Instead, @var{text} is expanded +and the resulting message is displayed, but processing of the makefile +continues. + +The result of the expansion of this function is the empty string. + +@item $(info @var{text}@dots{}) +@findex info +@cindex printing messages +This function does nothing more than print its (expanded) argument(s) +to standard output. No makefile name or line number is added. The +result of the expansion of this function is the empty string. +@end table + +@node Running, Implicit Rules, Functions, Top +@chapter How to Run @code{make} + +A makefile that says how to recompile a program can be used in more +than one way. The simplest use is to recompile every file that is out +of date. Usually, makefiles are written so that if you run +@code{make} with no arguments, it does just that. + +But you might want to update only some of the files; you might want to use +a different compiler or different compiler options; you might want just to +find out which files are out of date without changing them. + +By giving arguments when you run @code{make}, you can do any of these +things and many others. + +@cindex exit status of make +The exit status of @code{make} is always one of three values: +@table @code +@item 0 +The exit status is zero if @code{make} is successful. +@item 2 +The exit status is two if @code{make} encounters any errors. +It will print messages describing the particular errors. +@item 1 +The exit status is one if you use the @samp{-q} flag and @code{make} +determines that some target is not already up to date. +@xref{Instead of Execution, ,Instead of Executing Recipes}. +@end table + +@menu +* Makefile Arguments:: How to specify which makefile to use. +* Goals:: How to use goal arguments to specify which + parts of the makefile to use. +* Instead of Execution:: How to use mode flags to specify what + kind of thing to do with the recipes + in the makefile other than simply + execute them. +* Avoiding Compilation:: How to avoid recompiling certain files. +* Overriding:: How to override a variable to specify + an alternate compiler and other things. +* Testing:: How to proceed past some errors, to + test compilation. +* Options Summary:: Summary of Options +@end menu + +@node Makefile Arguments, Goals, Running, Running +@section Arguments to Specify the Makefile +@cindex @code{--file} +@cindex @code{--makefile} +@cindex @code{-f} + +The way to specify the name of the makefile is with the @samp{-f} or +@samp{--file} option (@samp{--makefile} also works). For example, +@samp{-f altmake} says to use the file @file{altmake} as the makefile. + +If you use the @samp{-f} flag several times and follow each @samp{-f} +with an argument, all the specified files are used jointly as +makefiles. + +If you do not use the @samp{-f} or @samp{--file} flag, the default is +to try @file{GNUmakefile}, @file{makefile}, and @file{Makefile}, in +that order, and use the first of these three which exists or can be made +(@pxref{Makefiles, ,Writing Makefiles}).@refill + +@node Goals, Instead of Execution, Makefile Arguments, Running +@section Arguments to Specify the Goals +@cindex goal, how to specify + +The @dfn{goals} are the targets that @code{make} should strive ultimately +to update. Other targets are updated as well if they appear as +prerequisites of goals, or prerequisites of prerequisites of goals, etc. + +By default, the goal is the first target in the makefile (not counting +targets that start with a period). Therefore, makefiles are usually +written so that the first target is for compiling the entire program or +programs they describe. If the first rule in the makefile has several +targets, only the first target in the rule becomes the default goal, not +the whole list. You can manage the selection of the default goal from +within your makefile using the @code{.DEFAULT_GOAL} variable +(@pxref{Special Variables, , Other Special Variables}). + +You can also specify a different goal or goals with command line +arguments to @code{make}. Use the name of the goal as an argument. +If you specify several goals, @code{make} processes each of them in +turn, in the order you name them. + +Any target in the makefile may be specified as a goal (unless it +starts with @samp{-} or contains an @samp{=}, in which case it will be +parsed as a switch or variable definition, respectively). Even +targets not in the makefile may be specified, if @code{make} can find +implicit rules that say how to make them. + +@vindex MAKECMDGOALS +@code{Make} will set the special variable @code{MAKECMDGOALS} to the +list of goals you specified on the command line. If no goals were given +on the command line, this variable is empty. Note that this variable +should be used only in special circumstances. + +An example of appropriate use is to avoid including @file{.d} files +during @code{clean} rules (@pxref{Automatic Prerequisites}), so +@code{make} won't create them only to immediately remove them +again:@refill + +@example +@group +sources = foo.c bar.c + +ifneq ($(MAKECMDGOALS),clean) +include $(sources:.c=.d) +endif +@end group +@end example + +One use of specifying a goal is if you want to compile only a part of +the program, or only one of several programs. Specify as a goal each +file that you wish to remake. For example, consider a directory containing +several programs, with a makefile that starts like this: + +@example +.PHONY: all +all: size nm ld ar as +@end example + +If you are working on the program @code{size}, you might want to say +@w{@samp{make size}} so that only the files of that program are recompiled. + +Another use of specifying a goal is to make files that are not normally +made. For example, there may be a file of debugging output, or a +version of the program that is compiled specially for testing, which has +a rule in the makefile but is not a prerequisite of the default goal. + +Another use of specifying a goal is to run the recipe associated with +a phony target (@pxref{Phony Targets}) or empty target (@pxref{Empty +Targets, ,Empty Target Files to Record Events}). Many makefiles contain +a phony target named @file{clean} which deletes everything except source +files. Naturally, this is done only if you request it explicitly with +@w{@samp{make clean}}. Following is a list of typical phony and empty +target names. @xref{Standard Targets}, for a detailed list of all the +standard target names which GNU software packages use. + +@table @file +@item all +@cindex @code{all} @r{(standard target)} +Make all the top-level targets the makefile knows about. + +@item clean +@cindex @code{clean} @r{(standard target)} +Delete all files that are normally created by running @code{make}. + +@item mostlyclean +@cindex @code{mostlyclean} @r{(standard target)} +Like @samp{clean}, but may refrain from deleting a few files that people +normally don't want to recompile. For example, the @samp{mostlyclean} +target for GCC does not delete @file{libgcc.a}, because recompiling it +is rarely necessary and takes a lot of time. + +@item distclean +@cindex @code{distclean} @r{(standard target)} +@itemx realclean +@cindex @code{realclean} @r{(standard target)} +@itemx clobber +@cindex @code{clobber} @r{(standard target)} +Any of these targets might be defined to delete @emph{more} files than +@samp{clean} does. For example, this would delete configuration files +or links that you would normally create as preparation for compilation, +even if the makefile itself cannot create these files. + +@item install +@cindex @code{install} @r{(standard target)} +Copy the executable file into a directory that users typically search +for commands; copy any auxiliary files that the executable uses into +the directories where it will look for them. + +@item print +@cindex @code{print} @r{(standard target)} +Print listings of the source files that have changed. + +@item tar +@cindex @code{tar} @r{(standard target)} +Create a tar file of the source files. + +@item shar +@cindex @code{shar} @r{(standard target)} +Create a shell archive (shar file) of the source files. + +@item dist +@cindex @code{dist} @r{(standard target)} +Create a distribution file of the source files. This might +be a tar file, or a shar file, or a compressed version of one of the +above, or even more than one of the above. + +@item TAGS +@cindex @code{TAGS} @r{(standard target)} +Update a tags table for this program. + +@item check +@cindex @code{check} @r{(standard target)} +@itemx test +@cindex @code{test} @r{(standard target)} +Perform self tests on the program this makefile builds. +@end table + +@node Instead of Execution, Avoiding Compilation, Goals, Running +@section Instead of Executing Recipes +@cindex execution, instead of +@cindex recipes, instead of executing + +The makefile tells @code{make} how to tell whether a target is up to date, +and how to update each target. But updating the targets is not always +what you want. Certain options specify other activities for @code{make}. + +@comment Extra blank lines make it print better. +@table @samp +@item -n +@itemx --just-print +@itemx --dry-run +@itemx --recon +@cindex @code{--just-print} +@cindex @code{--dry-run} +@cindex @code{--recon} +@cindex @code{-n} + +``No-op''. The activity is to print what recipe would be used to make +the targets up to date, but not actually execute it. Some recipes are +still executed, even with this flag (@pxref{MAKE Variable, ,How the @code{MAKE} Variable Works}). + +@item -t +@itemx --touch +@cindex @code{--touch} +@cindex touching files +@cindex target, touching +@cindex @code{-t} + +``Touch''. The activity is to mark the targets as up to date without +actually changing them. In other words, @code{make} pretends to compile +the targets but does not really change their contents. + +@item -q +@itemx --question +@cindex @code{--question} +@cindex @code{-q} +@cindex question mode + +``Question''. The activity is to find out silently whether the targets +are up to date already; but execute no recipe in either case. In other +words, neither compilation nor output will occur. + +@item -W @var{file} +@itemx --what-if=@var{file} +@itemx --assume-new=@var{file} +@itemx --new-file=@var{file} +@cindex @code{--what-if} +@cindex @code{-W} +@cindex @code{--assume-new} +@cindex @code{--new-file} +@cindex what if +@cindex files, assuming new + +``What if''. Each @samp{-W} flag is followed by a file name. The given +files' modification times are recorded by @code{make} as being the present +time, although the actual modification times remain the same. +You can use the @samp{-W} flag in conjunction with the @samp{-n} flag +to see what would happen if you were to modify specific files.@refill +@end table + +With the @samp{-n} flag, @code{make} prints the recipe that it would +normally execute but usually does not execute it. + +With the @samp{-t} flag, @code{make} ignores the recipes in the rules +and uses (in effect) the command @code{touch} for each target that needs to +be remade. The @code{touch} command is also printed, unless @samp{-s} or +@code{.SILENT} is used. For speed, @code{make} does not actually invoke +the program @code{touch}. It does the work directly. + +With the @samp{-q} flag, @code{make} prints nothing and executes no +recipes, but the exit status code it returns is zero if and only if the +targets to be considered are already up to date. If the exit status is +one, then some updating needs to be done. If @code{make} encounters an +error, the exit status is two, so you can distinguish an error from a +target that is not up to date. + +It is an error to use more than one of these three flags in the same +invocation of @code{make}. + +@cindex +, and recipe execution +The @samp{-n}, @samp{-t}, and @samp{-q} options do not affect recipe +lines that begin with @samp{+} characters or contain the strings +@samp{$(MAKE)} or @samp{$@{MAKE@}}. Note that only the line containing +the @samp{+} character or the strings @samp{$(MAKE)} or @samp{$@{MAKE@}} +is run regardless of these options. Other lines in the same rule are +not run unless they too begin with @samp{+} or contain @samp{$(MAKE)} or +@samp{$@{MAKE@}} (@xref{MAKE Variable, ,How the @code{MAKE} Variable Works}.) + +@cindex phony targets and recipe execution +The @samp{-t} flag prevents phony targets (@pxref{Phony Targets}) from +being updated, unless there are recipe lines beginning with @samp{+} +or containing @samp{$(MAKE)} or @samp{$@{MAKE@}}. + +The @samp{-W} flag provides two features: + +@itemize @bullet +@item +If you also use the @samp{-n} or @samp{-q} flag, you can see what +@code{make} would do if you were to modify some files. + +@item +Without the @samp{-n} or @samp{-q} flag, when @code{make} is actually +executing recipes, the @samp{-W} flag can direct @code{make} to act as +if some files had been modified, without actually running the recipes +for those files.@refill +@end itemize + +Note that the options @samp{-p} and @samp{-v} allow you to obtain other +information about @code{make} or about the makefiles in use +(@pxref{Options Summary, ,Summary of Options}).@refill + +@node Avoiding Compilation, Overriding, Instead of Execution, Running +@section Avoiding Recompilation of Some Files +@cindex @code{-o} +@cindex @code{--old-file} +@cindex @code{--assume-old} +@cindex files, assuming old +@cindex files, avoiding recompilation of +@cindex recompilation, avoiding + +Sometimes you may have changed a source file but you do not want to +recompile all the files that depend on it. For example, suppose you add +a macro or a declaration to a header file that many other files depend +on. Being conservative, @code{make} assumes that any change in the +header file requires recompilation of all dependent files, but you know +that they do not need to be recompiled and you would rather not waste +the time waiting for them to compile. + +If you anticipate the problem before changing the header file, you can +use the @samp{-t} flag. This flag tells @code{make} not to run the +recipes in the rules, but rather to mark the target up to date by +changing its last-modification date. You would follow this procedure: + +@enumerate +@item +Use the command @samp{make} to recompile the source files that really +need recompilation, ensuring that the object files are up-to-date +before you begin. + +@item +Make the changes in the header files. + +@item +Use the command @samp{make -t} to mark all the object files as +up to date. The next time you run @code{make}, the changes in the +header files will not cause any recompilation. +@end enumerate + +If you have already changed the header file at a time when some files +do need recompilation, it is too late to do this. Instead, you can +use the @w{@samp{-o @var{file}}} flag, which marks a specified file as +``old'' (@pxref{Options Summary, ,Summary of Options}). This means +that the file itself will not be remade, and nothing else will be +remade on its account. Follow this procedure: + +@enumerate +@item +Recompile the source files that need compilation for reasons independent +of the particular header file, with @samp{make -o @var{headerfile}}. +If several header files are involved, use a separate @samp{-o} option +for each header file. + +@item +Touch all the object files with @samp{make -t}. +@end enumerate + +@node Overriding, Testing, Avoiding Compilation, Running +@section Overriding Variables +@cindex overriding variables with arguments +@cindex variables, overriding with arguments +@cindex command line variables +@cindex variables, command line + +An argument that contains @samp{=} specifies the value of a variable: +@samp{@var{v}=@var{x}} sets the value of the variable @var{v} to @var{x}. +If you specify a value in this way, all ordinary assignments of the same +variable in the makefile are ignored; we say they have been +@dfn{overridden} by the command line argument. + +The most common way to use this facility is to pass extra flags to +compilers. For example, in a properly written makefile, the variable +@code{CFLAGS} is included in each recipe that runs the C compiler, so a +file @file{foo.c} would be compiled something like this: + +@example +cc -c $(CFLAGS) foo.c +@end example + +Thus, whatever value you set for @code{CFLAGS} affects each compilation +that occurs. The makefile probably specifies the usual value for +@code{CFLAGS}, like this: + +@example +CFLAGS=-g +@end example + +Each time you run @code{make}, you can override this value if you +wish. For example, if you say @samp{make CFLAGS='-g -O'}, each C +compilation will be done with @samp{cc -c -g -O}. (This also +illustrates how you can use quoting in the shell to enclose spaces and +other special characters in the value of a variable when you override +it.) + +The variable @code{CFLAGS} is only one of many standard variables that +exist just so that you can change them this way. @xref{Implicit +Variables, , Variables Used by Implicit Rules}, for a complete list. + +You can also program the makefile to look at additional variables of your +own, giving the user the ability to control other aspects of how the +makefile works by changing the variables. + +When you override a variable with a command line argument, you can +define either a recursively-expanded variable or a simply-expanded +variable. The examples shown above make a recursively-expanded +variable; to make a simply-expanded variable, write @samp{:=} instead +of @samp{=}. But, unless you want to include a variable reference or +function call in the @emph{value} that you specify, it makes no +difference which kind of variable you create. + +There is one way that the makefile can change a variable that you have +overridden. This is to use the @code{override} directive, which is a line +that looks like this: @samp{override @var{variable} = @var{value}} +(@pxref{Override Directive, ,The @code{override} Directive}). + +@node Testing, Options Summary, Overriding, Running +@section Testing the Compilation of a Program +@cindex testing compilation +@cindex compilation, testing + +Normally, when an error happens in executing a shell command, @code{make} +gives up immediately, returning a nonzero status. No further recipes are +executed for any target. The error implies that the goal cannot be +correctly remade, and @code{make} reports this as soon as it knows. + +When you are compiling a program that you have just changed, this is not +what you want. Instead, you would rather that @code{make} try compiling +every file that can be tried, to show you as many compilation errors +as possible. + +@cindex @code{-k} +@cindex @code{--keep-going} +On these occasions, you should use the @samp{-k} or +@samp{--keep-going} flag. This tells @code{make} to continue to +consider the other prerequisites of the pending targets, remaking them +if necessary, before it gives up and returns nonzero status. For +example, after an error in compiling one object file, @samp{make -k} +will continue compiling other object files even though it already +knows that linking them will be impossible. In addition to continuing +after failed shell commands, @samp{make -k} will continue as much as +possible after discovering that it does not know how to make a target +or prerequisite file. This will always cause an error message, but +without @samp{-k}, it is a fatal error (@pxref{Options Summary, +,Summary of Options}).@refill + +The usual behavior of @code{make} assumes that your purpose is to get the +goals up to date; once @code{make} learns that this is impossible, it might +as well report the failure immediately. The @samp{-k} flag says that the +real purpose is to test as much as possible of the changes made in the +program, perhaps to find several independent problems so that you can +correct them all before the next attempt to compile. This is why Emacs' +@kbd{M-x compile} command passes the @samp{-k} flag by default. + +@node Options Summary, , Testing, Running +@section Summary of Options +@cindex options +@cindex flags +@cindex switches + +Here is a table of all the options @code{make} understands: + +@table @samp +@item -b +@cindex @code{-b} +@itemx -m +@cindex @code{-m} +These options are ignored for compatibility with other versions of @code{make}. + +@item -B +@cindex @code{-B} +@itemx --always-make +@cindex @code{--always-make} +Consider all targets out-of-date. GNU @code{make} proceeds to +consider targets and their prerequisites using the normal algorithms; +however, all targets so considered are always remade regardless of the +status of their prerequisites. To avoid infinite recursion, if +@code{MAKE_RESTARTS} (@pxref{Special Variables, , Other Special +Variables}) is set to a number greater than 0 this option is disabled +when considering whether to remake makefiles (@pxref{Remaking +Makefiles, , How Makefiles Are Remade}). + +@item -C @var{dir} +@cindex @code{-C} +@itemx --directory=@var{dir} +@cindex @code{--directory} +Change to directory @var{dir} before reading the makefiles. If multiple +@samp{-C} options are specified, each is interpreted relative to the +previous one: @samp{-C / -C etc} is equivalent to @samp{-C /etc}. +This is typically used with recursive invocations of @code{make} +(@pxref{Recursion, ,Recursive Use of @code{make}}). + +@item -d +@cindex @code{-d} +@c Extra blank line here makes the table look better. + +Print debugging information in addition to normal processing. The +debugging information says which files are being considered for +remaking, which file-times are being compared and with what results, +which files actually need to be remade, which implicit rules are +considered and which are applied---everything interesting about how +@code{make} decides what to do. The @code{-d} option is equivalent to +@samp{--debug=a} (see below). + +@item --debug[=@var{options}] +@cindex @code{--debug} +@c Extra blank line here makes the table look better. + +Print debugging information in addition to normal processing. Various +levels and types of output can be chosen. With no arguments, print the +``basic'' level of debugging. Possible arguments are below; only the +first character is considered, and values must be comma- or +space-separated. + +@table @code +@item a (@i{all}) +All types of debugging output are enabled. This is equivalent to using +@samp{-d}. + +@item b (@i{basic}) +Basic debugging prints each target that was found to be out-of-date, and +whether the build was successful or not. + +@item v (@i{verbose}) +A level above @samp{basic}; includes messages about which makefiles were +parsed, prerequisites that did not need to be rebuilt, etc. This option +also enables @samp{basic} messages. + +@item i (@i{implicit}) +Prints messages describing the implicit rule searches for each target. +This option also enables @samp{basic} messages. + +@item j (@i{jobs}) +Prints messages giving details on the invocation of specific subcommands. + +@item m (@i{makefile}) +By default, the above messages are not enabled while trying to remake +the makefiles. This option enables messages while rebuilding makefiles, +too. Note that the @samp{all} option does enable this option. This +option also enables @samp{basic} messages. +@end table + +@item -e +@cindex @code{-e} +@itemx --environment-overrides +@cindex @code{--environment-overrides} +Give variables taken from the environment precedence +over variables from makefiles. +@xref{Environment, ,Variables from the Environment}. + +@item --eval=@var{string} +@cindex @code{--eval} +@c Extra blank line here makes the table look better. + +Evaluate @var{string} as makefile syntax. This is a command-line +version of the @code{eval} function (@pxref{Eval Function}). The +evaluation is performed after the default rules and variables have +been defined, but before any makefiles are read. + +@item -f @var{file} +@cindex @code{-f} +@itemx --file=@var{file} +@cindex @code{--file} +@itemx --makefile=@var{file} +@cindex @code{--makefile} +Read the file named @var{file} as a makefile. +@xref{Makefiles, ,Writing Makefiles}. + +@item -h +@cindex @code{-h} +@itemx --help +@cindex @code{--help} +@c Extra blank line here makes the table look better. + +Remind you of the options that @code{make} understands and then exit. + +@item -i +@cindex @code{-i} +@itemx --ignore-errors +@cindex @code{--ignore-errors} +Ignore all errors in recipes executed to remake files. +@xref{Errors, ,Errors in Recipes}. + +@item -I @var{dir} +@cindex @code{-I} +@itemx --include-dir=@var{dir} +@cindex @code{--include-dir} +Specifies a directory @var{dir} to search for included makefiles. +@xref{Include, ,Including Other Makefiles}. If several @samp{-I} +options are used to specify several directories, the directories are +searched in the order specified. + +@item -j [@var{jobs}] +@cindex @code{-j} +@itemx --jobs[=@var{jobs}] +@cindex @code{--jobs} +Specifies the number of recipes (jobs) to run simultaneously. With no +argument, @code{make} runs as many recipes simultaneously as possible. +If there is more than one @samp{-j} option, the last one is effective. +@xref{Parallel, ,Parallel Execution}, for more information on how +recipes are run. Note that this option is ignored on MS-DOS. + +@item -k +@cindex @code{-k} +@itemx --keep-going +@cindex @code{--keep-going} +Continue as much as possible after an error. While the target that +failed, and those that depend on it, cannot be remade, the other +prerequisites of these targets can be processed all the same. +@xref{Testing, ,Testing the Compilation of a Program}. + +@item -l [@var{load}] +@cindex @code{-l} +@itemx --load-average[=@var{load}] +@cindex @code{--load-average} +@itemx --max-load[=@var{load}] +@cindex @code{--max-load} +Specifies that no new recipes should be started if there are other +recipes running and the load average is at least @var{load} (a +floating-point number). With no argument, removes a previous load +limit. @xref{Parallel, ,Parallel Execution}. + +@item -L +@cindex @code{-L} +@itemx --check-symlink-times +@cindex @code{--check-symlink-times} +On systems that support symbolic links, this option causes @code{make} +to consider the timestamps on any symbolic links in addition to the +timestamp on the file referenced by those links. When this option is +provided, the most recent timestamp among the file and the symbolic +links is taken as the modification time for this target file. + +@item -n +@cindex @code{-n} +@itemx --just-print +@cindex @code{--just-print} +@itemx --dry-run +@cindex @code{--dry-run} +@itemx --recon +@cindex @code{--recon} +@c Extra blank line here makes the table look better. + +Print the recipe that would be executed, but do not execute it (except +in certain circumstances). +@xref{Instead of Execution, ,Instead of Executing Recipes}. + +@item -o @var{file} +@cindex @code{-o} +@itemx --old-file=@var{file} +@cindex @code{--old-file} +@itemx --assume-old=@var{file} +@cindex @code{--assume-old} +Do not remake the file @var{file} even if it is older than its +prerequisites, and do not remake anything on account of changes in +@var{file}. Essentially the file is treated as very old and its rules +are ignored. @xref{Avoiding Compilation, ,Avoiding Recompilation of +Some Files}.@refill + +@item -p +@cindex @code{-p} +@itemx --print-data-base +@cindex @code{--print-data-base} +@cindex data base of @code{make} rules +@cindex predefined rules and variables, printing +Print the data base (rules and variable values) that results from +reading the makefiles; then execute as usual or as otherwise +specified. This also prints the version information given by the +@samp{-v} switch (see below). To print the data base without trying +to remake any files, use @w{@samp{make -qp}}. To print the data base +of predefined rules and variables, use @w{@samp{make -p -f /dev/null}}. +The data base output contains filename and linenumber information for +recipe and variable definitions, so it can be a useful debugging tool +in complex environments. + +@item -q +@cindex @code{-q} +@itemx --question +@cindex @code{--question} +``Question mode''. Do not run any recipes, or print anything; just +return an exit status that is zero if the specified targets are already +up to date, one if any remaking is required, or two if an error is +encountered. @xref{Instead of Execution, ,Instead of Executing +Recipes}.@refill + +@item -r +@cindex @code{-r} +@itemx --no-builtin-rules +@cindex @code{--no-builtin-rules} +Eliminate use of the built-in implicit rules (@pxref{Implicit Rules, +,Using Implicit Rules}). You can still define your own by writing +pattern rules (@pxref{Pattern Rules, ,Defining and Redefining Pattern +Rules}). The @samp{-r} option also clears out the default list of +suffixes for suffix rules (@pxref{Suffix Rules, ,Old-Fashioned Suffix +Rules}). But you can still define your own suffixes with a rule for +@code{.SUFFIXES}, and then define your own suffix rules. Note that only +@emph{rules} are affected by the @code{-r} option; default variables +remain in effect (@pxref{Implicit Variables, ,Variables Used by Implicit +Rules}); see the @samp{-R} option below. + +@item -R +@cindex @code{-R} +@itemx --no-builtin-variables +@cindex @code{--no-builtin-variables} +Eliminate use of the built-in rule-specific variables (@pxref{Implicit +Variables, ,Variables Used by Implicit Rules}). You can still define +your own, of course. The @samp{-R} option also automatically enables +the @samp{-r} option (see above), since it doesn't make sense to have +implicit rules without any definitions for the variables that they use. + +@item -s +@cindex @code{-s} +@itemx --silent +@cindex @code{--silent} +@itemx --quiet +@cindex @code{--quiet} +@c Extra blank line here makes the table look better. + +Silent operation; do not print the recipes as they are executed. +@xref{Echoing, ,Recipe Echoing}. + +@item -S +@cindex @code{-S} +@itemx --no-keep-going +@cindex @code{--no-keep-going} +@itemx --stop +@cindex @code{--stop} +@c Extra blank line here makes the table look better. + +Cancel the effect of the @samp{-k} option. This is never necessary +except in a recursive @code{make} where @samp{-k} might be inherited +from the top-level @code{make} via @code{MAKEFLAGS} +(@pxref{Recursion, ,Recursive Use of @code{make}}) +or if you set @samp{-k} in @code{MAKEFLAGS} in your environment.@refill + +@item -t +@cindex @code{-t} +@itemx --touch +@cindex @code{--touch} +@c Extra blank line here makes the table look better. + +Touch files (mark them up to date without really changing them) +instead of running their recipes. This is used to pretend that the +recipes were done, in order to fool future invocations of +@code{make}. @xref{Instead of Execution, ,Instead of Executing Recipes}. + +@item -v +@cindex @code{-v} +@itemx --version +@cindex @code{--version} +Print the version of the @code{make} program plus a copyright, a list +of authors, and a notice that there is no warranty; then exit. + +@item -w +@cindex @code{-w} +@itemx --print-directory +@cindex @code{--print-directory} +Print a message containing the working directory both before and after +executing the makefile. This may be useful for tracking down errors +from complicated nests of recursive @code{make} commands. +@xref{Recursion, ,Recursive Use of @code{make}}. (In practice, you +rarely need to specify this option since @samp{make} does it for you; +see @ref{-w Option, ,The @samp{--print-directory} Option}.) + +@itemx --no-print-directory +@cindex @code{--no-print-directory} +Disable printing of the working directory under @code{-w}. +This option is useful when @code{-w} is turned on automatically, +but you do not want to see the extra messages. +@xref{-w Option, ,The @samp{--print-directory} Option}. + +@item -W @var{file} +@cindex @code{-W} +@itemx --what-if=@var{file} +@cindex @code{--what-if} +@itemx --new-file=@var{file} +@cindex @code{--new-file} +@itemx --assume-new=@var{file} +@cindex @code{--assume-new} +Pretend that the target @var{file} has just been modified. When used +with the @samp{-n} flag, this shows you what would happen if you were +to modify that file. Without @samp{-n}, it is almost the same as +running a @code{touch} command on the given file before running +@code{make}, except that the modification time is changed only in the +imagination of @code{make}. +@xref{Instead of Execution, ,Instead of Executing Recipes}. + +@item --warn-undefined-variables +@cindex @code{--warn-undefined-variables} +@cindex variables, warning for undefined +@cindex undefined variables, warning message +Issue a warning message whenever @code{make} sees a reference to an +undefined variable. This can be helpful when you are trying to debug +makefiles which use variables in complex ways. +@end table + +@node Implicit Rules, Archives, Running, Top +@chapter Using Implicit Rules +@cindex implicit rule +@cindex rule, implicit + +Certain standard ways of remaking target files are used very often. For +example, one customary way to make an object file is from a C source file +using the C compiler, @code{cc}. + +@dfn{Implicit rules} tell @code{make} how to use customary techniques so +that you do not have to specify them in detail when you want to use +them. For example, there is an implicit rule for C compilation. File +names determine which implicit rules are run. For example, C +compilation typically takes a @file{.c} file and makes a @file{.o} file. +So @code{make} applies the implicit rule for C compilation when it sees +this combination of file name endings.@refill + +A chain of implicit rules can apply in sequence; for example, @code{make} +will remake a @file{.o} file from a @file{.y} file by way of a @file{.c} file. +@iftex +@xref{Chained Rules, ,Chains of Implicit Rules}. +@end iftex + +The built-in implicit rules use several variables in their recipes so +that, by changing the values of the variables, you can change the way the +implicit rule works. For example, the variable @code{CFLAGS} controls the +flags given to the C compiler by the implicit rule for C compilation. +@iftex +@xref{Implicit Variables, ,Variables Used by Implicit Rules}. +@end iftex + +You can define your own implicit rules by writing @dfn{pattern rules}. +@iftex +@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}. +@end iftex + +@dfn{Suffix rules} are a more limited way to define implicit rules. +Pattern rules are more general and clearer, but suffix rules are +retained for compatibility. +@iftex +@xref{Suffix Rules, ,Old-Fashioned Suffix Rules}. +@end iftex + +@menu +* Using Implicit:: How to use an existing implicit rule + to get the recipes for updating a file. +* Catalogue of Rules:: A list of built-in implicit rules. +* Implicit Variables:: How to change what predefined rules do. +* Chained Rules:: How to use a chain of implicit rules. +* Pattern Rules:: How to define new implicit rules. +* Last Resort:: How to define recipes for rules which + cannot find any. +* Suffix Rules:: The old-fashioned style of implicit rule. +* Implicit Rule Search:: The precise algorithm for applying + implicit rules. +@end menu + +@node Using Implicit, Catalogue of Rules, Implicit Rules, Implicit Rules +@section Using Implicit Rules +@cindex implicit rule, how to use +@cindex rule, implicit, how to use + +To allow @code{make} to find a customary method for updating a target +file, all you have to do is refrain from specifying recipes yourself. +Either write a rule with no recipe, or don't write a rule at all. +Then @code{make} will figure out which implicit rule to use based on +which kind of source file exists or can be made. + +For example, suppose the makefile looks like this: + +@example +foo : foo.o bar.o + cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS) +@end example + +@noindent +Because you mention @file{foo.o} but do not give a rule for it, @code{make} +will automatically look for an implicit rule that tells how to update it. +This happens whether or not the file @file{foo.o} currently exists. + +If an implicit rule is found, it can supply both a recipe and one or +more prerequisites (the source files). You would want to write a rule +for @file{foo.o} with no recipe if you need to specify additional +prerequisites, such as header files, that the implicit rule cannot +supply. + +Each implicit rule has a target pattern and prerequisite patterns. There may +be many implicit rules with the same target pattern. For example, numerous +rules make @samp{.o} files: one, from a @samp{.c} file with the C compiler; +another, from a @samp{.p} file with the Pascal compiler; and so on. The rule +that actually applies is the one whose prerequisites exist or can be made. +So, if you have a file @file{foo.c}, @code{make} will run the C compiler; +otherwise, if you have a file @file{foo.p}, @code{make} will run the Pascal +compiler; and so on. + +Of course, when you write the makefile, you know which implicit rule you +want @code{make} to use, and you know it will choose that one because you +know which possible prerequisite files are supposed to exist. +@xref{Catalogue of Rules, ,Catalogue of Implicit Rules}, +for a catalogue of all the predefined implicit rules. + +Above, we said an implicit rule applies if the required prerequisites ``exist +or can be made''. A file ``can be made'' if it is mentioned explicitly in +the makefile as a target or a prerequisite, or if an implicit rule can be +recursively found for how to make it. When an implicit prerequisite is the +result of another implicit rule, we say that @dfn{chaining} is occurring. +@xref{Chained Rules, ,Chains of Implicit Rules}. + +In general, @code{make} searches for an implicit rule for each target, and +for each double-colon rule, that has no recipe. A file that is mentioned +only as a prerequisite is considered a target whose rule specifies nothing, +so implicit rule search happens for it. @xref{Implicit Rule Search, ,Implicit Rule Search Algorithm}, for the +details of how the search is done. + +Note that explicit prerequisites do not influence implicit rule search. +For example, consider this explicit rule: + +@example +foo.o: foo.p +@end example + +@noindent +The prerequisite on @file{foo.p} does not necessarily mean that +@code{make} will remake @file{foo.o} according to the implicit rule to +make an object file, a @file{.o} file, from a Pascal source file, a +@file{.p} file. For example, if @file{foo.c} also exists, the implicit +rule to make an object file from a C source file is used instead, +because it appears before the Pascal rule in the list of predefined +implicit rules (@pxref{Catalogue of Rules, , Catalogue of Implicit +Rules}). + +If you do not want an implicit rule to be used for a target that has no +recipe, you can give that target an empty recipe by writing a semicolon +(@pxref{Empty Recipes, ,Defining Empty Recipes}). + +@node Catalogue of Rules, Implicit Variables, Using Implicit, Implicit Rules +@section Catalogue of Implicit Rules +@cindex implicit rule, predefined +@cindex rule, implicit, predefined + +Here is a catalogue of predefined implicit rules which are always +available unless the makefile explicitly overrides or cancels them. +@xref{Canceling Rules, ,Canceling Implicit Rules}, for information on +canceling or overriding an implicit rule. The @samp{-r} or +@samp{--no-builtin-rules} option cancels all predefined rules. + +This manual only documents the default rules available on POSIX-based +operating systems. Other operating systems, such as VMS, Windows, +OS/2, etc. may have different sets of default rules. To see the full +list of default rules and variables available in your version of GNU +@code{make}, run @samp{make -p} in a directory with no makefile. + +Not all of these rules will always be defined, even when the @samp{-r} +option is not given. Many of the predefined implicit rules are +implemented in @code{make} as suffix rules, so which ones will be +defined depends on the @dfn{suffix list} (the list of prerequisites of +the special target @code{.SUFFIXES}). The default suffix list is: +@code{.out}, @code{.a}, @code{.ln}, @code{.o}, @code{.c}, @code{.cc}, +@code{.C}, @code{.cpp}, @code{.p}, @code{.f}, @code{.F}, @code{.m}, +@code{.r}, @code{.y}, @code{.l}, @code{.ym}, @code{.lm}, @code{.s}, +@code{.S}, @code{.mod}, @code{.sym}, @code{.def}, @code{.h}, +@code{.info}, @code{.dvi}, @code{.tex}, @code{.texinfo}, @code{.texi}, +@code{.txinfo}, @code{.w}, @code{.ch} @code{.web}, @code{.sh}, +@code{.elc}, @code{.el}. All of the implicit rules described below +whose prerequisites have one of these suffixes are actually suffix +rules. If you modify the suffix list, the only predefined suffix +rules in effect will be those named by one or two of the suffixes that +are on the list you specify; rules whose suffixes fail to be on the +list are disabled. @xref{Suffix Rules, ,Old-Fashioned Suffix Rules}, +for full details on suffix rules. + +@table @asis +@item Compiling C programs +@cindex C, rule to compile +@pindex cc +@pindex gcc +@pindex .o +@pindex .c +@file{@var{n}.o} is made automatically from @file{@var{n}.c} with +a recipe of the form @samp{$(CC) $(CPPFLAGS) $(CFLAGS) -c}.@refill + +@item Compiling C++ programs +@cindex C++, rule to compile +@pindex g++ +@pindex .cc +@pindex .cpp +@pindex .C +@file{@var{n}.o} is made automatically from @file{@var{n}.cc}, +@file{@var{n}.cpp}, or @file{@var{n}.C} with a recipe of the form +@samp{$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c}. We encourage you to use the +suffix @samp{.cc} for C++ source files instead of @samp{.C}.@refill + +@item Compiling Pascal programs +@cindex Pascal, rule to compile +@pindex pc +@pindex .p +@file{@var{n}.o} is made automatically from @file{@var{n}.p} +with the recipe @samp{$(PC) $(PFLAGS) -c}.@refill + +@item Compiling Fortran and Ratfor programs +@cindex Fortran, rule to compile +@cindex Ratfor, rule to compile +@pindex f77 +@pindex .f +@pindex .r +@pindex .F +@file{@var{n}.o} is made automatically from @file{@var{n}.r}, +@file{@var{n}.F} or @file{@var{n}.f} by running the +Fortran compiler. The precise recipe used is as follows:@refill + +@table @samp +@item .f +@samp{$(FC) $(FFLAGS) -c}. +@item .F +@samp{$(FC) $(FFLAGS) $(CPPFLAGS) -c}. +@item .r +@samp{$(FC) $(FFLAGS) $(RFLAGS) -c}. +@end table + +@item Preprocessing Fortran and Ratfor programs +@file{@var{n}.f} is made automatically from @file{@var{n}.r} or +@file{@var{n}.F}. This rule runs just the preprocessor to convert a +Ratfor or preprocessable Fortran program into a strict Fortran +program. The precise recipe used is as follows:@refill + +@table @samp +@item .F +@samp{$(FC) $(CPPFLAGS) $(FFLAGS) -F}. +@item .r +@samp{$(FC) $(FFLAGS) $(RFLAGS) -F}. +@end table + +@item Compiling Modula-2 programs +@cindex Modula-2, rule to compile +@pindex m2c +@pindex .sym +@pindex .def +@pindex .mod +@file{@var{n}.sym} is made from @file{@var{n}.def} with a recipe +of the form @samp{$(M2C) $(M2FLAGS) $(DEFFLAGS)}. @file{@var{n}.o} +is made from @file{@var{n}.mod}; the form is: +@w{@samp{$(M2C) $(M2FLAGS) $(MODFLAGS)}}.@refill + +@need 1200 +@item Assembling and preprocessing assembler programs +@cindex assembly, rule to compile +@pindex as +@pindex .s +@file{@var{n}.o} is made automatically from @file{@var{n}.s} by +running the assembler, @code{as}. The precise recipe is +@samp{$(AS) $(ASFLAGS)}.@refill + +@pindex .S +@file{@var{n}.s} is made automatically from @file{@var{n}.S} by +running the C preprocessor, @code{cpp}. The precise recipe is +@w{@samp{$(CPP) $(CPPFLAGS)}}. + +@item Linking a single object file +@cindex linking, predefined rule for +@pindex ld +@pindex .o +@file{@var{n}} is made automatically from @file{@var{n}.o} by running +the linker (usually called @code{ld}) via the C compiler. The precise +recipe used is @w{@samp{$(CC) $(LDFLAGS) @var{n}.o $(LOADLIBES) $(LDLIBS)}}. + +This rule does the right thing for a simple program with only one +source file. It will also do the right thing if there are multiple +object files (presumably coming from various other source files), one +of which has a name matching that of the executable file. Thus, + +@example +x: y.o z.o +@end example + +@noindent +when @file{x.c}, @file{y.c} and @file{z.c} all exist will execute: + +@example +@group +cc -c x.c -o x.o +cc -c y.c -o y.o +cc -c z.c -o z.o +cc x.o y.o z.o -o x +rm -f x.o +rm -f y.o +rm -f z.o +@end group +@end example + +@noindent +In more complicated cases, such as when there is no object file whose +name derives from the executable file name, you must write an explicit +recipe for linking. + +Each kind of file automatically made into @samp{.o} object files will +be automatically linked by using the compiler (@samp{$(CC)}, +@samp{$(FC)} or @samp{$(PC)}; the C compiler @samp{$(CC)} is used to +assemble @samp{.s} files) without the @samp{-c} option. This could be +done by using the @samp{.o} object files as intermediates, but it is +faster to do the compiling and linking in one step, so that's how it's +done.@refill + +@item Yacc for C programs +@pindex yacc +@cindex Yacc, rule to run +@pindex .y +@file{@var{n}.c} is made automatically from @file{@var{n}.y} by +running Yacc with the recipe @samp{$(YACC) $(YFLAGS)}. + +@item Lex for C programs +@pindex lex +@cindex Lex, rule to run +@pindex .l +@file{@var{n}.c} is made automatically from @file{@var{n}.l} by +running Lex. The actual recipe is @samp{$(LEX) $(LFLAGS)}. + +@item Lex for Ratfor programs +@file{@var{n}.r} is made automatically from @file{@var{n}.l} by +running Lex. The actual recipe is @samp{$(LEX) $(LFLAGS)}. + +The convention of using the same suffix @samp{.l} for all Lex files +regardless of whether they produce C code or Ratfor code makes it +impossible for @code{make} to determine automatically which of the two +languages you are using in any particular case. If @code{make} is +called upon to remake an object file from a @samp{.l} file, it must +guess which compiler to use. It will guess the C compiler, because +that is more common. If you are using Ratfor, make sure @code{make} +knows this by mentioning @file{@var{n}.r} in the makefile. Or, if you +are using Ratfor exclusively, with no C files, remove @samp{.c} from +the list of implicit rule suffixes with:@refill + +@example +@group +.SUFFIXES: +.SUFFIXES: .o .r .f .l @dots{} +@end group +@end example + +@item Making Lint Libraries from C, Yacc, or Lex programs +@pindex lint +@cindex @code{lint}, rule to run +@pindex .ln +@file{@var{n}.ln} is made from @file{@var{n}.c} by running @code{lint}. +The precise recipe is @w{@samp{$(LINT) $(LINTFLAGS) $(CPPFLAGS) -i}}. +The same recipe is used on the C code produced from +@file{@var{n}.y} or @file{@var{n}.l}.@refill + +@item @TeX{} and Web +@cindex @TeX{}, rule to run +@cindex Web, rule to run +@pindex tex +@pindex cweave +@pindex weave +@pindex tangle +@pindex ctangle +@pindex .dvi +@pindex .tex +@pindex .web +@pindex .w +@pindex .ch +@file{@var{n}.dvi} is made from @file{@var{n}.tex} with the recipe +@samp{$(TEX)}. @file{@var{n}.tex} is made from @file{@var{n}.web} with +@samp{$(WEAVE)}, or from @file{@var{n}.w} (and from @file{@var{n}.ch} if +it exists or can be made) with @samp{$(CWEAVE)}. @file{@var{n}.p} is +made from @file{@var{n}.web} with @samp{$(TANGLE)} and @file{@var{n}.c} +is made from @file{@var{n}.w} (and from @file{@var{n}.ch} if it exists +or can be made) with @samp{$(CTANGLE)}.@refill + +@item Texinfo and Info +@cindex Texinfo, rule to format +@cindex Info, rule to format +@pindex texi2dvi +@pindex makeinfo +@pindex .texinfo +@pindex .info +@pindex .texi +@pindex .txinfo +@file{@var{n}.dvi} is made from @file{@var{n}.texinfo}, +@file{@var{n}.texi}, or @file{@var{n}.txinfo}, with the recipe +@w{@samp{$(TEXI2DVI) $(TEXI2DVI_FLAGS)}}. @file{@var{n}.info} is made from +@file{@var{n}.texinfo}, @file{@var{n}.texi}, or @file{@var{n}.txinfo}, with +the recipe @w{@samp{$(MAKEINFO) $(MAKEINFO_FLAGS)}}. + +@item RCS +@cindex RCS, rule to extract from +@pindex co +@pindex ,v @r{(RCS file extension)} +Any file @file{@var{n}} is extracted if necessary from an RCS file +named either @file{@var{n},v} or @file{RCS/@var{n},v}. The precise +recipe used is @w{@samp{$(CO) $(COFLAGS)}}. @file{@var{n}} will not be +extracted from RCS if it already exists, even if the RCS file is +newer. The rules for RCS are terminal +(@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}), +so RCS files cannot be generated from another source; they must +actually exist.@refill + +@item SCCS +@cindex SCCS, rule to extract from +@pindex get +@pindex s. @r{(SCCS file prefix)} +Any file @file{@var{n}} is extracted if necessary from an SCCS file +named either @file{s.@var{n}} or @file{SCCS/s.@var{n}}. The precise +recipe used is @w{@samp{$(GET) $(GFLAGS)}}. The rules for SCCS are +terminal (@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}), +so SCCS files cannot be generated from another source; they must +actually exist.@refill + +@pindex .sh +For the benefit of SCCS, a file @file{@var{n}} is copied from +@file{@var{n}.sh} and made executable (by everyone). This is for +shell scripts that are checked into SCCS. Since RCS preserves the +execution permission of a file, you do not need to use this feature +with RCS.@refill + +We recommend that you avoid using of SCCS. RCS is widely held to be +superior, and is also free. By choosing free software in place of +comparable (or inferior) proprietary software, you support the free +software movement. +@end table + +Usually, you want to change only the variables listed in the table +above, which are documented in the following section. + +However, the recipes in built-in implicit rules actually use +variables such as @code{COMPILE.c}, @code{LINK.p}, and +@code{PREPROCESS.S}, whose values contain the recipes listed above. + +@code{make} follows the convention that the rule to compile a +@file{.@var{x}} source file uses the variable @code{COMPILE.@var{x}}. +Similarly, the rule to produce an executable from a @file{.@var{x}} +file uses @code{LINK.@var{x}}; and the rule to preprocess a +@file{.@var{x}} file uses @code{PREPROCESS.@var{x}}. + +@vindex OUTPUT_OPTION +Every rule that produces an object file uses the variable +@code{OUTPUT_OPTION}. @code{make} defines this variable either to +contain @samp{-o $@@}, or to be empty, depending on a compile-time +option. You need the @samp{-o} option to ensure that the output goes +into the right file when the source file is in a different directory, +as when using @code{VPATH} (@pxref{Directory Search}). However, +compilers on some systems do not accept a @samp{-o} switch for object +files. If you use such a system, and use @code{VPATH}, some +compilations will put their output in the wrong place. +A possible workaround for this problem is to give @code{OUTPUT_OPTION} +the value @w{@samp{; mv $*.o $@@}}. + +@node Implicit Variables, Chained Rules, Catalogue of Rules, Implicit Rules +@section Variables Used by Implicit Rules +@cindex flags for compilers + +The recipes in built-in implicit rules make liberal use of certain +predefined variables. You can alter the values of these variables in +the makefile, with arguments to @code{make}, or in the environment to +alter how the implicit rules work without redefining the rules +themselves. You can cancel all variables used by implicit rules with +the @samp{-R} or @samp{--no-builtin-variables} option. + +For example, the recipe used to compile a C source file actually says +@samp{$(CC) -c $(CFLAGS) $(CPPFLAGS)}. The default values of the variables +used are @samp{cc} and nothing, resulting in the command @samp{cc -c}. By +redefining @samp{CC} to @samp{ncc}, you could cause @samp{ncc} to be +used for all C compilations performed by the implicit rule. By redefining +@samp{CFLAGS} to be @samp{-g}, you could pass the @samp{-g} option to +each compilation. @emph{All} implicit rules that do C compilation use +@samp{$(CC)} to get the program name for the compiler and @emph{all} +include @samp{$(CFLAGS)} among the arguments given to the compiler.@refill + +The variables used in implicit rules fall into two classes: those that are +names of programs (like @code{CC}) and those that contain arguments for the +programs (like @code{CFLAGS}). (The ``name of a program'' may also contain +some command arguments, but it must start with an actual executable program +name.) If a variable value contains more than one argument, separate them +with spaces. + +The following tables describe of some of the more commonly-used predefined +variables. This list is not exhaustive, and the default values shown here may +not be what @code{make} selects for your environment. To see the +complete list of predefined variables for your instance of GNU @code{make} you +can run @samp{make -p} in a directory with no makefiles. + +Here is a table of some of the more common variables used as names of +programs in built-in rules: +makefiles. + +@table @code +@item AR +@vindex AR +Archive-maintaining program; default @samp{ar}. +@pindex ar + +@item AS +@vindex AS +Program for compiling assembly files; default @samp{as}. +@pindex as + +@item CC +@vindex CC +Program for compiling C programs; default @samp{cc}. +@pindex cc + +@item CXX +@vindex CXX +Program for compiling C++ programs; default @samp{g++}. +@pindex g++ + +@item CPP +@vindex CPP +Program for running the C preprocessor, with results to standard output; +default @samp{$(CC) -E}. + +@item FC +@vindex FC +Program for compiling or preprocessing Fortran and Ratfor programs; +default @samp{f77}. +@pindex f77 + +@item M2C +@vindex M2C +Program to use to compile Modula-2 source code; default @samp{m2c}. +@pindex m2c + +@item PC +@vindex PC +Program for compiling Pascal programs; default @samp{pc}. +@pindex pc + +@item CO +@vindex CO +Program for extracting a file from RCS; default @samp{co}. +@pindex co + +@item GET +@vindex GET +Program for extracting a file from SCCS; default @samp{get}. +@pindex get + +@item LEX +@vindex LEX +Program to use to turn Lex grammars into source code; default @samp{lex}. +@pindex lex + +@item YACC +@vindex YACC +Program to use to turn Yacc grammars into source code; default @samp{yacc}. +@pindex yacc + +@item LINT +@vindex LINT +Program to use to run lint on source code; default @samp{lint}. +@pindex lint + +@item MAKEINFO +@vindex MAKEINFO +Program to convert a Texinfo source file into an Info file; default +@samp{makeinfo}. +@pindex makeinfo + +@item TEX +@vindex TEX +Program to make @TeX{} @sc{dvi} files from @TeX{} source; +default @samp{tex}. +@pindex tex + +@item TEXI2DVI +@vindex TEXI2DVI +Program to make @TeX{} @sc{dvi} files from Texinfo source; +default @samp{texi2dvi}. +@pindex texi2dvi + +@item WEAVE +@vindex WEAVE +Program to translate Web into @TeX{}; default @samp{weave}. +@pindex weave + +@item CWEAVE +@vindex CWEAVE +Program to translate C Web into @TeX{}; default @samp{cweave}. +@pindex cweave + +@item TANGLE +@vindex TANGLE +Program to translate Web into Pascal; default @samp{tangle}. +@pindex tangle + +@item CTANGLE +@vindex CTANGLE +Program to translate C Web into C; default @samp{ctangle}. +@pindex ctangle + +@item RM +@vindex RM +Command to remove a file; default @samp{rm -f}. +@pindex rm +@end table + +Here is a table of variables whose values are additional arguments for the +programs above. The default values for all of these is the empty +string, unless otherwise noted. + +@table @code +@item ARFLAGS +@vindex ARFLAGS +Flags to give the archive-maintaining program; default @samp{rv}. + +@item ASFLAGS +@vindex ASFLAGS +Extra flags to give to the assembler (when explicitly +invoked on a @samp{.s} or @samp{.S} file). + +@item CFLAGS +@vindex CFLAGS +Extra flags to give to the C compiler. + +@item CXXFLAGS +@vindex CXXFLAGS +Extra flags to give to the C++ compiler. + +@item COFLAGS +@vindex COFLAGS +Extra flags to give to the RCS @code{co} program. + +@item CPPFLAGS +@vindex CPPFLAGS +Extra flags to give to the C preprocessor and programs +that use it (the C and Fortran compilers). + +@item FFLAGS +@vindex FFLAGS +Extra flags to give to the Fortran compiler. + +@item GFLAGS +@vindex GFLAGS +Extra flags to give to the SCCS @code{get} program. + +@item LDFLAGS +@vindex LDFLAGS +Extra flags to give to compilers when they are supposed to invoke the linker, +@samp{ld}. + +@item LFLAGS +@vindex LFLAGS +Extra flags to give to Lex. + +@item YFLAGS +@vindex YFLAGS +Extra flags to give to Yacc. + +@item PFLAGS +@vindex PFLAGS +Extra flags to give to the Pascal compiler. + +@item RFLAGS +@vindex RFLAGS +Extra flags to give to the Fortran compiler for Ratfor programs. + +@item LINTFLAGS +@vindex LINTFLAGS +Extra flags to give to lint. +@end table + +@node Chained Rules, Pattern Rules, Implicit Variables, Implicit Rules +@section Chains of Implicit Rules + +@cindex chains of rules +@cindex rule, implicit, chains of +Sometimes a file can be made by a sequence of implicit rules. For example, +a file @file{@var{n}.o} could be made from @file{@var{n}.y} by running +first Yacc and then @code{cc}. Such a sequence is called a @dfn{chain}. + +If the file @file{@var{n}.c} exists, or is mentioned in the makefile, no +special searching is required: @code{make} finds that the object file can +be made by C compilation from @file{@var{n}.c}; later on, when considering +how to make @file{@var{n}.c}, the rule for running Yacc is +used. Ultimately both @file{@var{n}.c} and @file{@var{n}.o} are +updated.@refill + +@cindex intermediate files +@cindex files, intermediate +However, even if @file{@var{n}.c} does not exist and is not mentioned, +@code{make} knows how to envision it as the missing link between +@file{@var{n}.o} and @file{@var{n}.y}! In this case, @file{@var{n}.c} is +called an @dfn{intermediate file}. Once @code{make} has decided to use the +intermediate file, it is entered in the data base as if it had been +mentioned in the makefile, along with the implicit rule that says how to +create it.@refill + +Intermediate files are remade using their rules just like all other +files. But intermediate files are treated differently in two ways. + +The first difference is what happens if the intermediate file does not +exist. If an ordinary file @var{b} does not exist, and @code{make} +considers a target that depends on @var{b}, it invariably creates +@var{b} and then updates the target from @var{b}. But if @var{b} is an +intermediate file, then @code{make} can leave well enough alone. It +won't bother updating @var{b}, or the ultimate target, unless some +prerequisite of @var{b} is newer than that target or there is some other +reason to update that target. + +The second difference is that if @code{make} @emph{does} create @var{b} +in order to update something else, it deletes @var{b} later on after it +is no longer needed. Therefore, an intermediate file which did not +exist before @code{make} also does not exist after @code{make}. +@code{make} reports the deletion to you by printing a @samp{rm -f} +command showing which file it is deleting. + +Ordinarily, a file cannot be intermediate if it is mentioned in the +makefile as a target or prerequisite. However, you can explicitly mark a +file as intermediate by listing it as a prerequisite of the special target +@code{.INTERMEDIATE}. This takes effect even if the file is mentioned +explicitly in some other way. + +@cindex intermediate files, preserving +@cindex preserving intermediate files +@cindex secondary files +You can prevent automatic deletion of an intermediate file by marking it +as a @dfn{secondary} file. To do this, list it as a prerequisite of the +special target @code{.SECONDARY}. When a file is secondary, @code{make} +will not create the file merely because it does not already exist, but +@code{make} does not automatically delete the file. Marking a file as +secondary also marks it as intermediate. + +You can list the target pattern of an implicit rule (such as @samp{%.o}) +as a prerequisite of the special target @code{.PRECIOUS} to preserve +intermediate files made by implicit rules whose target patterns match +that file's name; see @ref{Interrupts}.@refill +@cindex preserving with @code{.PRECIOUS} +@cindex @code{.PRECIOUS} intermediate files + +A chain can involve more than two implicit rules. For example, it is +possible to make a file @file{foo} from @file{RCS/foo.y,v} by running RCS, +Yacc and @code{cc}. Then both @file{foo.y} and @file{foo.c} are +intermediate files that are deleted at the end.@refill + +No single implicit rule can appear more than once in a chain. This means +that @code{make} will not even consider such a ridiculous thing as making +@file{foo} from @file{foo.o.o} by running the linker twice. This +constraint has the added benefit of preventing any infinite loop in the +search for an implicit rule chain. + +There are some special implicit rules to optimize certain cases that would +otherwise be handled by rule chains. For example, making @file{foo} from +@file{foo.c} could be handled by compiling and linking with separate +chained rules, using @file{foo.o} as an intermediate file. But what +actually happens is that a special rule for this case does the compilation +and linking with a single @code{cc} command. The optimized rule is used in +preference to the step-by-step chain because it comes earlier in the +ordering of rules. + +@node Pattern Rules, Last Resort, Chained Rules, Implicit Rules +@section Defining and Redefining Pattern Rules + +You define an implicit rule by writing a @dfn{pattern rule}. A pattern +rule looks like an ordinary rule, except that its target contains the +character @samp{%} (exactly one of them). The target is considered a +pattern for matching file names; the @samp{%} can match any nonempty +substring, while other characters match only themselves. The prerequisites +likewise use @samp{%} to show how their names relate to the target name. + +Thus, a pattern rule @samp{%.o : %.c} says how to make any file +@file{@var{stem}.o} from another file @file{@var{stem}.c}.@refill + +Note that expansion using @samp{%} in pattern rules occurs +@strong{after} any variable or function expansions, which take place +when the makefile is read. @xref{Using Variables, , How to Use +Variables}, and @ref{Functions, ,Functions for Transforming Text}. + +@menu +* Pattern Intro:: An introduction to pattern rules. +* Pattern Examples:: Examples of pattern rules. +* Automatic Variables:: How to use automatic variables in the + recipes of implicit rules. +* Pattern Match:: How patterns match. +* Match-Anything Rules:: Precautions you should take prior to + defining rules that can match any + target file whatever. +* Canceling Rules:: How to override or cancel built-in rules. +@end menu + +@node Pattern Intro, Pattern Examples, Pattern Rules, Pattern Rules +@subsection Introduction to Pattern Rules +@cindex pattern rule +@cindex rule, pattern + +A pattern rule contains the character @samp{%} (exactly one of them) +in the target; otherwise, it looks exactly like an ordinary rule. The +target is a pattern for matching file names; the @samp{%} matches any +nonempty substring, while other characters match only themselves. +@cindex target pattern, implicit +@cindex @code{%}, in pattern rules + +For example, @samp{%.c} as a pattern matches any file name that ends in +@samp{.c}. @samp{s.%.c} as a pattern matches any file name that starts +with @samp{s.}, ends in @samp{.c} and is at least five characters long. +(There must be at least one character to match the @samp{%}.) The substring +that the @samp{%} matches is called the @dfn{stem}.@refill + +@samp{%} in a prerequisite of a pattern rule stands for the same stem +that was matched by the @samp{%} in the target. In order for the +pattern rule to apply, its target pattern must match the file name +under consideration and all of its prerequisites (after pattern +substitution) must name files that exist or can be made. These files +become prerequisites of the target. +@cindex prerequisite pattern, implicit + +Thus, a rule of the form + +@example +%.o : %.c ; @var{recipe}@dots{} +@end example + +@noindent +specifies how to make a file @file{@var{n}.o}, with another file +@file{@var{n}.c} as its prerequisite, provided that @file{@var{n}.c} +exists or can be made. + +There may also be prerequisites that do not use @samp{%}; such a prerequisite +attaches to every file made by this pattern rule. These unvarying +prerequisites are useful occasionally. + +A pattern rule need not have any prerequisites that contain @samp{%}, or +in fact any prerequisites at all. Such a rule is effectively a general +wildcard. It provides a way to make any file that matches the target +pattern. @xref{Last Resort}. + +More than one pattern rule may match a target. In this case +@code{make} will choose the ``best fit'' rule. @xref{Pattern Match, +,How Patterns Match}. + +@c !!! The end of of this paragraph should be rewritten. --bob +Pattern rules may have more than one target. Unlike normal rules, +this does not act as many different rules with the same prerequisites +and recipe. If a pattern rule has multiple targets, @code{make} knows +that the rule's recipe is responsible for making all of the targets. +The recipe is executed only once to make all the targets. When +searching for a pattern rule to match a target, the target patterns of +a rule other than the one that matches the target in need of a rule +are incidental: @code{make} worries only about giving a recipe and +prerequisites to the file presently in question. However, when this +file's recipe is run, the other targets are marked as having been +updated themselves. +@cindex multiple targets, in pattern rule +@cindex target, multiple in pattern rule + +@node Pattern Examples, Automatic Variables, Pattern Intro, Pattern Rules +@subsection Pattern Rule Examples + +Here are some examples of pattern rules actually predefined in +@code{make}. First, the rule that compiles @samp{.c} files into @samp{.o} +files:@refill + +@example +%.o : %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@@ +@end example + +@noindent +defines a rule that can make any file @file{@var{x}.o} from +@file{@var{x}.c}. The recipe uses the automatic variables @samp{$@@} and +@samp{$<} to substitute the names of the target file and the source file +in each case where the rule applies (@pxref{Automatic Variables}).@refill + +Here is a second built-in rule: + +@example +% :: RCS/%,v + $(CO) $(COFLAGS) $< +@end example + +@noindent +defines a rule that can make any file @file{@var{x}} whatsoever from a +corresponding file @file{@var{x},v} in the subdirectory @file{RCS}. Since +the target is @samp{%}, this rule will apply to any file whatever, provided +the appropriate prerequisite file exists. The double colon makes the rule +@dfn{terminal}, which means that its prerequisite may not be an intermediate +file (@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}).@refill + +@need 500 +This pattern rule has two targets: + +@example +@group +%.tab.c %.tab.h: %.y + bison -d $< +@end group +@end example + +@noindent +@c The following paragraph is rewritten to avoid overfull hboxes +This tells @code{make} that the recipe @samp{bison -d @var{x}.y} will +make both @file{@var{x}.tab.c} and @file{@var{x}.tab.h}. If the file +@file{foo} depends on the files @file{parse.tab.o} and @file{scan.o} +and the file @file{scan.o} depends on the file @file{parse.tab.h}, +when @file{parse.y} is changed, the recipe @samp{bison -d parse.y} +will be executed only once, and the prerequisites of both +@file{parse.tab.o} and @file{scan.o} will be satisfied. (Presumably +the file @file{parse.tab.o} will be recompiled from @file{parse.tab.c} +and the file @file{scan.o} from @file{scan.c}, while @file{foo} is +linked from @file{parse.tab.o}, @file{scan.o}, and its other +prerequisites, and it will execute happily ever after.)@refill + +@node Automatic Variables, Pattern Match, Pattern Examples, Pattern Rules +@subsection Automatic Variables +@cindex automatic variables +@cindex variables, automatic +@cindex variables, and implicit rule + +Suppose you are writing a pattern rule to compile a @samp{.c} file into a +@samp{.o} file: how do you write the @samp{cc} command so that it operates +on the right source file name? You cannot write the name in the recipe, +because the name is different each time the implicit rule is applied. + +What you do is use a special feature of @code{make}, the @dfn{automatic +variables}. These variables have values computed afresh for each rule that +is executed, based on the target and prerequisites of the rule. In this +example, you would use @samp{$@@} for the object file name and @samp{$<} +for the source file name. + +@cindex automatic variables in prerequisites +@cindex prerequisites, and automatic variables +It's very important that you recognize the limited scope in which +automatic variable values are available: they only have values within +the recipe. In particular, you cannot use them anywhere +within the target list of a rule; they have no value there and will +expand to the empty string. Also, they cannot be accessed directly +within the prerequisite list of a rule. A common mistake is +attempting to use @code{$@@} within the prerequisites list; this will +not work. However, there is a special feature of GNU @code{make}, +secondary expansion (@pxref{Secondary Expansion}), which will allow +automatic variable values to be used in prerequisite lists. + +Here is a table of automatic variables: + +@table @code +@vindex $@@ +@vindex @@ @r{(automatic variable)} +@item $@@ +The file name of the target of the rule. If the target is an archive +member, then @samp{$@@} is the name of the archive file. In a pattern +rule that has multiple targets (@pxref{Pattern Intro, ,Introduction to +Pattern Rules}), @samp{$@@} is the name of whichever target caused the +rule's recipe to be run. + +@vindex $% +@vindex % @r{(automatic variable)} +@item $% +The target member name, when the target is an archive member. +@xref{Archives}. For example, if the target is @file{foo.a(bar.o)} then +@samp{$%} is @file{bar.o} and @samp{$@@} is @file{foo.a}. @samp{$%} is +empty when the target is not an archive member. + +@vindex $< +@vindex < @r{(automatic variable)} +@item $< +The name of the first prerequisite. If the target got its recipe from +an implicit rule, this will be the first prerequisite added by the +implicit rule (@pxref{Implicit Rules}). + +@vindex $? +@vindex ? @r{(automatic variable)} +@item $? +The names of all the prerequisites that are newer than the target, with +spaces between them. For prerequisites which are archive members, only +the named member is used (@pxref{Archives}). +@cindex prerequisites, list of changed +@cindex list of changed prerequisites + +@vindex $^ +@vindex ^ @r{(automatic variable)} +@item $^ +The names of all the prerequisites, with spaces between them. For +prerequisites which are archive members, only the named member is used +(@pxref{Archives}). A target has only one prerequisite on each other file +it depends on, no matter how many times each file is listed as a +prerequisite. So if you list a prerequisite more than once for a target, +the value of @code{$^} contains just one copy of the name. This list +does @strong{not} contain any of the order-only prerequisites; for those +see the @samp{$|} variable, below. +@cindex prerequisites, list of all +@cindex list of all prerequisites + +@vindex $+ +@vindex + @r{(automatic variable)} +@item $+ +This is like @samp{$^}, but prerequisites listed more than once are +duplicated in the order they were listed in the makefile. This is +primarily useful for use in linking commands where it is meaningful to +repeat library file names in a particular order. + +@vindex $| +@vindex | @r{(automatic variable)} +@item $| +The names of all the order-only prerequisites, with spaces between +them. + +@vindex $* +@vindex * @r{(automatic variable)} +@item $* +The stem with which an implicit rule matches (@pxref{Pattern Match, ,How +Patterns Match}). If the target is @file{dir/a.foo.b} and the target +pattern is @file{a.%.b} then the stem is @file{dir/foo}. The stem is +useful for constructing names of related files.@refill +@cindex stem, variable for + +In a static pattern rule, the stem is part of the file name that matched +the @samp{%} in the target pattern. + +In an explicit rule, there is no stem; so @samp{$*} cannot be determined +in that way. Instead, if the target name ends with a recognized suffix +(@pxref{Suffix Rules, ,Old-Fashioned Suffix Rules}), @samp{$*} is set to +the target name minus the suffix. For example, if the target name is +@samp{foo.c}, then @samp{$*} is set to @samp{foo}, since @samp{.c} is a +suffix. GNU @code{make} does this bizarre thing only for compatibility +with other implementations of @code{make}. You should generally avoid +using @samp{$*} except in implicit rules or static pattern rules.@refill + +If the target name in an explicit rule does not end with a recognized +suffix, @samp{$*} is set to the empty string for that rule. +@end table + +@samp{$?} is useful even in explicit rules when you wish to operate on only +the prerequisites that have changed. For example, suppose that an archive +named @file{lib} is supposed to contain copies of several object files. +This rule copies just the changed object files into the archive: + +@example +@group +lib: foo.o bar.o lose.o win.o + ar r lib $? +@end group +@end example + +Of the variables listed above, four have values that are single file +names, and three have values that are lists of file names. These seven +have variants that get just the file's directory name or just the file +name within the directory. The variant variables' names are formed by +appending @samp{D} or @samp{F}, respectively. These variants are +semi-obsolete in GNU @code{make} since the functions @code{dir} and +@code{notdir} can be used to get a similar effect (@pxref{File Name +Functions, , Functions for File Names}). Note, however, that the +@samp{D} variants all omit the trailing slash which always appears in +the output of the @code{dir} function. Here is a table of the variants: + +@table @samp +@vindex $(@@D) +@vindex @@D @r{(automatic variable)} +@item $(@@D) +The directory part of the file name of the target, with the trailing +slash removed. If the value of @samp{$@@} is @file{dir/foo.o} then +@samp{$(@@D)} is @file{dir}. This value is @file{.} if @samp{$@@} does +not contain a slash. + +@vindex $(@@F) +@vindex @@F @r{(automatic variable)} +@item $(@@F) +The file-within-directory part of the file name of the target. If the +value of @samp{$@@} is @file{dir/foo.o} then @samp{$(@@F)} is +@file{foo.o}. @samp{$(@@F)} is equivalent to @samp{$(notdir $@@)}. + +@vindex $(*D) +@vindex *D @r{(automatic variable)} +@item $(*D) +@vindex $(*F) +@vindex *F @r{(automatic variable)} +@itemx $(*F) +The directory part and the file-within-directory +part of the stem; @file{dir} and @file{foo} in this example. + +@vindex $(%D) +@vindex %D @r{(automatic variable)} +@item $(%D) +@vindex $(%F) +@vindex %F @r{(automatic variable)} +@itemx $(%F) +The directory part and the file-within-directory part of the target +archive member name. This makes sense only for archive member targets +of the form @file{@var{archive}(@var{member})} and is useful only when +@var{member} may contain a directory name. (@xref{Archive Members, +,Archive Members as Targets}.) + +@vindex $( tar-`sed -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c`.shar.Z +@end group + +@group +.PHONY: dist +dist: $(SRCS) $(AUX) + echo tar-`sed \ + -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c` > .fname + -rm -rf `cat .fname` + mkdir `cat .fname` + ln $(SRCS) $(AUX) `cat .fname` + tar chZf `cat .fname`.tar.Z `cat .fname` + -rm -rf `cat .fname` .fname +@end group + +@group +tar.zoo: $(SRCS) $(AUX) + -rm -rf tmp.dir + -mkdir tmp.dir + -rm tar.zoo + for X in $(SRCS) $(AUX) ; do \ + echo $$X ; \ + sed 's/$$/^M/' $$X \ + > tmp.dir/$$X ; done + cd tmp.dir ; zoo aM ../tar.zoo * + -rm -rf tmp.dir +@end group +@end example + +@node GNU Free Documentation License, Concept Index, Complex Makefile, Top +@appendixsec GNU Free Documentation License +@cindex FDL, GNU Free Documentation License +@include fdl.texi + +@node Concept Index, Name Index, GNU Free Documentation License, Top +@unnumbered Index of Concepts + +@printindex cp + +@node Name Index, , Concept Index, Top +@unnumbered Index of Functions, Variables, & Directives + +@printindex fn + +@bye diff --git a/doc/stamp-vti b/doc/stamp-vti new file mode 100644 index 0000000..aac448b --- /dev/null +++ b/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 19 July 2010 +@set UPDATED-MONTH July 2010 +@set EDITION 3.82 +@set VERSION 3.82 diff --git a/doc/version.texi b/doc/version.texi new file mode 100644 index 0000000..aac448b --- /dev/null +++ b/doc/version.texi @@ -0,0 +1,4 @@ +@set UPDATED 19 July 2010 +@set UPDATED-MONTH July 2010 +@set EDITION 3.82 +@set VERSION 3.82 diff --git a/dosbuild.bat b/dosbuild.bat new file mode 100644 index 0000000..c911e18 --- /dev/null +++ b/dosbuild.bat @@ -0,0 +1,63 @@ +@echo off +rem Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, +rem 2008, 2009, 2010 Free Software Foundation, Inc. +rem This file is part of GNU Make. +rem +rem GNU Make is free software; you can redistribute it and/or modify it under +rem the terms of the GNU General Public License as published by the Free +rem Software Foundation; either version 3 of the License, or (at your option) +rem any later version. +rem +rem GNU Make is distributed in the hope that it will be useful, but WITHOUT +rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +rem FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for. +rem more details. +rem +rem You should have received a copy of the GNU General Public License along +rem with this program. If not, see . + +echo Building Make for MSDOS + +rem Echo ON so they will see what is going on. +@echo on +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g commands.c -o commands.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g job.c -o job.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g dir.c -o dir.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g file.c -o file.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g misc.c -o misc.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g main.c -o main.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -DINCLUDEDIR=\"c:/djgpp/include\" -O2 -g read.c -o read.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -DLIBDIR=\"c:/djgpp/lib\" -O2 -g remake.c -o remake.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g rule.c -o rule.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g implicit.c -o implicit.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g default.c -o default.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g variable.c -o variable.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g expand.c -o expand.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g function.c -o function.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g vpath.c -o vpath.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g hash.c -o hash.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g strcache.c -o strcache.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g version.c -o version.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g ar.c -o ar.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g arscan.c -o arscan.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g signame.c -o signame.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g remote-stub.c -o remote-stub.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g getopt.c -o getopt.o +gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g getopt1.c -o getopt1.o +@cd glob +@if exist libglob.a del libglob.a +gcc -I. -c -DHAVE_CONFIG_H -I.. -O2 -g glob.c -o glob.o +gcc -I. -c -DHAVE_CONFIG_H -I.. -O2 -g fnmatch.c -o fnmatch.o +ar rv libglob.a glob.o fnmatch.o +@echo off +cd .. +echo commands.o > respf.$$$ +for %%f in (job dir file misc main read remake rule implicit default variable) do echo %%f.o >> respf.$$$ +for %%f in (expand function vpath hash strcache version ar arscan signame remote-stub getopt getopt1) do echo %%f.o >> respf.$$$ +echo glob/libglob.a >> respf.$$$ +@echo Linking... +@echo on +gcc -o make.new @respf.$$$ +@if exist make.exe echo Make.exe is now built! +@if not exist make.exe echo Make.exe build failed... +@if exist make.exe del respf.$$$ diff --git a/expand.c b/expand.c new file mode 100644 index 0000000..2315b06 --- /dev/null +++ b/expand.c @@ -0,0 +1,605 @@ +/* Variable expansion functions for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +#include + +#include "filedef.h" +#include "job.h" +#include "commands.h" +#include "variable.h" +#include "rule.h" + +/* Initially, any errors reported when expanding strings will be reported + against the file where the error appears. */ +const struct floc **expanding_var = &reading_file; + +/* The next two describe the variable output buffer. + This buffer is used to hold the variable-expansion of a line of the + makefile. It is made bigger with realloc whenever it is too small. + variable_buffer_length is the size currently allocated. + variable_buffer is the address of the buffer. + + For efficiency, it's guaranteed that the buffer will always have + VARIABLE_BUFFER_ZONE extra bytes allocated. This allows you to add a few + extra chars without having to call a function. Note you should never use + these bytes unless you're _sure_ you have room (you know when the buffer + length was last checked. */ + +#define VARIABLE_BUFFER_ZONE 5 + +static unsigned int variable_buffer_length; +char *variable_buffer; + +/* Subroutine of variable_expand and friends: + The text to add is LENGTH chars starting at STRING to the variable_buffer. + The text is added to the buffer at PTR, and the updated pointer into + the buffer is returned as the value. Thus, the value returned by + each call to variable_buffer_output should be the first argument to + the following call. */ + +char * +variable_buffer_output (char *ptr, const char *string, unsigned int length) +{ + register unsigned int newlen = length + (ptr - variable_buffer); + + if ((newlen + VARIABLE_BUFFER_ZONE) > variable_buffer_length) + { + unsigned int offset = ptr - variable_buffer; + variable_buffer_length = (newlen + 100 > 2 * variable_buffer_length + ? newlen + 100 + : 2 * variable_buffer_length); + variable_buffer = xrealloc (variable_buffer, variable_buffer_length); + ptr = variable_buffer + offset; + } + + memcpy (ptr, string, length); + return ptr + length; +} + +/* Return a pointer to the beginning of the variable buffer. */ + +static char * +initialize_variable_output (void) +{ + /* If we don't have a variable output buffer yet, get one. */ + + if (variable_buffer == 0) + { + variable_buffer_length = 200; + variable_buffer = xmalloc (variable_buffer_length); + variable_buffer[0] = '\0'; + } + + return variable_buffer; +} + +/* Recursively expand V. The returned string is malloc'd. */ + +static char *allocated_variable_append (const struct variable *v); + +char * +recursively_expand_for_file (struct variable *v, struct file *file) +{ + char *value; + const struct floc *this_var; + const struct floc **saved_varp; + struct variable_set_list *save = 0; + int set_reading = 0; + + /* Don't install a new location if this location is empty. + This can happen for command-line variables, builtin variables, etc. */ + saved_varp = expanding_var; + if (v->fileinfo.filenm) + { + this_var = &v->fileinfo; + expanding_var = &this_var; + } + + /* If we have no other file-reading context, use the variable's context. */ + if (!reading_file) + { + set_reading = 1; + reading_file = &v->fileinfo; + } + + if (v->expanding) + { + if (!v->exp_count) + /* Expanding V causes infinite recursion. Lose. */ + fatal (*expanding_var, + _("Recursive variable `%s' references itself (eventually)"), + v->name); + --v->exp_count; + } + + if (file) + { + save = current_variable_set_list; + current_variable_set_list = file->variables; + } + + v->expanding = 1; + if (v->append) + value = allocated_variable_append (v); + else + value = allocated_variable_expand (v->value); + v->expanding = 0; + + if (set_reading) + reading_file = 0; + + if (file) + current_variable_set_list = save; + + expanding_var = saved_varp; + + return value; +} + +/* Expand a simple reference to variable NAME, which is LENGTH chars long. */ + +#ifdef __GNUC__ +__inline +#endif +static char * +reference_variable (char *o, const char *name, unsigned int length) +{ + struct variable *v; + char *value; + + v = lookup_variable (name, length); + + if (v == 0) + warn_undefined (name, length); + + /* If there's no variable by that name or it has no value, stop now. */ + if (v == 0 || (*v->value == '\0' && !v->append)) + return o; + + value = (v->recursive ? recursively_expand (v) : v->value); + + o = variable_buffer_output (o, value, strlen (value)); + + if (v->recursive) + free (value); + + return o; +} + +/* Scan STRING for variable references and expansion-function calls. Only + LENGTH bytes of STRING are actually scanned. If LENGTH is -1, scan until + a null byte is found. + + Write the results to LINE, which must point into `variable_buffer'. If + LINE is NULL, start at the beginning of the buffer. + Return a pointer to LINE, or to the beginning of the buffer if LINE is + NULL. + */ +char * +variable_expand_string (char *line, const char *string, long length) +{ + struct variable *v; + const char *p, *p1; + char *abuf = NULL; + char *o; + unsigned int line_offset; + + if (!line) + line = initialize_variable_output(); + o = line; + line_offset = line - variable_buffer; + + if (length == 0) + { + variable_buffer_output (o, "", 1); + return (variable_buffer); + } + + /* If we want a subset of the string, allocate a temporary buffer for it. + Most of the functions we use here don't work with length limits. */ + if (length > 0 && string[length] != '\0') + { + abuf = xmalloc(length+1); + memcpy(abuf, string, length); + abuf[length] = '\0'; + string = abuf; + } + p = string; + + while (1) + { + /* Copy all following uninteresting chars all at once to the + variable output buffer, and skip them. Uninteresting chars end + at the next $ or the end of the input. */ + + p1 = strchr (p, '$'); + + o = variable_buffer_output (o, p, p1 != 0 ? (unsigned int)(p1 - p) : strlen (p) + 1); + + if (p1 == 0) + break; + p = p1 + 1; + + /* Dispatch on the char that follows the $. */ + + switch (*p) + { + case '$': + /* $$ seen means output one $ to the variable output buffer. */ + o = variable_buffer_output (o, p, 1); + break; + + case '(': + case '{': + /* $(...) or ${...} is the general case of substitution. */ + { + char openparen = *p; + char closeparen = (openparen == '(') ? ')' : '}'; + const char *begp; + const char *beg = p + 1; + char *op; + char *abeg = NULL; + const char *end, *colon; + + op = o; + begp = p; + if (handle_function (&op, &begp)) + { + o = op; + p = begp; + break; + } + + /* Is there a variable reference inside the parens or braces? + If so, expand it before expanding the entire reference. */ + + end = strchr (beg, closeparen); + if (end == 0) + /* Unterminated variable reference. */ + fatal (*expanding_var, _("unterminated variable reference")); + p1 = lindex (beg, end, '$'); + if (p1 != 0) + { + /* BEG now points past the opening paren or brace. + Count parens or braces until it is matched. */ + int count = 0; + for (p = beg; *p != '\0'; ++p) + { + if (*p == openparen) + ++count; + else if (*p == closeparen && --count < 0) + break; + } + /* If COUNT is >= 0, there were unmatched opening parens + or braces, so we go to the simple case of a variable name + such as `$($(a)'. */ + if (count < 0) + { + abeg = expand_argument (beg, p); /* Expand the name. */ + beg = abeg; + end = strchr (beg, '\0'); + } + } + else + /* Advance P to the end of this reference. After we are + finished expanding this one, P will be incremented to + continue the scan. */ + p = end; + + /* This is not a reference to a built-in function and + any variable references inside are now expanded. + Is the resultant text a substitution reference? */ + + colon = lindex (beg, end, ':'); + if (colon) + { + /* This looks like a substitution reference: $(FOO:A=B). */ + const char *subst_beg, *subst_end, *replace_beg, *replace_end; + + subst_beg = colon + 1; + subst_end = lindex (subst_beg, end, '='); + if (subst_end == 0) + /* There is no = in sight. Punt on the substitution + reference and treat this as a variable name containing + a colon, in the code below. */ + colon = 0; + else + { + replace_beg = subst_end + 1; + replace_end = end; + + /* Extract the variable name before the colon + and look up that variable. */ + v = lookup_variable (beg, colon - beg); + if (v == 0) + warn_undefined (beg, colon - beg); + + /* If the variable is not empty, perform the + substitution. */ + if (v != 0 && *v->value != '\0') + { + char *pattern, *replace, *ppercent, *rpercent; + char *value = (v->recursive + ? recursively_expand (v) + : v->value); + + /* Copy the pattern and the replacement. Add in an + extra % at the beginning to use in case there + isn't one in the pattern. */ + pattern = alloca (subst_end - subst_beg + 2); + *(pattern++) = '%'; + memcpy (pattern, subst_beg, subst_end - subst_beg); + pattern[subst_end - subst_beg] = '\0'; + + replace = alloca (replace_end - replace_beg + 2); + *(replace++) = '%'; + memcpy (replace, replace_beg, + replace_end - replace_beg); + replace[replace_end - replace_beg] = '\0'; + + /* Look for %. Set the percent pointers properly + based on whether we find one or not. */ + ppercent = find_percent (pattern); + if (ppercent) + { + ++ppercent; + rpercent = find_percent (replace); + if (rpercent) + ++rpercent; + } + else + { + ppercent = pattern; + rpercent = replace; + --pattern; + --replace; + } + + o = patsubst_expand_pat (o, value, pattern, replace, + ppercent, rpercent); + + if (v->recursive) + free (value); + } + } + } + + if (colon == 0) + /* This is an ordinary variable reference. + Look up the value of the variable. */ + o = reference_variable (o, beg, end - beg); + + if (abeg) + free (abeg); + } + break; + + case '\0': + break; + + default: + if (isblank ((unsigned char)p[-1])) + break; + + /* A $ followed by a random char is a variable reference: + $a is equivalent to $(a). */ + o = reference_variable (o, p, 1); + + break; + } + + if (*p == '\0') + break; + + ++p; + } + + if (abuf) + free (abuf); + + variable_buffer_output (o, "", 1); + return (variable_buffer + line_offset); +} + +/* Scan LINE for variable references and expansion-function calls. + Build in `variable_buffer' the result of expanding the references and calls. + Return the address of the resulting string, which is null-terminated + and is valid only until the next time this function is called. */ + +char * +variable_expand (const char *line) +{ + return variable_expand_string(NULL, line, (long)-1); +} + +/* Expand an argument for an expansion function. + The text starting at STR and ending at END is variable-expanded + into a null-terminated string that is returned as the value. + This is done without clobbering `variable_buffer' or the current + variable-expansion that is in progress. */ + +char * +expand_argument (const char *str, const char *end) +{ + char *tmp, *alloc = NULL; + char *r; + + if (str == end) + return xstrdup(""); + + if (!end || *end == '\0') + return allocated_variable_expand (str); + + if (end - str + 1 > 1000) + tmp = alloc = xmalloc (end - str + 1); + else + tmp = alloca (end - str + 1); + + memcpy (tmp, str, end - str); + tmp[end - str] = '\0'; + + r = allocated_variable_expand (tmp); + + if (alloc) + free (alloc); + + return r; +} + +/* Expand LINE for FILE. Error messages refer to the file and line where + FILE's commands were found. Expansion uses FILE's variable set list. */ + +char * +variable_expand_for_file (const char *line, struct file *file) +{ + char *result; + struct variable_set_list *savev; + const struct floc *savef; + + if (file == 0) + return variable_expand (line); + + savev = current_variable_set_list; + current_variable_set_list = file->variables; + + savef = reading_file; + if (file->cmds && file->cmds->fileinfo.filenm) + reading_file = &file->cmds->fileinfo; + else + reading_file = 0; + + result = variable_expand (line); + + current_variable_set_list = savev; + reading_file = savef; + + return result; +} + +/* Like allocated_variable_expand, but for += target-specific variables. + First recursively construct the variable value from its appended parts in + any upper variable sets. Then expand the resulting value. */ + +static char * +variable_append (const char *name, unsigned int length, + const struct variable_set_list *set) +{ + const struct variable *v; + char *buf = 0; + + /* If there's nothing left to check, return the empty buffer. */ + if (!set) + return initialize_variable_output (); + + /* Try to find the variable in this variable set. */ + v = lookup_variable_in_set (name, length, set->set); + + /* If there isn't one, look to see if there's one in a set above us. */ + if (!v) + return variable_append (name, length, set->next); + + /* If this variable type is append, first get any upper values. + If not, initialize the buffer. */ + if (v->append) + buf = variable_append (name, length, set->next); + else + buf = initialize_variable_output (); + + /* Append this value to the buffer, and return it. + If we already have a value, first add a space. */ + if (buf > variable_buffer) + buf = variable_buffer_output (buf, " ", 1); + + /* Either expand it or copy it, depending. */ + if (! v->recursive) + return variable_buffer_output (buf, v->value, strlen (v->value)); + + buf = variable_expand_string (buf, v->value, strlen (v->value)); + return (buf + strlen (buf)); +} + + +static char * +allocated_variable_append (const struct variable *v) +{ + char *val; + + /* Construct the appended variable value. */ + + char *obuf = variable_buffer; + unsigned int olen = variable_buffer_length; + + variable_buffer = 0; + + val = variable_append (v->name, strlen (v->name), current_variable_set_list); + variable_buffer_output (val, "", 1); + val = variable_buffer; + + variable_buffer = obuf; + variable_buffer_length = olen; + + return val; +} + +/* Like variable_expand_for_file, but the returned string is malloc'd. + This function is called a lot. It wants to be efficient. */ + +char * +allocated_variable_expand_for_file (const char *line, struct file *file) +{ + char *value; + + char *obuf = variable_buffer; + unsigned int olen = variable_buffer_length; + + variable_buffer = 0; + + value = variable_expand_for_file (line, file); + + variable_buffer = obuf; + variable_buffer_length = olen; + + return value; +} + +/* Install a new variable_buffer context, returning the current one for + safe-keeping. */ + +void +install_variable_buffer (char **bufp, unsigned int *lenp) +{ + *bufp = variable_buffer; + *lenp = variable_buffer_length; + + variable_buffer = 0; + initialize_variable_output (); +} + +/* Restore a previously-saved variable_buffer setting (free the current one). + */ + +void +restore_variable_buffer (char *buf, unsigned int len) +{ + free (variable_buffer); + + variable_buffer = buf; + variable_buffer_length = len; +} diff --git a/file.c b/file.c new file mode 100644 index 0000000..0a4edb2 --- /dev/null +++ b/file.c @@ -0,0 +1,1112 @@ +/* Target file management for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +#include + +#include "dep.h" +#include "filedef.h" +#include "job.h" +#include "commands.h" +#include "variable.h" +#include "debug.h" +#include "hash.h" + + +/* Remember whether snap_deps has been invoked: we need this to be sure we + don't add new rules (via $(eval ...)) afterwards. In the future it would + be nice to support this, but it means we'd need to re-run snap_deps() or + at least its functionality... it might mean changing snap_deps() to be run + per-file, so we can invoke it after the eval... or remembering which files + in the hash have been snapped (a new boolean flag?) and having snap_deps() + only work on files which have not yet been snapped. */ +int snapped_deps = 0; + +/* Hash table of files the makefile knows how to make. */ + +static unsigned long +file_hash_1 (const void *key) +{ + return_ISTRING_HASH_1 (((struct file const *) key)->hname); +} + +static unsigned long +file_hash_2 (const void *key) +{ + return_ISTRING_HASH_2 (((struct file const *) key)->hname); +} + +static int +file_hash_cmp (const void *x, const void *y) +{ + return_ISTRING_COMPARE (((struct file const *) x)->hname, + ((struct file const *) y)->hname); +} + +#ifndef FILE_BUCKETS +#define FILE_BUCKETS 1007 +#endif +static struct hash_table files; + +/* Whether or not .SECONDARY with no prerequisites was given. */ +static int all_secondary = 0; + +/* Access the hash table of all file records. + lookup_file given a name, return the struct file * for that name, + or nil if there is none. +*/ + +struct file * +lookup_file (const char *name) +{ + struct file *f; + struct file file_key; +#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS) + char *lname; +#endif + + assert (*name != '\0'); + + /* This is also done in parse_file_seq, so this is redundant + for names read from makefiles. It is here for names passed + on the command line. */ +#ifdef VMS +# ifndef WANT_CASE_SENSITIVE_TARGETS + if (*name != '.') + { + const char *n; + char *ln; + lname = xstrdup (name); + for (n = name, ln = lname; *n != '\0'; ++n, ++ln) + *ln = isupper ((unsigned char)*n) ? tolower ((unsigned char)*n) : *n; + *ln = '\0'; + name = lname; + } +# endif + + while (name[0] == '[' && name[1] == ']' && name[2] != '\0') + name += 2; +#endif + while (name[0] == '.' +#ifdef HAVE_DOS_PATHS + && (name[1] == '/' || name[1] == '\\') +#else + && name[1] == '/' +#endif + && name[2] != '\0') + { + name += 2; + while (*name == '/' +#ifdef HAVE_DOS_PATHS + || *name == '\\' +#endif + ) + /* Skip following slashes: ".//foo" is "foo", not "/foo". */ + ++name; + } + + if (*name == '\0') + /* It was all slashes after a dot. */ +#if defined(VMS) + name = "[]"; +#elif defined(_AMIGA) + name = ""; +#else + name = "./"; +#endif + + file_key.hname = name; + f = hash_find_item (&files, &file_key); +#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS) + if (*name != '.') + free (lname); +#endif + + return f; +} + +/* Look up a file record for file NAME and return it. + Create a new record if one doesn't exist. NAME will be stored in the + new record so it should be constant or in the strcache etc. + */ + +struct file * +enter_file (const char *name) +{ + struct file *f; + struct file *new; + struct file **file_slot; + struct file file_key; + + assert (*name != '\0'); + assert (strcache_iscached (name)); + +#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS) + if (*name != '.') + { + const char *n; + char *lname, *ln; + lname = xstrdup (name); + for (n = name, ln = lname; *n != '\0'; ++n, ++ln) + if (isupper ((unsigned char)*n)) + *ln = tolower ((unsigned char)*n); + else + *ln = *n; + + *ln = '\0'; + name = strcache_add (lname); + free (lname); + } +#endif + + file_key.hname = name; + file_slot = (struct file **) hash_find_slot (&files, &file_key); + f = *file_slot; + if (! HASH_VACANT (f) && !f->double_colon) + return f; + + new = xcalloc (sizeof (struct file)); + new->name = new->hname = name; + new->update_status = -1; + + if (HASH_VACANT (f)) + { + new->last = new; + hash_insert_at (&files, new, file_slot); + } + else + { + /* There is already a double-colon entry for this file. */ + new->double_colon = f; + f->last->prev = new; + f->last = new; + } + + return new; +} + +/* Rehash FILE to NAME. This is not as simple as resetting + the `hname' member, since it must be put in a new hash bucket, + and possibly merged with an existing file called NAME. */ + +void +rehash_file (struct file *from_file, const char *to_hname) +{ + struct file file_key; + struct file **file_slot; + struct file *to_file; + struct file *deleted_file; + struct file *f; + + /* If it's already that name, we're done. */ + file_key.hname = to_hname; + if (! file_hash_cmp (from_file, &file_key)) + return; + + /* Find the end of the renamed list for the "from" file. */ + file_key.hname = from_file->hname; + while (from_file->renamed != 0) + from_file = from_file->renamed; + if (file_hash_cmp (from_file, &file_key)) + /* hname changed unexpectedly!! */ + abort (); + + /* Remove the "from" file from the hash. */ + deleted_file = hash_delete (&files, from_file); + if (deleted_file != from_file) + /* from_file isn't the one stored in files */ + abort (); + + /* Find where the newly renamed file will go in the hash. */ + file_key.hname = to_hname; + file_slot = (struct file **) hash_find_slot (&files, &file_key); + to_file = *file_slot; + + /* Change the hash name for this file. */ + from_file->hname = to_hname; + for (f = from_file->double_colon; f != 0; f = f->prev) + f->hname = to_hname; + + /* If the new name doesn't exist yet just set it to the renamed file. */ + if (HASH_VACANT (to_file)) + { + hash_insert_at (&files, from_file, file_slot); + return; + } + + /* TO_FILE already exists under TO_HNAME. + We must retain TO_FILE and merge FROM_FILE into it. */ + + if (from_file->cmds != 0) + { + if (to_file->cmds == 0) + to_file->cmds = from_file->cmds; + else if (from_file->cmds != to_file->cmds) + { + /* We have two sets of commands. We will go with the + one given in the rule explicitly mentioning this name, + but give a message to let the user know what's going on. */ + if (to_file->cmds->fileinfo.filenm != 0) + error (&from_file->cmds->fileinfo, + _("Recipe was specified for file `%s' at %s:%lu,"), + from_file->name, to_file->cmds->fileinfo.filenm, + to_file->cmds->fileinfo.lineno); + else + error (&from_file->cmds->fileinfo, + _("Recipe for file `%s' was found by implicit rule search,"), + from_file->name); + error (&from_file->cmds->fileinfo, + _("but `%s' is now considered the same file as `%s'."), + from_file->name, to_hname); + error (&from_file->cmds->fileinfo, + _("Recipe for `%s' will be ignored in favor of the one for `%s'."), + to_hname, from_file->name); + } + } + + /* Merge the dependencies of the two files. */ + + if (to_file->deps == 0) + to_file->deps = from_file->deps; + else + { + struct dep *deps = to_file->deps; + while (deps->next != 0) + deps = deps->next; + deps->next = from_file->deps; + } + + merge_variable_set_lists (&to_file->variables, from_file->variables); + + if (to_file->double_colon && from_file->is_target && !from_file->double_colon) + fatal (NILF, _("can't rename single-colon `%s' to double-colon `%s'"), + from_file->name, to_hname); + if (!to_file->double_colon && from_file->double_colon) + { + if (to_file->is_target) + fatal (NILF, _("can't rename double-colon `%s' to single-colon `%s'"), + from_file->name, to_hname); + else + to_file->double_colon = from_file->double_colon; + } + + if (from_file->last_mtime > to_file->last_mtime) + /* %%% Kludge so -W wins on a file that gets vpathized. */ + to_file->last_mtime = from_file->last_mtime; + + to_file->mtime_before_update = from_file->mtime_before_update; + +#define MERGE(field) to_file->field |= from_file->field + MERGE (precious); + MERGE (tried_implicit); + MERGE (updating); + MERGE (updated); + MERGE (is_target); + MERGE (cmd_target); + MERGE (phony); + MERGE (ignore_vpath); +#undef MERGE + + from_file->renamed = to_file; +} + +/* Rename FILE to NAME. This is not as simple as resetting + the `name' member, since it must be put in a new hash bucket, + and possibly merged with an existing file called NAME. */ + +void +rename_file (struct file *from_file, const char *to_hname) +{ + rehash_file (from_file, to_hname); + while (from_file) + { + from_file->name = from_file->hname; + from_file = from_file->prev; + } +} + +/* Remove all nonprecious intermediate files. + If SIG is nonzero, this was caused by a fatal signal, + meaning that a different message will be printed, and + the message will go to stderr rather than stdout. */ + +void +remove_intermediates (int sig) +{ + struct file **file_slot; + struct file **file_end; + int doneany = 0; + + /* If there's no way we will ever remove anything anyway, punt early. */ + if (question_flag || touch_flag || all_secondary) + return; + + if (sig && just_print_flag) + return; + + file_slot = (struct file **) files.ht_vec; + file_end = file_slot + files.ht_size; + for ( ; file_slot < file_end; file_slot++) + if (! HASH_VACANT (*file_slot)) + { + struct file *f = *file_slot; + /* Is this file eligible for automatic deletion? + Yes, IFF: it's marked intermediate, it's not secondary, it wasn't + given on the command line, and it's either a -include makefile or + it's not precious. */ + if (f->intermediate && (f->dontcare || !f->precious) + && !f->secondary && !f->cmd_target) + { + int status; + if (f->update_status == -1) + /* If nothing would have created this file yet, + don't print an "rm" command for it. */ + continue; + if (just_print_flag) + status = 0; + else + { + status = unlink (f->name); + if (status < 0 && errno == ENOENT) + continue; + } + if (!f->dontcare) + { + if (sig) + error (NILF, _("*** Deleting intermediate file `%s'"), f->name); + else + { + if (! doneany) + DB (DB_BASIC, (_("Removing intermediate files...\n"))); + if (!silent_flag) + { + if (! doneany) + { + fputs ("rm ", stdout); + doneany = 1; + } + else + putchar (' '); + fputs (f->name, stdout); + fflush (stdout); + } + } + if (status < 0) + perror_with_name ("unlink: ", f->name); + } + } + } + + if (doneany && !sig) + { + putchar ('\n'); + fflush (stdout); + } +} + +/* Given a string containing prerequisites (fully expanded), break it up into + a struct dep list. Enter each of these prereqs into the file database. + */ +struct dep * +split_prereqs (char *p) +{ + struct dep *new = PARSE_FILE_SEQ (&p, struct dep, '|', NULL, 0); + + if (*p) + { + /* Files that follow '|' are "order-only" prerequisites that satisfy the + dependency by existing: their modification times are irrelevant. */ + struct dep *ood; + + ++p; + ood = PARSE_FILE_SEQ (&p, struct dep, '\0', NULL, 0); + + if (! new) + new = ood; + else + { + struct dep *dp; + for (dp = new; dp->next != NULL; dp = dp->next) + ; + dp->next = ood; + } + + for (; ood != NULL; ood = ood->next) + ood->ignore_mtime = 1; + } + + return new; +} + +/* Given a list of prerequisites, enter them into the file database. + If STEM is set then first expand patterns using STEM. */ +struct dep * +enter_prereqs (struct dep *deps, const char *stem) +{ + struct dep *d1; + + if (deps == 0) + return 0; + + /* If we have a stem, expand the %'s. We use patsubst_expand to translate + the prerequisites' patterns into plain prerequisite names. */ + if (stem) + { + const char *pattern = "%"; + char *buffer = variable_expand (""); + struct dep *dp = deps, *dl = 0; + + while (dp != 0) + { + char *percent; + int nl = strlen (dp->name) + 1; + char *nm = alloca (nl); + memcpy (nm, dp->name, nl); + percent = find_percent (nm); + if (percent) + { + char *o; + + /* We have to handle empty stems specially, because that + would be equivalent to $(patsubst %,dp->name,) which + will always be empty. */ + if (stem[0] == '\0') + { + memmove (percent, percent+1, strlen (percent)); + o = variable_buffer_output (buffer, nm, strlen (nm) + 1); + } + else + o = patsubst_expand_pat (buffer, stem, pattern, nm, + pattern+1, percent+1); + + /* If the name expanded to the empty string, ignore it. */ + if (buffer[0] == '\0') + { + struct dep *df = dp; + if (dp == deps) + dp = deps = deps->next; + else + dp = dl->next = dp->next; + free_dep (df); + continue; + } + + /* Save the name. */ + dp->name = strcache_add_len (buffer, o - buffer); + } + dp->stem = stem; + dp->staticpattern = 1; + dl = dp; + dp = dp->next; + } + } + + /* Enter them as files, unless they need a 2nd expansion. */ + for (d1 = deps; d1 != 0; d1 = d1->next) + { + if (d1->need_2nd_expansion) + continue; + + d1->file = lookup_file (d1->name); + if (d1->file == 0) + d1->file = enter_file (d1->name); + d1->staticpattern = 0; + d1->name = 0; + } + + return deps; +} + +/* Set the intermediate flag. */ + +static void +set_intermediate (const void *item) +{ + struct file *f = (struct file *) item; + f->intermediate = 1; +} + +/* Expand and parse each dependency line. */ +static void +expand_deps (struct file *f) +{ + struct dep *d; + struct dep **dp; + const char *file_stem = f->stem; + int initialized = 0; + + f->updating = 0; + + /* Walk through the dependencies. For any dependency that needs 2nd + expansion, expand it then insert the result into the list. */ + dp = &f->deps; + d = f->deps; + while (d != 0) + { + char *p; + struct dep *new, *next; + char *name = (char *)d->name; + + if (! d->name || ! d->need_2nd_expansion) + { + /* This one is all set already. */ + dp = &d->next; + d = d->next; + continue; + } + + /* If it's from a static pattern rule, convert the patterns into + "$*" so they'll expand properly. */ + if (d->staticpattern) + { + char *o; + d->name = o = variable_expand (""); + o = subst_expand (o, name, "%", "$*", 1, 2, 0); + *o = '\0'; + free (name); + d->name = name = xstrdup (d->name); + d->staticpattern = 0; + } + + /* We're going to do second expansion so initialize file variables for + the file. Since the stem for static pattern rules comes from + individual dep lines, we will temporarily set f->stem to d->stem. */ + if (!initialized) + { + initialize_file_variables (f, 0); + initialized = 1; + } + + if (d->stem != 0) + f->stem = d->stem; + + set_file_variables (f); + + p = variable_expand_for_file (d->name, f); + + if (d->stem != 0) + f->stem = file_stem; + + /* At this point we don't need the name anymore: free it. */ + free (name); + + /* Parse the prerequisites and enter them into the file database. */ + new = enter_prereqs (split_prereqs (p), d->stem); + + /* If there were no prereqs here (blank!) then throw this one out. */ + if (new == 0) + { + *dp = d->next; + free_dep (d); + d = *dp; + continue; + } + + /* Add newly parsed prerequisites. */ + next = d->next; + *dp = new; + for (dp = &new->next, d = new->next; d != 0; dp = &d->next, d = d->next) + ; + *dp = next; + d = *dp; + } +} + +/* Reset the updating flag. */ + +static void +reset_updating (const void *item) +{ + struct file *f = (struct file *) item; + f->updating = 0; +} + +/* For each dependency of each file, make the `struct dep' point + at the appropriate `struct file' (which may have to be created). + + Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT, + and various other special targets. */ + +void +snap_deps (void) +{ + struct file *f; + struct file *f2; + struct dep *d; + + /* Remember that we've done this. Once we start snapping deps we can no + longer define new targets. */ + snapped_deps = 1; + + /* Perform second expansion and enter each dependency name as a file. We + must use hash_dump() here because within these loops we likely add new + files to the table, possibly causing an in-situ table expansion. + + We only need to do this if second_expansion has been defined; if it + hasn't then all deps were expanded as the makefile was read in. If we + ever change make to be able to unset .SECONDARY_EXPANSION this will have + to change. */ + + if (second_expansion) + { + struct file **file_slot_0 = (struct file **) hash_dump (&files, 0, 0); + struct file **file_end = file_slot_0 + files.ht_fill; + struct file **file_slot; + const char *suffixes; + + /* Expand .SUFFIXES: its prerequisites are used for $$* calc. */ + f = lookup_file (".SUFFIXES"); + suffixes = f ? f->name : 0; + for (; f != 0; f = f->prev) + expand_deps (f); + + /* For every target that's not .SUFFIXES, expand its prerequisites. */ + + for (file_slot = file_slot_0; file_slot < file_end; file_slot++) + for (f = *file_slot; f != 0; f = f->prev) + if (f->name != suffixes) + expand_deps (f); + free (file_slot_0); + } + else + /* We're not doing second expansion, so reset updating. */ + hash_map (&files, reset_updating); + + /* Now manage all the special targets. */ + + for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev) + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->precious = 1; + + for (f = lookup_file (".LOW_RESOLUTION_TIME"); f != 0; f = f->prev) + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->low_resolution_time = 1; + + for (f = lookup_file (".PHONY"); f != 0; f = f->prev) + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + { + /* Mark this file as phony nonexistent target. */ + f2->phony = 1; + f2->is_target = 1; + f2->last_mtime = NONEXISTENT_MTIME; + f2->mtime_before_update = NONEXISTENT_MTIME; + } + + for (f = lookup_file (".INTERMEDIATE"); f != 0; f = f->prev) + /* Mark .INTERMEDIATE deps as intermediate files. */ + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->intermediate = 1; + /* .INTERMEDIATE with no deps does nothing. + Marking all files as intermediates is useless since the goal targets + would be deleted after they are built. */ + + for (f = lookup_file (".SECONDARY"); f != 0; f = f->prev) + /* Mark .SECONDARY deps as both intermediate and secondary. */ + if (f->deps) + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->intermediate = f2->secondary = 1; + /* .SECONDARY with no deps listed marks *all* files that way. */ + else + { + all_secondary = 1; + hash_map (&files, set_intermediate); + } + + f = lookup_file (".EXPORT_ALL_VARIABLES"); + if (f != 0 && f->is_target) + export_all_variables = 1; + + f = lookup_file (".IGNORE"); + if (f != 0 && f->is_target) + { + if (f->deps == 0) + ignore_errors_flag = 1; + else + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->command_flags |= COMMANDS_NOERROR; + } + + f = lookup_file (".SILENT"); + if (f != 0 && f->is_target) + { + if (f->deps == 0) + silent_flag = 1; + else + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->command_flags |= COMMANDS_SILENT; + } + + f = lookup_file (".NOTPARALLEL"); + if (f != 0 && f->is_target) + not_parallel = 1; + +#ifndef NO_MINUS_C_MINUS_O + /* If .POSIX was defined, remove OUTPUT_OPTION to comply. */ + /* This needs more work: what if the user sets this in the makefile? + if (posix_pedantic) + define_variable_cname ("OUTPUT_OPTION", "", o_default, 1); + */ +#endif +} + +/* Set the `command_state' member of FILE and all its `also_make's. */ + +void +set_command_state (struct file *file, enum cmd_state state) +{ + struct dep *d; + + file->command_state = state; + + for (d = file->also_make; d != 0; d = d->next) + d->file->command_state = state; +} + +/* Convert an external file timestamp to internal form. */ + +FILE_TIMESTAMP +file_timestamp_cons (const char *fname, time_t s, int ns) +{ + int offset = ORDINARY_MTIME_MIN + (FILE_TIMESTAMP_HI_RES ? ns : 0); + FILE_TIMESTAMP product = (FILE_TIMESTAMP) s << FILE_TIMESTAMP_LO_BITS; + FILE_TIMESTAMP ts = product + offset; + + if (! (s <= FILE_TIMESTAMP_S (ORDINARY_MTIME_MAX) + && product <= ts && ts <= ORDINARY_MTIME_MAX)) + { + char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1]; + ts = s <= OLD_MTIME ? ORDINARY_MTIME_MIN : ORDINARY_MTIME_MAX; + file_timestamp_sprintf (buf, ts); + error (NILF, _("%s: Timestamp out of range; substituting %s"), + fname ? fname : _("Current time"), buf); + } + + return ts; +} + +/* Return the current time as a file timestamp, setting *RESOLUTION to + its resolution. */ +FILE_TIMESTAMP +file_timestamp_now (int *resolution) +{ + int r; + time_t s; + int ns; + + /* Don't bother with high-resolution clocks if file timestamps have + only one-second resolution. The code below should work, but it's + not worth the hassle of debugging it on hosts where it fails. */ +#if FILE_TIMESTAMP_HI_RES +# if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME + { + struct timespec timespec; + if (clock_gettime (CLOCK_REALTIME, ×pec) == 0) + { + r = 1; + s = timespec.tv_sec; + ns = timespec.tv_nsec; + goto got_time; + } + } +# endif +# if HAVE_GETTIMEOFDAY + { + struct timeval timeval; + if (gettimeofday (&timeval, 0) == 0) + { + r = 1000; + s = timeval.tv_sec; + ns = timeval.tv_usec * 1000; + goto got_time; + } + } +# endif +#endif + + r = 1000000000; + s = time ((time_t *) 0); + ns = 0; + +#if FILE_TIMESTAMP_HI_RES + got_time: +#endif + *resolution = r; + return file_timestamp_cons (0, s, ns); +} + +/* Place into the buffer P a printable representation of the file + timestamp TS. */ +void +file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts) +{ + time_t t = FILE_TIMESTAMP_S (ts); + struct tm *tm = localtime (&t); + + if (tm) + sprintf (p, "%04d-%02d-%02d %02d:%02d:%02d", + tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); + else if (t < 0) + sprintf (p, "%ld", (long) t); + else + sprintf (p, "%lu", (unsigned long) t); + p += strlen (p); + + /* Append nanoseconds as a fraction, but remove trailing zeros. We don't + know the actual timestamp resolution, since clock_getres applies only to + local times, whereas this timestamp might come from a remote filesystem. + So removing trailing zeros is the best guess that we can do. */ + sprintf (p, ".%09d", FILE_TIMESTAMP_NS (ts)); + p += strlen (p) - 1; + while (*p == '0') + p--; + p += *p != '.'; + + *p = '\0'; +} + +/* Print the data base of files. */ + +void +print_prereqs (const struct dep *deps) +{ + const struct dep *ood = 0; + + /* Print all normal dependencies; note any order-only deps. */ + for (; deps != 0; deps = deps->next) + if (! deps->ignore_mtime) + printf (" %s", dep_name (deps)); + else if (! ood) + ood = deps; + + /* Print order-only deps, if we have any. */ + if (ood) + { + printf (" | %s", dep_name (ood)); + for (ood = ood->next; ood != 0; ood = ood->next) + if (ood->ignore_mtime) + printf (" %s", dep_name (ood)); + } + + putchar ('\n'); +} + +static void +print_file (const void *item) +{ + const struct file *f = item; + + putchar ('\n'); + if (!f->is_target) + puts (_("# Not a target:")); + printf ("%s:%s", f->name, f->double_colon ? ":" : ""); + print_prereqs (f->deps); + + if (f->precious) + puts (_("# Precious file (prerequisite of .PRECIOUS).")); + if (f->phony) + puts (_("# Phony target (prerequisite of .PHONY).")); + if (f->cmd_target) + puts (_("# Command line target.")); + if (f->dontcare) + puts (_("# A default, MAKEFILES, or -include/sinclude makefile.")); + puts (f->tried_implicit + ? _("# Implicit rule search has been done.") + : _("# Implicit rule search has not been done.")); + if (f->stem != 0) + printf (_("# Implicit/static pattern stem: `%s'\n"), f->stem); + if (f->intermediate) + puts (_("# File is an intermediate prerequisite.")); + if (f->also_make != 0) + { + const struct dep *d; + fputs (_("# Also makes:"), stdout); + for (d = f->also_make; d != 0; d = d->next) + printf (" %s", dep_name (d)); + putchar ('\n'); + } + if (f->last_mtime == UNKNOWN_MTIME) + puts (_("# Modification time never checked.")); + else if (f->last_mtime == NONEXISTENT_MTIME) + puts (_("# File does not exist.")); + else if (f->last_mtime == OLD_MTIME) + puts (_("# File is very old.")); + else + { + char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1]; + file_timestamp_sprintf (buf, f->last_mtime); + printf (_("# Last modified %s\n"), buf); + } + puts (f->updated + ? _("# File has been updated.") : _("# File has not been updated.")); + switch (f->command_state) + { + case cs_running: + puts (_("# Recipe currently running (THIS IS A BUG).")); + break; + case cs_deps_running: + puts (_("# Dependencies recipe running (THIS IS A BUG).")); + break; + case cs_not_started: + case cs_finished: + switch (f->update_status) + { + case -1: + break; + case 0: + puts (_("# Successfully updated.")); + break; + case 1: + assert (question_flag); + puts (_("# Needs to be updated (-q is set).")); + break; + case 2: + puts (_("# Failed to be updated.")); + break; + default: + puts (_("# Invalid value in `update_status' member!")); + fflush (stdout); + fflush (stderr); + abort (); + } + break; + default: + puts (_("# Invalid value in `command_state' member!")); + fflush (stdout); + fflush (stderr); + abort (); + } + + if (f->variables != 0) + print_file_variables (f); + + if (f->cmds != 0) + print_commands (f->cmds); + + if (f->prev) + print_file ((const void *) f->prev); +} + +void +print_file_data_base (void) +{ + puts (_("\n# Files")); + + hash_map (&files, print_file); + + fputs (_("\n# files hash-table stats:\n# "), stdout); + hash_print_stats (&files, stdout); +} + +/* Verify the integrity of the data base of files. */ + +#define VERIFY_CACHED(_p,_n) \ + do{\ + if (_p->_n && _p->_n[0] && !strcache_iscached (_p->_n)) \ + error (NULL, "%s: Field '%s' not cached: %s\n", _p->name, # _n, _p->_n); \ + }while(0) + +static void +verify_file (const void *item) +{ + const struct file *f = item; + const struct dep *d; + + VERIFY_CACHED (f, name); + VERIFY_CACHED (f, hname); + VERIFY_CACHED (f, vpath); + VERIFY_CACHED (f, stem); + + /* Check the deps. */ + for (d = f->deps; d != 0; d = d->next) + { + if (! d->need_2nd_expansion) + VERIFY_CACHED (d, name); + VERIFY_CACHED (d, stem); + } +} + +void +verify_file_data_base (void) +{ + hash_map (&files, verify_file); +} + +#define EXPANSION_INCREMENT(_l) ((((_l) / 500) + 1) * 500) + +char * +build_target_list (char *value) +{ + static unsigned long last_targ_count = 0; + + if (files.ht_fill != last_targ_count) + { + unsigned long max = EXPANSION_INCREMENT (strlen (value)); + unsigned long len; + char *p; + struct file **fp = (struct file **) files.ht_vec; + struct file **end = &fp[files.ht_size]; + + /* Make sure we have at least MAX bytes in the allocated buffer. */ + value = xrealloc (value, max); + + p = value; + len = 0; + for (; fp < end; ++fp) + if (!HASH_VACANT (*fp) && (*fp)->is_target) + { + struct file *f = *fp; + int l = strlen (f->name); + + len += l + 1; + if (len > max) + { + unsigned long off = p - value; + + max += EXPANSION_INCREMENT (l + 1); + value = xrealloc (value, max); + p = &value[off]; + } + + memcpy (p, f->name, l); + p += l; + *(p++) = ' '; + } + *(p-1) = '\0'; + + last_targ_count = files.ht_fill; + } + + return value; +} + +void +init_hash_files (void) +{ + hash_init (&files, 1000, file_hash_1, file_hash_2, file_hash_cmp); +} + +/* EOF */ diff --git a/filedef.h b/filedef.h new file mode 100644 index 0000000..0a621b9 --- /dev/null +++ b/filedef.h @@ -0,0 +1,205 @@ +/* Definition of target file data structures for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + + +/* Structure that represents the info on one file + that the makefile says how to make. + All of these are chained together through `next'. */ + +#include "hash.h" + +struct file + { + const char *name; + const char *hname; /* Hashed filename */ + const char *vpath; /* VPATH/vpath pathname */ + struct dep *deps; /* all dependencies, including duplicates */ + struct commands *cmds; /* Commands to execute for this target. */ + int command_flags; /* Flags OR'd in for cmds; see commands.h. */ + const char *stem; /* Implicit stem, if an implicit + rule has been used */ + struct dep *also_make; /* Targets that are made by making this. */ + FILE_TIMESTAMP last_mtime; /* File's modtime, if already known. */ + FILE_TIMESTAMP mtime_before_update; /* File's modtime before any updating + has been performed. */ + struct file *prev; /* Previous entry for same file name; + used when there are multiple double-colon + entries for the same file. */ + struct file *last; /* Last entry for the same file name. */ + + /* File that this file was renamed to. After any time that a + file could be renamed, call `check_renamed' (below). */ + struct file *renamed; + + /* List of variable sets used for this file. */ + struct variable_set_list *variables; + + /* Pattern-specific variable reference for this target, or null if there + isn't one. Also see the pat_searched flag, below. */ + struct variable_set_list *pat_variables; + + /* Immediate dependent that caused this target to be remade, + or nil if there isn't one. */ + struct file *parent; + + /* For a double-colon entry, this is the first double-colon entry for + the same file. Otherwise this is null. */ + struct file *double_colon; + + short int update_status; /* Status of the last attempt to update, + or -1 if none has been made. */ + + enum cmd_state /* State of the commands. */ + { /* Note: It is important that cs_not_started be zero. */ + cs_not_started, /* Not yet started. */ + cs_deps_running, /* Dep commands running. */ + cs_running, /* Commands running. */ + cs_finished /* Commands finished. */ + } command_state ENUM_BITFIELD (2); + + unsigned int precious:1; /* Non-0 means don't delete file on quit */ + unsigned int low_resolution_time:1; /* Nonzero if this file's time stamp + has only one-second resolution. */ + unsigned int tried_implicit:1; /* Nonzero if have searched + for implicit rule for making + this file; don't search again. */ + unsigned int updating:1; /* Nonzero while updating deps of this file */ + unsigned int updated:1; /* Nonzero if this file has been remade. */ + unsigned int is_target:1; /* Nonzero if file is described as target. */ + unsigned int cmd_target:1; /* Nonzero if file was given on cmd line. */ + unsigned int phony:1; /* Nonzero if this is a phony file + i.e., a prerequisite of .PHONY. */ + unsigned int intermediate:1;/* Nonzero if this is an intermediate file. */ + unsigned int secondary:1; /* Nonzero means remove_intermediates should + not delete it. */ + unsigned int dontcare:1; /* Nonzero if no complaint is to be made if + this target cannot be remade. */ + unsigned int ignore_vpath:1;/* Nonzero if we threw out VPATH name. */ + unsigned int pat_searched:1;/* Nonzero if we already searched for + pattern-specific variables. */ + unsigned int considered:1; /* equal to 'considered' if file has been + considered on current scan of goal chain */ + unsigned int no_diag:1; /* True if the file failed to update and no + diagnostics has been issued (dontcare). */ + }; + + +extern struct file *suffix_file, *default_file; + + +struct file *lookup_file (const char *name); +struct file *enter_file (const char *name); +struct dep *split_prereqs (char *prereqstr); +struct dep *enter_prereqs (struct dep *prereqs, const char *stem); +void remove_intermediates (int sig); +void snap_deps (void); +void rename_file (struct file *file, const char *name); +void rehash_file (struct file *file, const char *name); +void set_command_state (struct file *file, enum cmd_state state); +void notice_finished_file (struct file *file); +void init_hash_files (void); +char *build_target_list (char *old_list); +void print_prereqs (const struct dep *deps); +void print_file_data_base (void); + +#if FILE_TIMESTAMP_HI_RES +# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \ + file_timestamp_cons (fname, (st).st_mtime, (st).st_mtim.ST_MTIM_NSEC) +#else +# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \ + file_timestamp_cons (fname, (st).st_mtime, 0) +#endif + +/* If FILE_TIMESTAMP is 64 bits (or more), use nanosecond resolution. + (Multiply by 2**30 instead of by 10**9 to save time at the cost of + slightly decreasing the number of available timestamps.) With + 64-bit FILE_TIMESTAMP, this stops working on 2514-05-30 01:53:04 + UTC, but by then uintmax_t should be larger than 64 bits. */ +#define FILE_TIMESTAMPS_PER_S (FILE_TIMESTAMP_HI_RES ? 1000000000 : 1) +#define FILE_TIMESTAMP_LO_BITS (FILE_TIMESTAMP_HI_RES ? 30 : 0) + +#define FILE_TIMESTAMP_S(ts) (((ts) - ORDINARY_MTIME_MIN) \ + >> FILE_TIMESTAMP_LO_BITS) +#define FILE_TIMESTAMP_NS(ts) ((int) (((ts) - ORDINARY_MTIME_MIN) \ + & ((1 << FILE_TIMESTAMP_LO_BITS) - 1))) + +/* Upper bound on length of string "YYYY-MM-DD HH:MM:SS.NNNNNNNNN" + representing a file timestamp. The upper bound is not necessarily 19, + since the year might be less than -999 or greater than 9999. + + Subtract one for the sign bit if in case file timestamps can be negative; + subtract FLOOR_LOG2_SECONDS_PER_YEAR to yield an upper bound on how many + file timestamp bits might affect the year; + 302 / 1000 is log10 (2) rounded up; + add one for integer division truncation; + add one more for a minus sign if file timestamps can be negative; + add 4 to allow for any 4-digit epoch year (e.g. 1970); + add 25 to allow for "-MM-DD HH:MM:SS.NNNNNNNNN". */ +#define FLOOR_LOG2_SECONDS_PER_YEAR 24 +#define FILE_TIMESTAMP_PRINT_LEN_BOUND \ + (((sizeof (FILE_TIMESTAMP) * CHAR_BIT - 1 - FLOOR_LOG2_SECONDS_PER_YEAR) \ + * 302 / 1000) \ + + 1 + 1 + 4 + 25) + +FILE_TIMESTAMP file_timestamp_cons (char const *, time_t, int); +FILE_TIMESTAMP file_timestamp_now (int *); +void file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts); + +/* Return the mtime of file F (a struct file *), caching it. + The value is NONEXISTENT_MTIME if the file does not exist. */ +#define file_mtime(f) file_mtime_1 ((f), 1) +/* Return the mtime of file F (a struct file *), caching it. + Don't search using vpath for the file--if it doesn't actually exist, + we don't find it. + The value is NONEXISTENT_MTIME if the file does not exist. */ +#define file_mtime_no_search(f) file_mtime_1 ((f), 0) +FILE_TIMESTAMP f_mtime (struct file *file, int search); +#define file_mtime_1(f, v) \ + ((f)->last_mtime == UNKNOWN_MTIME ? f_mtime ((f), v) : (f)->last_mtime) + +/* Special timestamp values. */ + +/* The file's timestamp is not yet known. */ +#define UNKNOWN_MTIME 0 + +/* The file does not exist. */ +#define NONEXISTENT_MTIME 1 + +/* The file does not exist, and we assume that it is older than any + actual file. */ +#define OLD_MTIME 2 + +/* The smallest and largest ordinary timestamps. */ +#define ORDINARY_MTIME_MIN (OLD_MTIME + 1) +#define ORDINARY_MTIME_MAX ((FILE_TIMESTAMP_S (NEW_MTIME) \ + << FILE_TIMESTAMP_LO_BITS) \ + + ORDINARY_MTIME_MIN + FILE_TIMESTAMPS_PER_S - 1) + +/* Modtime value to use for `infinitely new'. We used to get the current time + from the system and use that whenever we wanted `new'. But that causes + trouble when the machine running make and the machine holding a file have + different ideas about what time it is; and can also lose for `force' + targets, which need to be considered newer than anything that depends on + them, even if said dependents' modtimes are in the future. */ +#define NEW_MTIME INTEGER_TYPE_MAXIMUM (FILE_TIMESTAMP) + +#define check_renamed(file) \ + while ((file)->renamed != 0) (file) = (file)->renamed /* No ; here. */ + +/* Have we snapped deps yet? */ +extern int snapped_deps; diff --git a/function.c b/function.c new file mode 100644 index 0000000..e2f6c8c --- /dev/null +++ b/function.c @@ -0,0 +1,2398 @@ +/* Builtin function expansion for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "filedef.h" +#include "variable.h" +#include "dep.h" +#include "job.h" +#include "commands.h" +#include "debug.h" + +#ifdef _AMIGA +#include "amiga.h" +#endif + + +struct function_table_entry + { + const char *name; + unsigned char len; + unsigned char minimum_args; + unsigned char maximum_args; + char expand_args; + char *(*func_ptr) (char *output, char **argv, const char *fname); + }; + +static unsigned long +function_table_entry_hash_1 (const void *keyv) +{ + const struct function_table_entry *key = keyv; + return_STRING_N_HASH_1 (key->name, key->len); +} + +static unsigned long +function_table_entry_hash_2 (const void *keyv) +{ + const struct function_table_entry *key = keyv; + return_STRING_N_HASH_2 (key->name, key->len); +} + +static int +function_table_entry_hash_cmp (const void *xv, const void *yv) +{ + const struct function_table_entry *x = xv; + const struct function_table_entry *y = yv; + int result = x->len - y->len; + if (result) + return result; + return_STRING_N_COMPARE (x->name, y->name, x->len); +} + +static struct hash_table function_table; + + +/* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing + each occurrence of SUBST with REPLACE. TEXT is null-terminated. SLEN is + the length of SUBST and RLEN is the length of REPLACE. If BY_WORD is + nonzero, substitutions are done only on matches which are complete + whitespace-delimited words. */ + +char * +subst_expand (char *o, const char *text, const char *subst, const char *replace, + unsigned int slen, unsigned int rlen, int by_word) +{ + const char *t = text; + const char *p; + + if (slen == 0 && !by_word) + { + /* The first occurrence of "" in any string is its end. */ + o = variable_buffer_output (o, t, strlen (t)); + if (rlen > 0) + o = variable_buffer_output (o, replace, rlen); + return o; + } + + do + { + if (by_word && slen == 0) + /* When matching by words, the empty string should match + the end of each word, rather than the end of the whole text. */ + p = end_of_token (next_token (t)); + else + { + p = strstr (t, subst); + if (p == 0) + { + /* No more matches. Output everything left on the end. */ + o = variable_buffer_output (o, t, strlen (t)); + return o; + } + } + + /* Output everything before this occurrence of the string to replace. */ + if (p > t) + o = variable_buffer_output (o, t, p - t); + + /* If we're substituting only by fully matched words, + or only at the ends of words, check that this case qualifies. */ + if (by_word + && ((p > text && !isblank ((unsigned char)p[-1])) + || (p[slen] != '\0' && !isblank ((unsigned char)p[slen])))) + /* Struck out. Output the rest of the string that is + no longer to be replaced. */ + o = variable_buffer_output (o, subst, slen); + else if (rlen > 0) + /* Output the replacement string. */ + o = variable_buffer_output (o, replace, rlen); + + /* Advance T past the string to be replaced. */ + t = p + slen; + } while (*t != '\0'); + + return o; +} + + +/* Store into VARIABLE_BUFFER at O the result of scanning TEXT + and replacing strings matching PATTERN with REPLACE. + If PATTERN_PERCENT is not nil, PATTERN has already been + run through find_percent, and PATTERN_PERCENT is the result. + If REPLACE_PERCENT is not nil, REPLACE has already been + run through find_percent, and REPLACE_PERCENT is the result. + Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the + character _AFTER_ the %, not to the % itself. +*/ + +char * +patsubst_expand_pat (char *o, const char *text, + const char *pattern, const char *replace, + const char *pattern_percent, const char *replace_percent) +{ + unsigned int pattern_prepercent_len, pattern_postpercent_len; + unsigned int replace_prepercent_len, replace_postpercent_len; + const char *t; + unsigned int len; + int doneany = 0; + + /* Record the length of REPLACE before and after the % so we don't have to + compute these lengths more than once. */ + if (replace_percent) + { + replace_prepercent_len = replace_percent - replace - 1; + replace_postpercent_len = strlen (replace_percent); + } + else + { + replace_prepercent_len = strlen (replace); + replace_postpercent_len = 0; + } + + if (!pattern_percent) + /* With no % in the pattern, this is just a simple substitution. */ + return subst_expand (o, text, pattern, replace, + strlen (pattern), strlen (replace), 1); + + /* Record the length of PATTERN before and after the % + so we don't have to compute it more than once. */ + pattern_prepercent_len = pattern_percent - pattern - 1; + pattern_postpercent_len = strlen (pattern_percent); + + while ((t = find_next_token (&text, &len)) != 0) + { + int fail = 0; + + /* Is it big enough to match? */ + if (len < pattern_prepercent_len + pattern_postpercent_len) + fail = 1; + + /* Does the prefix match? */ + if (!fail && pattern_prepercent_len > 0 + && (*t != *pattern + || t[pattern_prepercent_len - 1] != pattern_percent[-2] + || !strneq (t + 1, pattern + 1, pattern_prepercent_len - 1))) + fail = 1; + + /* Does the suffix match? */ + if (!fail && pattern_postpercent_len > 0 + && (t[len - 1] != pattern_percent[pattern_postpercent_len - 1] + || t[len - pattern_postpercent_len] != *pattern_percent + || !strneq (&t[len - pattern_postpercent_len], + pattern_percent, pattern_postpercent_len - 1))) + fail = 1; + + if (fail) + /* It didn't match. Output the string. */ + o = variable_buffer_output (o, t, len); + else + { + /* It matched. Output the replacement. */ + + /* Output the part of the replacement before the %. */ + o = variable_buffer_output (o, replace, replace_prepercent_len); + + if (replace_percent != 0) + { + /* Output the part of the matched string that + matched the % in the pattern. */ + o = variable_buffer_output (o, t + pattern_prepercent_len, + len - (pattern_prepercent_len + + pattern_postpercent_len)); + /* Output the part of the replacement after the %. */ + o = variable_buffer_output (o, replace_percent, + replace_postpercent_len); + } + } + + /* Output a space, but not if the replacement is "". */ + if (fail || replace_prepercent_len > 0 + || (replace_percent != 0 && len + replace_postpercent_len > 0)) + { + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + } + if (doneany) + /* Kill the last space. */ + --o; + + return o; +} + +/* Store into VARIABLE_BUFFER at O the result of scanning TEXT + and replacing strings matching PATTERN with REPLACE. + If PATTERN_PERCENT is not nil, PATTERN has already been + run through find_percent, and PATTERN_PERCENT is the result. + If REPLACE_PERCENT is not nil, REPLACE has already been + run through find_percent, and REPLACE_PERCENT is the result. + Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the + character _AFTER_ the %, not to the % itself. +*/ + +char * +patsubst_expand (char *o, const char *text, char *pattern, char *replace) +{ + const char *pattern_percent = find_percent (pattern); + const char *replace_percent = find_percent (replace); + + /* If there's a percent in the pattern or replacement skip it. */ + if (replace_percent) + ++replace_percent; + if (pattern_percent) + ++pattern_percent; + + return patsubst_expand_pat (o, text, pattern, replace, + pattern_percent, replace_percent); +} + + +/* Look up a function by name. */ + +static const struct function_table_entry * +lookup_function (const char *s) +{ + const char *e = s; + + while (*e && ( (*e >= 'a' && *e <= 'z') || *e == '-')) + e++; + if (*e == '\0' || isblank ((unsigned char) *e)) + { + struct function_table_entry function_table_entry_key; + function_table_entry_key.name = s; + function_table_entry_key.len = e - s; + + return hash_find_item (&function_table, &function_table_entry_key); + } + return 0; +} + + +/* Return 1 if PATTERN matches STR, 0 if not. */ + +int +pattern_matches (const char *pattern, const char *percent, const char *str) +{ + unsigned int sfxlen, strlength; + + if (percent == 0) + { + unsigned int len = strlen (pattern) + 1; + char *new_chars = alloca (len); + memcpy (new_chars, pattern, len); + percent = find_percent (new_chars); + if (percent == 0) + return streq (new_chars, str); + pattern = new_chars; + } + + sfxlen = strlen (percent + 1); + strlength = strlen (str); + + if (strlength < (percent - pattern) + sfxlen + || !strneq (pattern, str, percent - pattern)) + return 0; + + return !strcmp (percent + 1, str + (strlength - sfxlen)); +} + + +/* Find the next comma or ENDPAREN (counting nested STARTPAREN and + ENDPARENtheses), starting at PTR before END. Return a pointer to + next character. + + If no next argument is found, return NULL. +*/ + +static char * +find_next_argument (char startparen, char endparen, + const char *ptr, const char *end) +{ + int count = 0; + + for (; ptr < end; ++ptr) + if (*ptr == startparen) + ++count; + + else if (*ptr == endparen) + { + --count; + if (count < 0) + return NULL; + } + + else if (*ptr == ',' && !count) + return (char *)ptr; + + /* We didn't find anything. */ + return NULL; +} + + +/* Glob-expand LINE. The returned pointer is + only good until the next call to string_glob. */ + +static char * +string_glob (char *line) +{ + static char *result = 0; + static unsigned int length; + struct nameseq *chain; + unsigned int idx; + + chain = PARSE_FILE_SEQ (&line, struct nameseq, '\0', NULL, + /* We do not want parse_file_seq to strip `./'s. + That would break examples like: + $(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)). */ + PARSEFS_NOSTRIP|PARSEFS_NOCACHE|PARSEFS_EXISTS); + + if (result == 0) + { + length = 100; + result = xmalloc (100); + } + + idx = 0; + while (chain != 0) + { + struct nameseq *next = chain->next; + unsigned int len = strlen (chain->name); + + if (idx + len + 1 > length) + { + length += (len + 1) * 2; + result = xrealloc (result, length); + } + memcpy (&result[idx], chain->name, len); + idx += len; + result[idx++] = ' '; + + /* Because we used PARSEFS_NOCACHE above, we have to free() NAME. */ + free ((char *)chain->name); + free (chain); + chain = next; + } + + /* Kill the last space and terminate the string. */ + if (idx == 0) + result[0] = '\0'; + else + result[idx - 1] = '\0'; + + return result; +} + +/* + Builtin functions + */ + +static char * +func_patsubst (char *o, char **argv, const char *funcname UNUSED) +{ + o = patsubst_expand (o, argv[2], argv[0], argv[1]); + return o; +} + + +static char * +func_join (char *o, char **argv, const char *funcname UNUSED) +{ + int doneany = 0; + + /* Write each word of the first argument directly followed + by the corresponding word of the second argument. + If the two arguments have a different number of words, + the excess words are just output separated by blanks. */ + const char *tp; + const char *pp; + const char *list1_iterator = argv[0]; + const char *list2_iterator = argv[1]; + do + { + unsigned int len1, len2; + + tp = find_next_token (&list1_iterator, &len1); + if (tp != 0) + o = variable_buffer_output (o, tp, len1); + + pp = find_next_token (&list2_iterator, &len2); + if (pp != 0) + o = variable_buffer_output (o, pp, len2); + + if (tp != 0 || pp != 0) + { + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + } + while (tp != 0 || pp != 0); + if (doneany) + /* Kill the last blank. */ + --o; + + return o; +} + + +static char * +func_origin (char *o, char **argv, const char *funcname UNUSED) +{ + /* Expand the argument. */ + struct variable *v = lookup_variable (argv[0], strlen (argv[0])); + if (v == 0) + o = variable_buffer_output (o, "undefined", 9); + else + switch (v->origin) + { + default: + case o_invalid: + abort (); + break; + case o_default: + o = variable_buffer_output (o, "default", 7); + break; + case o_env: + o = variable_buffer_output (o, "environment", 11); + break; + case o_file: + o = variable_buffer_output (o, "file", 4); + break; + case o_env_override: + o = variable_buffer_output (o, "environment override", 20); + break; + case o_command: + o = variable_buffer_output (o, "command line", 12); + break; + case o_override: + o = variable_buffer_output (o, "override", 8); + break; + case o_automatic: + o = variable_buffer_output (o, "automatic", 9); + break; + } + + return o; +} + +static char * +func_flavor (char *o, char **argv, const char *funcname UNUSED) +{ + struct variable *v = lookup_variable (argv[0], strlen (argv[0])); + + if (v == 0) + o = variable_buffer_output (o, "undefined", 9); + else + if (v->recursive) + o = variable_buffer_output (o, "recursive", 9); + else + o = variable_buffer_output (o, "simple", 6); + + return o; +} + +#ifdef VMS +# define IS_PATHSEP(c) ((c) == ']') +#else +# ifdef HAVE_DOS_PATHS +# define IS_PATHSEP(c) ((c) == '/' || (c) == '\\') +# else +# define IS_PATHSEP(c) ((c) == '/') +# endif +#endif + + +static char * +func_notdir_suffix (char *o, char **argv, const char *funcname) +{ + /* Expand the argument. */ + const char *list_iterator = argv[0]; + const char *p2; + int doneany =0; + unsigned int len=0; + + int is_suffix = streq (funcname, "suffix"); + int is_notdir = !is_suffix; + while ((p2 = find_next_token (&list_iterator, &len)) != 0) + { + const char *p = p2 + len; + + + while (p >= p2 && (!is_suffix || *p != '.')) + { + if (IS_PATHSEP (*p)) + break; + --p; + } + + if (p >= p2) + { + if (is_notdir) + ++p; + else if (*p != '.') + continue; + o = variable_buffer_output (o, p, len - (p - p2)); + } +#ifdef HAVE_DOS_PATHS + /* Handle the case of "d:foo/bar". */ + else if (streq (funcname, "notdir") && p2[0] && p2[1] == ':') + { + p = p2 + 2; + o = variable_buffer_output (o, p, len - (p - p2)); + } +#endif + else if (is_notdir) + o = variable_buffer_output (o, p2, len); + + if (is_notdir || p >= p2) + { + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + } + + if (doneany) + /* Kill last space. */ + --o; + + return o; +} + + +static char * +func_basename_dir (char *o, char **argv, const char *funcname) +{ + /* Expand the argument. */ + const char *p3 = argv[0]; + const char *p2; + int doneany=0; + unsigned int len=0; + + int is_basename= streq (funcname, "basename"); + int is_dir= !is_basename; + + while ((p2 = find_next_token (&p3, &len)) != 0) + { + const char *p = p2 + len; + while (p >= p2 && (!is_basename || *p != '.')) + { + if (IS_PATHSEP (*p)) + break; + --p; + } + + if (p >= p2 && (is_dir)) + o = variable_buffer_output (o, p2, ++p - p2); + else if (p >= p2 && (*p == '.')) + o = variable_buffer_output (o, p2, p - p2); +#ifdef HAVE_DOS_PATHS + /* Handle the "d:foobar" case */ + else if (p2[0] && p2[1] == ':' && is_dir) + o = variable_buffer_output (o, p2, 2); +#endif + else if (is_dir) +#ifdef VMS + o = variable_buffer_output (o, "[]", 2); +#else +#ifndef _AMIGA + o = variable_buffer_output (o, "./", 2); +#else + ; /* Just a nop... */ +#endif /* AMIGA */ +#endif /* !VMS */ + else + /* The entire name is the basename. */ + o = variable_buffer_output (o, p2, len); + + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + + if (doneany) + /* Kill last space. */ + --o; + + return o; +} + +static char * +func_addsuffix_addprefix (char *o, char **argv, const char *funcname) +{ + int fixlen = strlen (argv[0]); + const char *list_iterator = argv[1]; + int is_addprefix = streq (funcname, "addprefix"); + int is_addsuffix = !is_addprefix; + + int doneany = 0; + const char *p; + unsigned int len; + + while ((p = find_next_token (&list_iterator, &len)) != 0) + { + if (is_addprefix) + o = variable_buffer_output (o, argv[0], fixlen); + o = variable_buffer_output (o, p, len); + if (is_addsuffix) + o = variable_buffer_output (o, argv[0], fixlen); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + + if (doneany) + /* Kill last space. */ + --o; + + return o; +} + +static char * +func_subst (char *o, char **argv, const char *funcname UNUSED) +{ + o = subst_expand (o, argv[2], argv[0], argv[1], strlen (argv[0]), + strlen (argv[1]), 0); + + return o; +} + + +static char * +func_firstword (char *o, char **argv, const char *funcname UNUSED) +{ + unsigned int i; + const char *words = argv[0]; /* Use a temp variable for find_next_token */ + const char *p = find_next_token (&words, &i); + + if (p != 0) + o = variable_buffer_output (o, p, i); + + return o; +} + +static char * +func_lastword (char *o, char **argv, const char *funcname UNUSED) +{ + unsigned int i; + const char *words = argv[0]; /* Use a temp variable for find_next_token */ + const char *p = NULL; + const char *t; + + while ((t = find_next_token (&words, &i))) + p = t; + + if (p != 0) + o = variable_buffer_output (o, p, i); + + return o; +} + +static char * +func_words (char *o, char **argv, const char *funcname UNUSED) +{ + int i = 0; + const char *word_iterator = argv[0]; + char buf[20]; + + while (find_next_token (&word_iterator, (unsigned int *) 0) != 0) + ++i; + + sprintf (buf, "%d", i); + o = variable_buffer_output (o, buf, strlen (buf)); + + return o; +} + +/* Set begpp to point to the first non-whitespace character of the string, + * and endpp to point to the last non-whitespace character of the string. + * If the string is empty or contains nothing but whitespace, endpp will be + * begpp-1. + */ +char * +strip_whitespace (const char **begpp, const char **endpp) +{ + while (*begpp <= *endpp && isspace ((unsigned char)**begpp)) + (*begpp) ++; + while (*endpp >= *begpp && isspace ((unsigned char)**endpp)) + (*endpp) --; + return (char *)*begpp; +} + +static void +check_numeric (const char *s, const char *msg) +{ + const char *end = s + strlen (s) - 1; + const char *beg = s; + strip_whitespace (&s, &end); + + for (; s <= end; ++s) + if (!ISDIGIT (*s)) /* ISDIGIT only evals its arg once: see make.h. */ + break; + + if (s <= end || end - beg < 0) + fatal (*expanding_var, "%s: '%s'", msg, beg); +} + + + +static char * +func_word (char *o, char **argv, const char *funcname UNUSED) +{ + const char *end_p; + const char *p; + int i; + + /* Check the first argument. */ + check_numeric (argv[0], _("non-numeric first argument to `word' function")); + i = atoi (argv[0]); + + if (i == 0) + fatal (*expanding_var, + _("first argument to `word' function must be greater than 0")); + + end_p = argv[1]; + while ((p = find_next_token (&end_p, 0)) != 0) + if (--i == 0) + break; + + if (i == 0) + o = variable_buffer_output (o, p, end_p - p); + + return o; +} + +static char * +func_wordlist (char *o, char **argv, const char *funcname UNUSED) +{ + int start, count; + + /* Check the arguments. */ + check_numeric (argv[0], + _("non-numeric first argument to `wordlist' function")); + check_numeric (argv[1], + _("non-numeric second argument to `wordlist' function")); + + start = atoi (argv[0]); + if (start < 1) + fatal (*expanding_var, + "invalid first argument to `wordlist' function: `%d'", start); + + count = atoi (argv[1]) - start + 1; + + if (count > 0) + { + const char *p; + const char *end_p = argv[2]; + + /* Find the beginning of the "start"th word. */ + while (((p = find_next_token (&end_p, 0)) != 0) && --start) + ; + + if (p) + { + /* Find the end of the "count"th word from start. */ + while (--count && (find_next_token (&end_p, 0) != 0)) + ; + + /* Return the stuff in the middle. */ + o = variable_buffer_output (o, p, end_p - p); + } + } + + return o; +} + +static char * +func_findstring (char *o, char **argv, const char *funcname UNUSED) +{ + /* Find the first occurrence of the first string in the second. */ + if (strstr (argv[1], argv[0]) != 0) + o = variable_buffer_output (o, argv[0], strlen (argv[0])); + + return o; +} + +static char * +func_foreach (char *o, char **argv, const char *funcname UNUSED) +{ + /* expand only the first two. */ + char *varname = expand_argument (argv[0], NULL); + char *list = expand_argument (argv[1], NULL); + const char *body = argv[2]; + + int doneany = 0; + const char *list_iterator = list; + const char *p; + unsigned int len; + struct variable *var; + + push_new_variable_scope (); + var = define_variable (varname, strlen (varname), "", o_automatic, 0); + + /* loop through LIST, put the value in VAR and expand BODY */ + while ((p = find_next_token (&list_iterator, &len)) != 0) + { + char *result = 0; + + free (var->value); + var->value = xstrndup (p, len); + + result = allocated_variable_expand (body); + + o = variable_buffer_output (o, result, strlen (result)); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + free (result); + } + + if (doneany) + /* Kill the last space. */ + --o; + + pop_variable_scope (); + free (varname); + free (list); + + return o; +} + +struct a_word +{ + struct a_word *next; + struct a_word *chain; + char *str; + int length; + int matched; +}; + +static unsigned long +a_word_hash_1 (const void *key) +{ + return_STRING_HASH_1 (((struct a_word const *) key)->str); +} + +static unsigned long +a_word_hash_2 (const void *key) +{ + return_STRING_HASH_2 (((struct a_word const *) key)->str); +} + +static int +a_word_hash_cmp (const void *x, const void *y) +{ + int result = ((struct a_word const *) x)->length - ((struct a_word const *) y)->length; + if (result) + return result; + return_STRING_COMPARE (((struct a_word const *) x)->str, + ((struct a_word const *) y)->str); +} + +struct a_pattern +{ + struct a_pattern *next; + char *str; + char *percent; + int length; + int save_c; +}; + +static char * +func_filter_filterout (char *o, char **argv, const char *funcname) +{ + struct a_word *wordhead; + struct a_word **wordtail; + struct a_word *wp; + struct a_pattern *pathead; + struct a_pattern **pattail; + struct a_pattern *pp; + + struct hash_table a_word_table; + int is_filter = streq (funcname, "filter"); + const char *pat_iterator = argv[0]; + const char *word_iterator = argv[1]; + int literals = 0; + int words = 0; + int hashing = 0; + char *p; + unsigned int len; + + /* Chop ARGV[0] up into patterns to match against the words. */ + + pattail = &pathead; + while ((p = find_next_token (&pat_iterator, &len)) != 0) + { + struct a_pattern *pat = alloca (sizeof (struct a_pattern)); + + *pattail = pat; + pattail = &pat->next; + + if (*pat_iterator != '\0') + ++pat_iterator; + + pat->str = p; + pat->length = len; + pat->save_c = p[len]; + p[len] = '\0'; + pat->percent = find_percent (p); + if (pat->percent == 0) + literals++; + } + *pattail = 0; + + /* Chop ARGV[1] up into words to match against the patterns. */ + + wordtail = &wordhead; + while ((p = find_next_token (&word_iterator, &len)) != 0) + { + struct a_word *word = alloca (sizeof (struct a_word)); + + *wordtail = word; + wordtail = &word->next; + + if (*word_iterator != '\0') + ++word_iterator; + + p[len] = '\0'; + word->str = p; + word->length = len; + word->matched = 0; + word->chain = 0; + words++; + } + *wordtail = 0; + + /* Only use a hash table if arg list lengths justifies the cost. */ + hashing = (literals >= 2 && (literals * words) >= 10); + if (hashing) + { + hash_init (&a_word_table, words, a_word_hash_1, a_word_hash_2, + a_word_hash_cmp); + for (wp = wordhead; wp != 0; wp = wp->next) + { + struct a_word *owp = hash_insert (&a_word_table, wp); + if (owp) + wp->chain = owp; + } + } + + if (words) + { + int doneany = 0; + + /* Run each pattern through the words, killing words. */ + for (pp = pathead; pp != 0; pp = pp->next) + { + if (pp->percent) + for (wp = wordhead; wp != 0; wp = wp->next) + wp->matched |= pattern_matches (pp->str, pp->percent, wp->str); + else if (hashing) + { + struct a_word a_word_key; + a_word_key.str = pp->str; + a_word_key.length = pp->length; + wp = hash_find_item (&a_word_table, &a_word_key); + while (wp) + { + wp->matched |= 1; + wp = wp->chain; + } + } + else + for (wp = wordhead; wp != 0; wp = wp->next) + wp->matched |= (wp->length == pp->length + && strneq (pp->str, wp->str, wp->length)); + } + + /* Output the words that matched (or didn't, for filter-out). */ + for (wp = wordhead; wp != 0; wp = wp->next) + if (is_filter ? wp->matched : !wp->matched) + { + o = variable_buffer_output (o, wp->str, strlen (wp->str)); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + + if (doneany) + /* Kill the last space. */ + --o; + } + + for (pp = pathead; pp != 0; pp = pp->next) + pp->str[pp->length] = pp->save_c; + + if (hashing) + hash_free (&a_word_table, 0); + + return o; +} + + +static char * +func_strip (char *o, char **argv, const char *funcname UNUSED) +{ + const char *p = argv[0]; + int doneany = 0; + + while (*p != '\0') + { + int i=0; + const char *word_start; + + while (isspace ((unsigned char)*p)) + ++p; + word_start = p; + for (i=0; *p != '\0' && !isspace ((unsigned char)*p); ++p, ++i) + {} + if (!i) + break; + o = variable_buffer_output (o, word_start, i); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + + if (doneany) + /* Kill the last space. */ + --o; + + return o; +} + +/* + Print a warning or fatal message. +*/ +static char * +func_error (char *o, char **argv, const char *funcname) +{ + char **argvp; + char *msg, *p; + int len; + + /* The arguments will be broken on commas. Rather than create yet + another special case where function arguments aren't broken up, + just create a format string that puts them back together. */ + for (len=0, argvp=argv; *argvp != 0; ++argvp) + len += strlen (*argvp) + 2; + + p = msg = alloca (len + 1); + + for (argvp=argv; argvp[1] != 0; ++argvp) + { + strcpy (p, *argvp); + p += strlen (*argvp); + *(p++) = ','; + *(p++) = ' '; + } + strcpy (p, *argvp); + + switch (*funcname) { + case 'e': + fatal (reading_file, "%s", msg); + + case 'w': + error (reading_file, "%s", msg); + break; + + case 'i': + printf ("%s\n", msg); + fflush(stdout); + break; + + default: + fatal (*expanding_var, "Internal error: func_error: '%s'", funcname); + } + + /* The warning function expands to the empty string. */ + return o; +} + + +/* + chop argv[0] into words, and sort them. + */ +static char * +func_sort (char *o, char **argv, const char *funcname UNUSED) +{ + const char *t; + char **words; + int wordi; + char *p; + unsigned int len; + int i; + + /* Find the maximum number of words we'll have. */ + t = argv[0]; + wordi = 1; + while (*t != '\0') + { + char c = *(t++); + + if (! isspace ((unsigned char)c)) + continue; + + ++wordi; + + while (isspace ((unsigned char)*t)) + ++t; + } + + words = xmalloc (wordi * sizeof (char *)); + + /* Now assign pointers to each string in the array. */ + t = argv[0]; + wordi = 0; + while ((p = find_next_token (&t, &len)) != 0) + { + ++t; + p[len] = '\0'; + words[wordi++] = p; + } + + if (wordi) + { + /* Now sort the list of words. */ + qsort (words, wordi, sizeof (char *), alpha_compare); + + /* Now write the sorted list, uniquified. */ + for (i = 0; i < wordi; ++i) + { + len = strlen (words[i]); + if (i == wordi - 1 || strlen (words[i + 1]) != len + || strcmp (words[i], words[i + 1])) + { + o = variable_buffer_output (o, words[i], len); + o = variable_buffer_output (o, " ", 1); + } + } + + /* Kill the last space. */ + --o; + } + + free (words); + + return o; +} + +/* + $(if condition,true-part[,false-part]) + + CONDITION is false iff it evaluates to an empty string. White + space before and after condition are stripped before evaluation. + + If CONDITION is true, then TRUE-PART is evaluated, otherwise FALSE-PART is + evaluated (if it exists). Because only one of the two PARTs is evaluated, + you can use $(if ...) to create side-effects (with $(shell ...), for + example). +*/ + +static char * +func_if (char *o, char **argv, const char *funcname UNUSED) +{ + const char *begp = argv[0]; + const char *endp = begp + strlen (argv[0]) - 1; + int result = 0; + + /* Find the result of the condition: if we have a value, and it's not + empty, the condition is true. If we don't have a value, or it's the + empty string, then it's false. */ + + strip_whitespace (&begp, &endp); + + if (begp <= endp) + { + char *expansion = expand_argument (begp, endp+1); + + result = strlen (expansion); + free (expansion); + } + + /* If the result is true (1) we want to eval the first argument, and if + it's false (0) we want to eval the second. If the argument doesn't + exist we do nothing, otherwise expand it and add to the buffer. */ + + argv += 1 + !result; + + if (*argv) + { + char *expansion = expand_argument (*argv, NULL); + + o = variable_buffer_output (o, expansion, strlen (expansion)); + + free (expansion); + } + + return o; +} + +/* + $(or condition1[,condition2[,condition3[...]]]) + + A CONDITION is false iff it evaluates to an empty string. White + space before and after CONDITION are stripped before evaluation. + + CONDITION1 is evaluated. If it's true, then this is the result of + expansion. If it's false, CONDITION2 is evaluated, and so on. If none of + the conditions are true, the expansion is the empty string. + + Once a CONDITION is true no further conditions are evaluated + (short-circuiting). +*/ + +static char * +func_or (char *o, char **argv, const char *funcname UNUSED) +{ + for ( ; *argv ; ++argv) + { + const char *begp = *argv; + const char *endp = begp + strlen (*argv) - 1; + char *expansion; + int result = 0; + + /* Find the result of the condition: if it's false keep going. */ + + strip_whitespace (&begp, &endp); + + if (begp > endp) + continue; + + expansion = expand_argument (begp, endp+1); + result = strlen (expansion); + + /* If the result is false keep going. */ + if (!result) + { + free (expansion); + continue; + } + + /* It's true! Keep this result and return. */ + o = variable_buffer_output (o, expansion, result); + free (expansion); + break; + } + + return o; +} + +/* + $(and condition1[,condition2[,condition3[...]]]) + + A CONDITION is false iff it evaluates to an empty string. White + space before and after CONDITION are stripped before evaluation. + + CONDITION1 is evaluated. If it's false, then this is the result of + expansion. If it's true, CONDITION2 is evaluated, and so on. If all of + the conditions are true, the expansion is the result of the last condition. + + Once a CONDITION is false no further conditions are evaluated + (short-circuiting). +*/ + +static char * +func_and (char *o, char **argv, const char *funcname UNUSED) +{ + char *expansion; + int result; + + while (1) + { + const char *begp = *argv; + const char *endp = begp + strlen (*argv) - 1; + + /* An empty condition is always false. */ + strip_whitespace (&begp, &endp); + if (begp > endp) + return o; + + expansion = expand_argument (begp, endp+1); + result = strlen (expansion); + + /* If the result is false, stop here: we're done. */ + if (!result) + break; + + /* Otherwise the result is true. If this is the last one, keep this + result and quit. Otherwise go on to the next one! */ + + if (*(++argv)) + free (expansion); + else + { + o = variable_buffer_output (o, expansion, result); + break; + } + } + + free (expansion); + + return o; +} + +static char * +func_wildcard (char *o, char **argv, const char *funcname UNUSED) +{ +#ifdef _AMIGA + o = wildcard_expansion (argv[0], o); +#else + char *p = string_glob (argv[0]); + o = variable_buffer_output (o, p, strlen (p)); +#endif + return o; +} + +/* + $(eval ) + + Always resolves to the empty string. + + Treat the arguments as a segment of makefile, and parse them. +*/ + +static char * +func_eval (char *o, char **argv, const char *funcname UNUSED) +{ + char *buf; + unsigned int len; + + /* Eval the buffer. Pop the current variable buffer setting so that the + eval'd code can use its own without conflicting. */ + + install_variable_buffer (&buf, &len); + + eval_buffer (argv[0]); + + restore_variable_buffer (buf, len); + + return o; +} + + +static char * +func_value (char *o, char **argv, const char *funcname UNUSED) +{ + /* Look up the variable. */ + struct variable *v = lookup_variable (argv[0], strlen (argv[0])); + + /* Copy its value into the output buffer without expanding it. */ + if (v) + o = variable_buffer_output (o, v->value, strlen(v->value)); + + return o; +} + +/* + \r is replaced on UNIX as well. Is this desirable? + */ +static void +fold_newlines (char *buffer, unsigned int *length) +{ + char *dst = buffer; + char *src = buffer; + char *last_nonnl = buffer -1; + src[*length] = 0; + for (; *src != '\0'; ++src) + { + if (src[0] == '\r' && src[1] == '\n') + continue; + if (*src == '\n') + { + *dst++ = ' '; + } + else + { + last_nonnl = dst; + *dst++ = *src; + } + } + *(++last_nonnl) = '\0'; + *length = last_nonnl - buffer; +} + + + +int shell_function_pid = 0, shell_function_completed; + + +#ifdef WINDOWS32 +/*untested*/ + +#include +#include +#include "sub_proc.h" + + +void +windows32_openpipe (int *pipedes, pid_t *pid_p, char **command_argv, char **envp) +{ + SECURITY_ATTRIBUTES saAttr; + HANDLE hIn; + HANDLE hErr; + HANDLE hChildOutRd; + HANDLE hChildOutWr; + HANDLE hProcess; + + + saAttr.nLength = sizeof (SECURITY_ATTRIBUTES); + saAttr.bInheritHandle = TRUE; + saAttr.lpSecurityDescriptor = NULL; + + if (DuplicateHandle (GetCurrentProcess(), + GetStdHandle(STD_INPUT_HANDLE), + GetCurrentProcess(), + &hIn, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) { + fatal (NILF, _("windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n"), + GetLastError()); + + } + if (DuplicateHandle(GetCurrentProcess(), + GetStdHandle(STD_ERROR_HANDLE), + GetCurrentProcess(), + &hErr, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) { + fatal (NILF, _("windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n"), + GetLastError()); + } + + if (!CreatePipe(&hChildOutRd, &hChildOutWr, &saAttr, 0)) + fatal (NILF, _("CreatePipe() failed (e=%ld)\n"), GetLastError()); + + hProcess = process_init_fd(hIn, hChildOutWr, hErr); + + if (!hProcess) + fatal (NILF, _("windows32_openpipe(): process_init_fd() failed\n")); + + /* make sure that CreateProcess() has Path it needs */ + sync_Path_environment(); + /* `sync_Path_environment' may realloc `environ', so take note of + the new value. */ + envp = environ; + + if (!process_begin(hProcess, command_argv, envp, command_argv[0], NULL)) { + /* register process for wait */ + process_register(hProcess); + + /* set the pid for returning to caller */ + *pid_p = (pid_t) hProcess; + + /* set up to read data from child */ + pipedes[0] = _open_osfhandle((intptr_t) hChildOutRd, O_RDONLY); + + /* this will be closed almost right away */ + pipedes[1] = _open_osfhandle((intptr_t) hChildOutWr, O_APPEND); + } else { + /* reap/cleanup the failed process */ + process_cleanup(hProcess); + + /* close handles which were duplicated, they weren't used */ + CloseHandle(hIn); + CloseHandle(hErr); + + /* close pipe handles, they won't be used */ + CloseHandle(hChildOutRd); + CloseHandle(hChildOutWr); + + /* set status for return */ + pipedes[0] = pipedes[1] = -1; + *pid_p = (pid_t)-1; + } +} +#endif + + +#ifdef __MSDOS__ +FILE * +msdos_openpipe (int* pipedes, int *pidp, char *text) +{ + FILE *fpipe=0; + /* MSDOS can't fork, but it has `popen'. */ + struct variable *sh = lookup_variable ("SHELL", 5); + int e; + extern int dos_command_running, dos_status; + + /* Make sure not to bother processing an empty line. */ + while (isblank ((unsigned char)*text)) + ++text; + if (*text == '\0') + return 0; + + if (sh) + { + char buf[PATH_MAX + 7]; + /* This makes sure $SHELL value is used by $(shell), even + though the target environment is not passed to it. */ + sprintf (buf, "SHELL=%s", sh->value); + putenv (buf); + } + + e = errno; + errno = 0; + dos_command_running = 1; + dos_status = 0; + /* If dos_status becomes non-zero, it means the child process + was interrupted by a signal, like SIGINT or SIGQUIT. See + fatal_error_signal in commands.c. */ + fpipe = popen (text, "rt"); + dos_command_running = 0; + if (!fpipe || dos_status) + { + pipedes[0] = -1; + *pidp = -1; + if (dos_status) + errno = EINTR; + else if (errno == 0) + errno = ENOMEM; + shell_function_completed = -1; + } + else + { + pipedes[0] = fileno (fpipe); + *pidp = 42; /* Yes, the Meaning of Life, the Universe, and Everything! */ + errno = e; + shell_function_completed = 1; + } + return fpipe; +} +#endif + +/* + Do shell spawning, with the naughty bits for different OSes. + */ + +#ifdef VMS + +/* VMS can't do $(shell ...) */ +#define func_shell 0 + +#else +#ifndef _AMIGA +static char * +func_shell (char *o, char **argv, const char *funcname UNUSED) +{ + char *batch_filename = NULL; + +#ifdef __MSDOS__ + FILE *fpipe; +#endif + char **command_argv; + const char *error_prefix; + char **envp; + int pipedes[2]; + pid_t pid; + +#ifndef __MSDOS__ + /* Construct the argument list. */ + command_argv = construct_command_argv (argv[0], NULL, NULL, 0, + &batch_filename); + if (command_argv == 0) + return o; +#endif + + /* Using a target environment for `shell' loses in cases like: + export var = $(shell echo foobie) + because target_environment hits a loop trying to expand $(var) + to put it in the environment. This is even more confusing when + var was not explicitly exported, but just appeared in the + calling environment. + + See Savannah bug #10593. + + envp = target_environment (NILF); + */ + + envp = environ; + + /* For error messages. */ + if (reading_file && reading_file->filenm) + { + char *p = alloca (strlen (reading_file->filenm)+11+4); + sprintf (p, "%s:%lu: ", reading_file->filenm, reading_file->lineno); + error_prefix = p; + } + else + error_prefix = ""; + +#if defined(__MSDOS__) + fpipe = msdos_openpipe (pipedes, &pid, argv[0]); + if (pipedes[0] < 0) + { + perror_with_name (error_prefix, "pipe"); + return o; + } +#elif defined(WINDOWS32) + windows32_openpipe (pipedes, &pid, command_argv, envp); + if (pipedes[0] < 0) + { + /* open of the pipe failed, mark as failed execution */ + shell_function_completed = -1; + + return o; + } + else +#else + if (pipe (pipedes) < 0) + { + perror_with_name (error_prefix, "pipe"); + return o; + } + +# ifdef __EMX__ + /* close some handles that are unnecessary for the child process */ + CLOSE_ON_EXEC(pipedes[1]); + CLOSE_ON_EXEC(pipedes[0]); + /* Never use fork()/exec() here! Use spawn() instead in exec_command() */ + pid = child_execute_job (0, pipedes[1], command_argv, envp); + if (pid < 0) + perror_with_name (error_prefix, "spawn"); +# else /* ! __EMX__ */ + pid = vfork (); + if (pid < 0) + perror_with_name (error_prefix, "fork"); + else if (pid == 0) + child_execute_job (0, pipedes[1], command_argv, envp); + else +# endif +#endif + { + /* We are the parent. */ + char *buffer; + unsigned int maxlen, i; + int cc; + + /* Record the PID for reap_children. */ + shell_function_pid = pid; +#ifndef __MSDOS__ + shell_function_completed = 0; + + /* Free the storage only the child needed. */ + free (command_argv[0]); + free (command_argv); + + /* Close the write side of the pipe. We test for -1, since + pipedes[1] is -1 on MS-Windows, and some versions of MS + libraries barf when `close' is called with -1. */ + if (pipedes[1] >= 0) + close (pipedes[1]); +#endif + + /* Set up and read from the pipe. */ + + maxlen = 200; + buffer = xmalloc (maxlen + 1); + + /* Read from the pipe until it gets EOF. */ + for (i = 0; ; i += cc) + { + if (i == maxlen) + { + maxlen += 512; + buffer = xrealloc (buffer, maxlen + 1); + } + + EINTRLOOP (cc, read (pipedes[0], &buffer[i], maxlen - i)); + if (cc <= 0) + break; + } + buffer[i] = '\0'; + + /* Close the read side of the pipe. */ +#ifdef __MSDOS__ + if (fpipe) + (void) pclose (fpipe); +#else + (void) close (pipedes[0]); +#endif + + /* Loop until child_handler or reap_children() sets + shell_function_completed to the status of our child shell. */ + while (shell_function_completed == 0) + reap_children (1, 0); + + if (batch_filename) { + DB (DB_VERBOSE, (_("Cleaning up temporary batch file %s\n"), + batch_filename)); + remove (batch_filename); + free (batch_filename); + } + shell_function_pid = 0; + + /* The child_handler function will set shell_function_completed + to 1 when the child dies normally, or to -1 if it + dies with status 127, which is most likely an exec fail. */ + + if (shell_function_completed == -1) + { + /* This likely means that the execvp failed, so we should just + write the error message in the pipe from the child. */ + fputs (buffer, stderr); + fflush (stderr); + } + else + { + /* The child finished normally. Replace all newlines in its output + with spaces, and put that in the variable output buffer. */ + fold_newlines (buffer, &i); + o = variable_buffer_output (o, buffer, i); + } + + free (buffer); + } + + return o; +} + +#else /* _AMIGA */ + +/* Do the Amiga version of func_shell. */ + +static char * +func_shell (char *o, char **argv, const char *funcname) +{ + /* Amiga can't fork nor spawn, but I can start a program with + redirection of my choice. However, this means that we + don't have an opportunity to reopen stdout to trap it. Thus, + we save our own stdout onto a new descriptor and dup a temp + file's descriptor onto our stdout temporarily. After we + spawn the shell program, we dup our own stdout back to the + stdout descriptor. The buffer reading is the same as above, + except that we're now reading from a file. */ + +#include +#include + + BPTR child_stdout; + char tmp_output[FILENAME_MAX]; + unsigned int maxlen = 200, i; + int cc; + char * buffer, * ptr; + char ** aptr; + int len = 0; + char* batch_filename = NULL; + + /* Construct the argument list. */ + command_argv = construct_command_argv (argv[0], NULL, NULL, 0, + &batch_filename); + if (command_argv == 0) + return o; + + /* Note the mktemp() is a security hole, but this only runs on Amiga. + Ideally we would use main.c:open_tmpfile(), but this uses a special + Open(), not fopen(), and I'm not familiar enough with the code to mess + with it. */ + strcpy (tmp_output, "t:MakeshXXXXXXXX"); + mktemp (tmp_output); + child_stdout = Open (tmp_output, MODE_NEWFILE); + + for (aptr=command_argv; *aptr; aptr++) + len += strlen (*aptr) + 1; + + buffer = xmalloc (len + 1); + ptr = buffer; + + for (aptr=command_argv; *aptr; aptr++) + { + strcpy (ptr, *aptr); + ptr += strlen (ptr) + 1; + *ptr ++ = ' '; + *ptr = 0; + } + + ptr[-1] = '\n'; + + Execute (buffer, NULL, child_stdout); + free (buffer); + + Close (child_stdout); + + child_stdout = Open (tmp_output, MODE_OLDFILE); + + buffer = xmalloc (maxlen); + i = 0; + do + { + if (i == maxlen) + { + maxlen += 512; + buffer = xrealloc (buffer, maxlen + 1); + } + + cc = Read (child_stdout, &buffer[i], maxlen - i); + if (cc > 0) + i += cc; + } while (cc > 0); + + Close (child_stdout); + + fold_newlines (buffer, &i); + o = variable_buffer_output (o, buffer, i); + free (buffer); + return o; +} +#endif /* _AMIGA */ +#endif /* !VMS */ + +#ifdef EXPERIMENTAL + +/* + equality. Return is string-boolean, ie, the empty string is false. + */ +static char * +func_eq (char *o, char **argv, char *funcname) +{ + int result = ! strcmp (argv[0], argv[1]); + o = variable_buffer_output (o, result ? "1" : "", result); + return o; +} + + +/* + string-boolean not operator. + */ +static char * +func_not (char *o, char **argv, char *funcname) +{ + const char *s = argv[0]; + int result = 0; + while (isspace ((unsigned char)*s)) + s++; + result = ! (*s); + o = variable_buffer_output (o, result ? "1" : "", result); + return o; +} +#endif + + +#ifdef HAVE_DOS_PATHS +#define IS_ABSOLUTE(n) (n[0] && n[1] == ':') +#define ROOT_LEN 3 +#else +#define IS_ABSOLUTE(n) (n[0] == '/') +#define ROOT_LEN 1 +#endif + +/* Return the absolute name of file NAME which does not contain any `.', + `..' components nor any repeated path separators ('/'). */ + +static char * +abspath (const char *name, char *apath) +{ + char *dest; + const char *start, *end, *apath_limit; + unsigned long root_len = ROOT_LEN; + + if (name[0] == '\0' || apath == NULL) + return NULL; + + apath_limit = apath + GET_PATH_MAX; + + if (!IS_ABSOLUTE(name)) + { + /* It is unlikely we would make it until here but just to make sure. */ + if (!starting_directory) + return NULL; + + strcpy (apath, starting_directory); + +#ifdef HAVE_DOS_PATHS + if (IS_PATHSEP(name[0])) + { + if (IS_PATHSEP(name[1])) + { + /* A UNC. Don't prepend a drive letter. */ + apath[0] = name[0]; + apath[1] = name[1]; + root_len = 2; + } + /* We have /foo, an absolute file name except for the drive + letter. Assume the missing drive letter is the current + drive, which we can get if we remove from starting_directory + everything past the root directory. */ + apath[root_len] = '\0'; + } +#endif + + dest = strchr (apath, '\0'); + } + else + { + strncpy (apath, name, root_len); + apath[root_len] = '\0'; + dest = apath + root_len; + /* Get past the root, since we already copied it. */ + name += root_len; +#ifdef HAVE_DOS_PATHS + if (!IS_PATHSEP(apath[2])) + { + /* Convert d:foo into d:./foo and increase root_len. */ + apath[2] = '.'; + apath[3] = '/'; + dest++; + root_len++; + /* strncpy above copied one character too many. */ + name--; + } + else + apath[2] = '/'; /* make sure it's a forward slash */ +#endif + } + + for (start = end = name; *start != '\0'; start = end) + { + unsigned long len; + + /* Skip sequence of multiple path-separators. */ + while (IS_PATHSEP(*start)) + ++start; + + /* Find end of path component. */ + for (end = start; *end != '\0' && !IS_PATHSEP(*end); ++end) + ; + + len = end - start; + + if (len == 0) + break; + else if (len == 1 && start[0] == '.') + /* nothing */; + else if (len == 2 && start[0] == '.' && start[1] == '.') + { + /* Back up to previous component, ignore if at root already. */ + if (dest > apath + root_len) + for (--dest; !IS_PATHSEP(dest[-1]); --dest); + } + else + { + if (!IS_PATHSEP(dest[-1])) + *dest++ = '/'; + + if (dest + len >= apath_limit) + return NULL; + + dest = memcpy (dest, start, len); + dest += len; + *dest = '\0'; + } + } + + /* Unless it is root strip trailing separator. */ + if (dest > apath + root_len && IS_PATHSEP(dest[-1])) + --dest; + + *dest = '\0'; + + return apath; +} + + +static char * +func_realpath (char *o, char **argv, const char *funcname UNUSED) +{ + /* Expand the argument. */ + const char *p = argv[0]; + const char *path = 0; + int doneany = 0; + unsigned int len = 0; +#ifndef HAVE_REALPATH + struct stat st; +#endif + PATH_VAR (in); + PATH_VAR (out); + + while ((path = find_next_token (&p, &len)) != 0) + { + if (len < GET_PATH_MAX) + { + strncpy (in, path, len); + in[len] = '\0'; + + if ( +#ifdef HAVE_REALPATH + realpath (in, out) +#else + abspath (in, out) && stat (out, &st) == 0 +#endif + ) + { + o = variable_buffer_output (o, out, strlen (out)); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + } + } + + /* Kill last space. */ + if (doneany) + --o; + + return o; +} + +static char * +func_abspath (char *o, char **argv, const char *funcname UNUSED) +{ + /* Expand the argument. */ + const char *p = argv[0]; + const char *path = 0; + int doneany = 0; + unsigned int len = 0; + PATH_VAR (in); + PATH_VAR (out); + + while ((path = find_next_token (&p, &len)) != 0) + { + if (len < GET_PATH_MAX) + { + strncpy (in, path, len); + in[len] = '\0'; + + if (abspath (in, out)) + { + o = variable_buffer_output (o, out, strlen (out)); + o = variable_buffer_output (o, " ", 1); + doneany = 1; + } + } + } + + /* Kill last space. */ + if (doneany) + --o; + + return o; +} + +/* Lookup table for builtin functions. + + This doesn't have to be sorted; we use a straight lookup. We might gain + some efficiency by moving most often used functions to the start of the + table. + + If MAXIMUM_ARGS is 0, that means there is no maximum and all + comma-separated values are treated as arguments. + + EXPAND_ARGS means that all arguments should be expanded before invocation. + Functions that do namespace tricks (foreach) don't automatically expand. */ + +static char *func_call (char *o, char **argv, const char *funcname); + + +static struct function_table_entry function_table_init[] = +{ + /* Name/size */ /* MIN MAX EXP? Function */ + { STRING_SIZE_TUPLE("abspath"), 0, 1, 1, func_abspath}, + { STRING_SIZE_TUPLE("addprefix"), 2, 2, 1, func_addsuffix_addprefix}, + { STRING_SIZE_TUPLE("addsuffix"), 2, 2, 1, func_addsuffix_addprefix}, + { STRING_SIZE_TUPLE("basename"), 0, 1, 1, func_basename_dir}, + { STRING_SIZE_TUPLE("dir"), 0, 1, 1, func_basename_dir}, + { STRING_SIZE_TUPLE("notdir"), 0, 1, 1, func_notdir_suffix}, + { STRING_SIZE_TUPLE("subst"), 3, 3, 1, func_subst}, + { STRING_SIZE_TUPLE("suffix"), 0, 1, 1, func_notdir_suffix}, + { STRING_SIZE_TUPLE("filter"), 2, 2, 1, func_filter_filterout}, + { STRING_SIZE_TUPLE("filter-out"), 2, 2, 1, func_filter_filterout}, + { STRING_SIZE_TUPLE("findstring"), 2, 2, 1, func_findstring}, + { STRING_SIZE_TUPLE("firstword"), 0, 1, 1, func_firstword}, + { STRING_SIZE_TUPLE("flavor"), 0, 1, 1, func_flavor}, + { STRING_SIZE_TUPLE("join"), 2, 2, 1, func_join}, + { STRING_SIZE_TUPLE("lastword"), 0, 1, 1, func_lastword}, + { STRING_SIZE_TUPLE("patsubst"), 3, 3, 1, func_patsubst}, + { STRING_SIZE_TUPLE("realpath"), 0, 1, 1, func_realpath}, + { STRING_SIZE_TUPLE("shell"), 0, 1, 1, func_shell}, + { STRING_SIZE_TUPLE("sort"), 0, 1, 1, func_sort}, + { STRING_SIZE_TUPLE("strip"), 0, 1, 1, func_strip}, + { STRING_SIZE_TUPLE("wildcard"), 0, 1, 1, func_wildcard}, + { STRING_SIZE_TUPLE("word"), 2, 2, 1, func_word}, + { STRING_SIZE_TUPLE("wordlist"), 3, 3, 1, func_wordlist}, + { STRING_SIZE_TUPLE("words"), 0, 1, 1, func_words}, + { STRING_SIZE_TUPLE("origin"), 0, 1, 1, func_origin}, + { STRING_SIZE_TUPLE("foreach"), 3, 3, 0, func_foreach}, + { STRING_SIZE_TUPLE("call"), 1, 0, 1, func_call}, + { STRING_SIZE_TUPLE("info"), 0, 1, 1, func_error}, + { STRING_SIZE_TUPLE("error"), 0, 1, 1, func_error}, + { STRING_SIZE_TUPLE("warning"), 0, 1, 1, func_error}, + { STRING_SIZE_TUPLE("if"), 2, 3, 0, func_if}, + { STRING_SIZE_TUPLE("or"), 1, 0, 0, func_or}, + { STRING_SIZE_TUPLE("and"), 1, 0, 0, func_and}, + { STRING_SIZE_TUPLE("value"), 0, 1, 1, func_value}, + { STRING_SIZE_TUPLE("eval"), 0, 1, 1, func_eval}, +#ifdef EXPERIMENTAL + { STRING_SIZE_TUPLE("eq"), 2, 2, 1, func_eq}, + { STRING_SIZE_TUPLE("not"), 0, 1, 1, func_not}, +#endif +}; + +#define FUNCTION_TABLE_ENTRIES (sizeof (function_table_init) / sizeof (struct function_table_entry)) + + +/* These must come after the definition of function_table. */ + +static char * +expand_builtin_function (char *o, int argc, char **argv, + const struct function_table_entry *entry_p) +{ + if (argc < (int)entry_p->minimum_args) + fatal (*expanding_var, + _("insufficient number of arguments (%d) to function `%s'"), + argc, entry_p->name); + + /* I suppose technically some function could do something with no + arguments, but so far none do, so just test it for all functions here + rather than in each one. We can change it later if necessary. */ + + if (!argc) + return o; + + if (!entry_p->func_ptr) + fatal (*expanding_var, + _("unimplemented on this platform: function `%s'"), entry_p->name); + + return entry_p->func_ptr (o, argv, entry_p->name); +} + +/* Check for a function invocation in *STRINGP. *STRINGP points at the + opening ( or { and is not null-terminated. If a function invocation + is found, expand it into the buffer at *OP, updating *OP, incrementing + *STRINGP past the reference and returning nonzero. If not, return zero. */ + +int +handle_function (char **op, const char **stringp) +{ + const struct function_table_entry *entry_p; + char openparen = (*stringp)[0]; + char closeparen = openparen == '(' ? ')' : '}'; + const char *beg; + const char *end; + int count = 0; + char *abeg = NULL; + char **argv, **argvp; + int nargs; + + beg = *stringp + 1; + + entry_p = lookup_function (beg); + + if (!entry_p) + return 0; + + /* We found a builtin function. Find the beginning of its arguments (skip + whitespace after the name). */ + + beg = next_token (beg + entry_p->len); + + /* Find the end of the function invocation, counting nested use of + whichever kind of parens we use. Since we're looking, count commas + to get a rough estimate of how many arguments we might have. The + count might be high, but it'll never be low. */ + + for (nargs=1, end=beg; *end != '\0'; ++end) + if (*end == ',') + ++nargs; + else if (*end == openparen) + ++count; + else if (*end == closeparen && --count < 0) + break; + + if (count >= 0) + fatal (*expanding_var, + _("unterminated call to function `%s': missing `%c'"), + entry_p->name, closeparen); + + *stringp = end; + + /* Get some memory to store the arg pointers. */ + argvp = argv = alloca (sizeof (char *) * (nargs + 2)); + + /* Chop the string into arguments, then a nul. As soon as we hit + MAXIMUM_ARGS (if it's >0) assume the rest of the string is part of the + last argument. + + If we're expanding, store pointers to the expansion of each one. If + not, make a duplicate of the string and point into that, nul-terminating + each argument. */ + + if (entry_p->expand_args) + { + const char *p; + for (p=beg, nargs=0; p <= end; ++argvp) + { + const char *next; + + ++nargs; + + if (nargs == entry_p->maximum_args + || (! (next = find_next_argument (openparen, closeparen, p, end)))) + next = end; + + *argvp = expand_argument (p, next); + p = next + 1; + } + } + else + { + int len = end - beg; + char *p, *aend; + + abeg = xmalloc (len+1); + memcpy (abeg, beg, len); + abeg[len] = '\0'; + aend = abeg + len; + + for (p=abeg, nargs=0; p <= aend; ++argvp) + { + char *next; + + ++nargs; + + if (nargs == entry_p->maximum_args + || (! (next = find_next_argument (openparen, closeparen, p, aend)))) + next = aend; + + *argvp = p; + *next = '\0'; + p = next + 1; + } + } + *argvp = NULL; + + /* Finally! Run the function... */ + *op = expand_builtin_function (*op, nargs, argv, entry_p); + + /* Free memory. */ + if (entry_p->expand_args) + for (argvp=argv; *argvp != 0; ++argvp) + free (*argvp); + if (abeg) + free (abeg); + + return 1; +} + + +/* User-defined functions. Expand the first argument as either a builtin + function or a make variable, in the context of the rest of the arguments + assigned to $1, $2, ... $N. $0 is the name of the function. */ + +static char * +func_call (char *o, char **argv, const char *funcname UNUSED) +{ + static int max_args = 0; + char *fname; + char *cp; + char *body; + int flen; + int i; + int saved_args; + const struct function_table_entry *entry_p; + struct variable *v; + + /* There is no way to define a variable with a space in the name, so strip + leading and trailing whitespace as a favor to the user. */ + fname = argv[0]; + while (*fname != '\0' && isspace ((unsigned char)*fname)) + ++fname; + + cp = fname + strlen (fname) - 1; + while (cp > fname && isspace ((unsigned char)*cp)) + --cp; + cp[1] = '\0'; + + /* Calling nothing is a no-op */ + if (*fname == '\0') + return o; + + /* Are we invoking a builtin function? */ + + entry_p = lookup_function (fname); + if (entry_p) + { + /* How many arguments do we have? */ + for (i=0; argv[i+1]; ++i) + ; + return expand_builtin_function (o, i, argv+1, entry_p); + } + + /* Not a builtin, so the first argument is the name of a variable to be + expanded and interpreted as a function. Find it. */ + flen = strlen (fname); + + v = lookup_variable (fname, flen); + + if (v == 0) + warn_undefined (fname, flen); + + if (v == 0 || *v->value == '\0') + return o; + + body = alloca (flen + 4); + body[0] = '$'; + body[1] = '('; + memcpy (body + 2, fname, flen); + body[flen+2] = ')'; + body[flen+3] = '\0'; + + /* Set up arguments $(1) .. $(N). $(0) is the function name. */ + + push_new_variable_scope (); + + for (i=0; *argv; ++i, ++argv) + { + char num[11]; + + sprintf (num, "%d", i); + define_variable (num, strlen (num), *argv, o_automatic, 0); + } + + /* If the number of arguments we have is < max_args, it means we're inside + a recursive invocation of $(call ...). Fill in the remaining arguments + in the new scope with the empty value, to hide them from this + invocation. */ + + for (; i < max_args; ++i) + { + char num[11]; + + sprintf (num, "%d", i); + define_variable (num, strlen (num), "", o_automatic, 0); + } + + /* Expand the body in the context of the arguments, adding the result to + the variable buffer. */ + + v->exp_count = EXP_COUNT_MAX; + + saved_args = max_args; + max_args = i; + o = variable_expand_string (o, body, flen+3); + max_args = saved_args; + + v->exp_count = 0; + + pop_variable_scope (); + + return o + strlen (o); +} + +void +hash_init_function_table (void) +{ + hash_init (&function_table, FUNCTION_TABLE_ENTRIES * 2, + function_table_entry_hash_1, function_table_entry_hash_2, + function_table_entry_hash_cmp); + hash_load (&function_table, function_table_init, + FUNCTION_TABLE_ENTRIES, sizeof (struct function_table_entry)); +} diff --git a/getloadavg.c b/getloadavg.c new file mode 100644 index 0000000..f9d7964 --- /dev/null +++ b/getloadavg.c @@ -0,0 +1,1028 @@ +/* Get the system load averages. +Copyright (C) 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, +1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, +2008, 2009, 2010 Free Software Foundation, Inc. + +GNU Make 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. + +GNU Make 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 . */ + +/* Compile-time symbols that this file uses: + + HAVE_PSTAT_GETDYNAMIC Define this if your system has the + pstat_getdynamic function. I think it + is unique to HPUX9. The best way to get the + definition is through the AC_FUNC_GETLOADAVG + macro that comes with autoconf 2.13 or newer. + If that isn't an option, then just put + AC_CHECK_FUNCS(pstat_getdynamic) in your + configure.in file. + FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist. + KERNEL_FILE Pathname of the kernel to nlist. + LDAV_CVT() Scale the load average from the kernel. + Returns a double. + LDAV_SYMBOL Name of kernel symbol giving load average. + LOAD_AVE_TYPE Type of the load average array in the kernel. + Must be defined unless one of + apollo, DGUX, NeXT, or UMAX is defined; + or we have libkstat; + otherwise, no load average is available. + NLIST_STRUCT Include nlist.h, not a.out.h, and + the nlist n_name element is a pointer, + not an array. + HAVE_STRUCT_NLIST_N_UN_N_NAME struct nlist has an n_un member, not n_name. + LINUX_LDAV_FILE [__linux__]: File containing load averages. + + Specific system predefines this file uses, aside from setting + default values if not emacs: + + apollo + BSD Real BSD, not just BSD-like. + convex + DGUX + eunice UNIX emulator under VMS. + hpux + __MSDOS__ No-op for MSDOS. + NeXT + sgi + sequent Sequent Dynix 3.x.x (BSD) + _SEQUENT_ Sequent DYNIX/ptx 1.x.x (SYSV) + sony_news NEWS-OS (works at least for 4.1C) + UMAX + UMAX4_3 + VMS + WINDOWS32 No-op for Windows95/NT. + __linux__ Linux: assumes /proc filesystem mounted. + Support from Michael K. Johnson. + __NetBSD__ NetBSD: assumes /kern filesystem mounted. + + In addition, to avoid nesting many #ifdefs, we internally set + LDAV_DONE to indicate that the load average has been computed. + + We also #define LDAV_PRIVILEGED if a program will require + special installation to be able to call getloadavg. */ + +/* This should always be first. */ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +/* Both the Emacs and non-Emacs sections want this. Some + configuration files' definitions for the LOAD_AVE_CVT macro (like + sparc.h's) use macros like FSCALE, defined here. */ +#if defined (unix) || defined (__unix) +# include +#endif + + +/* Exclude all the code except the test program at the end + if the system has its own `getloadavg' function. + + The declaration of `errno' is needed by the test program + as well as the function itself, so it comes first. */ + +#include + +#ifndef errno +extern int errno; +#endif + +#if HAVE_LOCALE_H +# include +#endif +#if !HAVE_SETLOCALE +# define setlocale(Category, Locale) /* empty */ +#endif + +#ifndef HAVE_GETLOADAVG + + +/* The existing Emacs configuration files define a macro called + LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and + returns the load average multiplied by 100. What we actually want + is a macro called LDAV_CVT, which returns the load average as an + unmultiplied double. + + For backwards compatibility, we'll define LDAV_CVT in terms of + LOAD_AVE_CVT, but future machine config files should just define + LDAV_CVT directly. */ + +# if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT) +# define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0) +# endif + +# if !defined (BSD) && defined (ultrix) +/* Ultrix behaves like BSD on Vaxen. */ +# define BSD +# endif + +# ifdef NeXT +/* NeXT in the 2.{0,1,2} releases defines BSD in , which + conflicts with the definition understood in this file, that this + really is BSD. */ +# undef BSD + +/* NeXT defines FSCALE in . However, we take FSCALE being + defined to mean that the nlist method should be used, which is not true. */ +# undef FSCALE +# endif + +/* Same issues as for NeXT apply to the HURD-based GNU system. */ +# ifdef __GNU__ +# undef BSD +# undef FSCALE +# endif /* __GNU__ */ + +/* Set values that are different from the defaults, which are + set a little farther down with #ifndef. */ + + +/* Some shorthands. */ + +# if defined (HPUX) && !defined (hpux) +# define hpux +# endif + +# if defined (__hpux) && !defined (hpux) +# define hpux +# endif + +# if defined (__sun) && !defined (sun) +# define sun +# endif + +# if defined(hp300) && !defined(hpux) +# define MORE_BSD +# endif + +# if defined(ultrix) && defined(mips) +# define decstation +# endif + +# if defined (__SVR4) && !defined (SVR4) +# define SVR4 +# endif + +# if (defined(sun) && defined(SVR4)) || defined (SOLARIS2) +# define SUNOS_5 +# endif + +# if defined (__osf__) && (defined (__alpha) || defined (__alpha__)) +# define OSF_ALPHA +# include +# include +# include +# include +# endif + +# if defined (__osf__) && (defined (mips) || defined (__mips__)) +# define OSF_MIPS +# include +# endif + +/* UTek's /bin/cc on the 4300 has no architecture specific cpp define by + default, but _MACH_IND_SYS_TYPES is defined in . Combine + that with a couple of other things and we'll have a unique match. */ +# if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES) +# define tek4300 /* Define by emacs, but not by other users. */ +# endif + +/* AC_FUNC_GETLOADAVG thinks QNX is SVR4, but it isn't. */ +# if defined(__QNX__) +# undef SVR4 +# endif + +/* VAX C can't handle multi-line #ifs, or lines longer than 256 chars. */ +# ifndef LOAD_AVE_TYPE + +# ifdef MORE_BSD +# define LOAD_AVE_TYPE long +# endif + +# ifdef sun +# define LOAD_AVE_TYPE long +# endif + +# ifdef decstation +# define LOAD_AVE_TYPE long +# endif + +# ifdef _SEQUENT_ +# define LOAD_AVE_TYPE long +# endif + +# ifdef sgi +# define LOAD_AVE_TYPE long +# endif + +# ifdef SVR4 +# define LOAD_AVE_TYPE long +# endif + +# ifdef sony_news +# define LOAD_AVE_TYPE long +# endif + +# ifdef sequent +# define LOAD_AVE_TYPE long +# endif + +# ifdef OSF_ALPHA +# define LOAD_AVE_TYPE long +# endif + +# if defined (ardent) && defined (titan) +# define LOAD_AVE_TYPE long +# endif + +# ifdef tek4300 +# define LOAD_AVE_TYPE long +# endif + +# if defined(alliant) && defined(i860) /* Alliant FX/2800 */ +# define LOAD_AVE_TYPE long +# endif + +# ifdef _AIX +# define LOAD_AVE_TYPE long +# endif + +# ifdef convex +# define LOAD_AVE_TYPE double +# ifndef LDAV_CVT +# define LDAV_CVT(n) (n) +# endif +# endif + +# endif /* No LOAD_AVE_TYPE. */ + +# ifdef OSF_ALPHA +/* defines an incorrect value for FSCALE on Alpha OSF/1, + according to ghazi@noc.rutgers.edu. */ +# undef FSCALE +# define FSCALE 1024.0 +# endif + +# if defined(alliant) && defined(i860) /* Alliant FX/2800 */ +/* defines an incorrect value for FSCALE on an + Alliant FX/2800 Concentrix 2.2, according to ghazi@noc.rutgers.edu. */ +# undef FSCALE +# define FSCALE 100.0 +# endif + + +# ifndef FSCALE + +/* SunOS and some others define FSCALE in sys/param.h. */ + +# ifdef MORE_BSD +# define FSCALE 2048.0 +# endif + +# if defined(MIPS) || defined(SVR4) || defined(decstation) +# define FSCALE 256 +# endif + +# if defined (sgi) || defined (sequent) +/* Sometimes both MIPS and sgi are defined, so FSCALE was just defined + above under #ifdef MIPS. But we want the sgi value. */ +# undef FSCALE +# define FSCALE 1000.0 +# endif + +# if defined (ardent) && defined (titan) +# define FSCALE 65536.0 +# endif + +# ifdef tek4300 +# define FSCALE 100.0 +# endif + +# ifdef _AIX +# define FSCALE 65536.0 +# endif + +# endif /* Not FSCALE. */ + +# if !defined (LDAV_CVT) && defined (FSCALE) +# define LDAV_CVT(n) (((double) (n)) / FSCALE) +# endif + + +# if defined(sgi) || (defined(mips) && !defined(BSD)) +# define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31)) +# endif + + +# if !defined (KERNEL_FILE) && defined (sequent) +# define KERNEL_FILE "/dynix" +# endif + +# if !defined (KERNEL_FILE) && defined (hpux) +# define KERNEL_FILE "/hp-ux" +# endif + +# if !defined(KERNEL_FILE) && (defined(_SEQUENT_) || defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || (defined (ardent) && defined (titan))) +# define KERNEL_FILE "/unix" +# endif + + +# if !defined (LDAV_SYMBOL) && defined (alliant) +# define LDAV_SYMBOL "_Loadavg" +# endif + +# if !defined(LDAV_SYMBOL) && ((defined(hpux) && !defined(hp9000s300)) || defined(_SEQUENT_) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX)) +# define LDAV_SYMBOL "avenrun" +# endif + +# ifdef HAVE_UNISTD_H +# include +# endif + +# include + +/* LOAD_AVE_TYPE should only get defined if we're going to use the + nlist method. */ +# if !defined(LOAD_AVE_TYPE) && (defined(BSD) || defined(LDAV_CVT) || defined(KERNEL_FILE) || defined(LDAV_SYMBOL)) && !defined(__riscos__) +# define LOAD_AVE_TYPE double +# endif + +# ifdef LOAD_AVE_TYPE + +# ifndef VMS +# ifndef __linux__ +# ifdef HAVE_NLIST_H +# include +# else +# include +# endif + +# ifdef SUNOS_5 +# include +# include +# include +# endif + +# if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) +# include +# endif + +# ifndef KERNEL_FILE +# define KERNEL_FILE "/vmunix" +# endif /* KERNEL_FILE */ + +# ifndef LDAV_SYMBOL +# define LDAV_SYMBOL "_avenrun" +# endif /* LDAV_SYMBOL */ +# endif /* __linux__ */ + +# else /* VMS */ + +# ifndef eunice +# include +# include +# else /* eunice */ +# include +# endif /* eunice */ +# endif /* VMS */ + +# ifndef LDAV_CVT +# define LDAV_CVT(n) ((double) (n)) +# endif /* !LDAV_CVT */ + +# endif /* LOAD_AVE_TYPE */ + +# if defined(__GNU__) && !defined (NeXT) +/* Note that NeXT Openstep defines __GNU__ even though it should not. */ +/* GNU system acts much like NeXT, for load average purposes, + but not exactly. */ +# define NeXT +# define host_self mach_host_self +# endif + +# ifdef NeXT +# ifdef HAVE_MACH_MACH_H +# include +# else +# include +# endif +# endif /* NeXT */ + +# ifdef sgi +# include +# endif /* sgi */ + +# ifdef UMAX +# include +# include +# include +# include +# include + +# ifdef UMAX_43 +# include +# include +# include +# include +# include +# else /* Not UMAX_43. */ +# include +# include +# include +# include +# include +# include +# endif /* Not UMAX_43. */ +# endif /* UMAX */ + +# ifdef DGUX +# include +# endif + +# if defined(HAVE_FCNTL_H) || defined(_POSIX_VERSION) +# include +# else +# include +# endif + + +/* Avoid static vars inside a function since in HPUX they dump as pure. */ + +# ifdef NeXT +static processor_set_t default_set; +static int getloadavg_initialized; +# endif /* NeXT */ + +# ifdef UMAX +static unsigned int cpus = 0; +static unsigned int samples; +# endif /* UMAX */ + +# ifdef DGUX +static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */ +# endif /* DGUX */ + +#if !defined(HAVE_LIBKSTAT) && defined(LOAD_AVE_TYPE) +/* File descriptor open to /dev/kmem or VMS load ave driver. */ +static int channel; +/* Nonzero iff channel is valid. */ +static int getloadavg_initialized; +/* Offset in kmem to seek to read load average, or 0 means invalid. */ +static long offset; + +#if !defined(VMS) && !defined(sgi) && !defined(__linux__) +static struct nlist nl[2]; +#endif /* Not VMS or sgi */ + +#ifdef SUNOS_5 +static kvm_t *kd; +#endif /* SUNOS_5 */ + +#endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT */ + +/* Put the 1 minute, 5 minute and 15 minute load averages + into the first NELEM elements of LOADAVG. + Return the number written (never more than 3, but may be less than NELEM), + or -1 if an error occurred. */ + +int +getloadavg (double loadavg[], int nelem) +{ + int elem = 0; /* Return value. */ + +# ifdef NO_GET_LOAD_AVG +# define LDAV_DONE + /* Set errno to zero to indicate that there was no particular error; + this function just can't work at all on this system. */ + errno = 0; + elem = -1; +# endif + +# if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT) +/* Use libkstat because we don't have to be root. */ +# define LDAV_DONE + kstat_ctl_t *kc; + kstat_t *ksp; + kstat_named_t *kn; + + kc = kstat_open (); + if (kc == 0) + return -1; + ksp = kstat_lookup (kc, "unix", 0, "system_misc"); + if (ksp == 0 ) + return -1; + if (kstat_read (kc, ksp, 0) == -1) + return -1; + + + kn = kstat_data_lookup (ksp, "avenrun_1min"); + if (kn == 0) + { + /* Return -1 if no load average information is available. */ + nelem = 0; + elem = -1; + } + + if (nelem >= 1) + loadavg[elem++] = (double) kn->value.ul/FSCALE; + + if (nelem >= 2) + { + kn = kstat_data_lookup (ksp, "avenrun_5min"); + if (kn != 0) + { + loadavg[elem++] = (double) kn->value.ul/FSCALE; + + if (nelem >= 3) + { + kn = kstat_data_lookup (ksp, "avenrun_15min"); + if (kn != 0) + loadavg[elem++] = (double) kn->value.ul/FSCALE; + } + } + } + + kstat_close (kc); +# endif /* HAVE_LIBKSTAT */ + +# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC) +/* Use pstat_getdynamic() because we don't have to be root. */ +# define LDAV_DONE +# undef LOAD_AVE_TYPE + + struct pst_dynamic dyn_info; + if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0) + return -1; + if (nelem > 0) + loadavg[elem++] = dyn_info.psd_avg_1_min; + if (nelem > 1) + loadavg[elem++] = dyn_info.psd_avg_5_min; + if (nelem > 2) + loadavg[elem++] = dyn_info.psd_avg_15_min; + +# endif /* hpux && HAVE_PSTAT_GETDYNAMIC */ + +# if !defined (LDAV_DONE) && defined (__linux__) +# define LDAV_DONE +# undef LOAD_AVE_TYPE + +# ifndef LINUX_LDAV_FILE +# define LINUX_LDAV_FILE "/proc/loadavg" +# endif + + char ldavgbuf[40]; + double load_ave[3]; + int fd, count; + + fd = open (LINUX_LDAV_FILE, O_RDONLY); + if (fd == -1) + return -1; + count = read (fd, ldavgbuf, 40); + (void) close (fd); + if (count <= 0) + return -1; + + /* The following sscanf must use the C locale. */ + setlocale (LC_NUMERIC, "C"); + count = sscanf (ldavgbuf, "%lf %lf %lf", + &load_ave[0], &load_ave[1], &load_ave[2]); + setlocale (LC_NUMERIC, ""); + if (count < 1) + return -1; + + for (elem = 0; elem < nelem && elem < count; elem++) + loadavg[elem] = load_ave[elem]; + + return elem; + +# endif /* __linux__ */ + +# if !defined (LDAV_DONE) && defined (__NetBSD__) +# define LDAV_DONE +# undef LOAD_AVE_TYPE + +# ifndef NETBSD_LDAV_FILE +# define NETBSD_LDAV_FILE "/kern/loadavg" +# endif + + unsigned long int load_ave[3], scale; + int count; + FILE *fp; + + fp = fopen (NETBSD_LDAV_FILE, "r"); + if (fp == NULL) + return -1; + count = fscanf (fp, "%lu %lu %lu %lu\n", + &load_ave[0], &load_ave[1], &load_ave[2], + &scale); + (void) fclose (fp); + if (count != 4) + return -1; + + for (elem = 0; elem < nelem; elem++) + loadavg[elem] = (double) load_ave[elem] / (double) scale; + + return elem; + +# endif /* __NetBSD__ */ + +# if !defined (LDAV_DONE) && defined (NeXT) +# define LDAV_DONE + /* The NeXT code was adapted from iscreen 3.2. */ + + host_t host; + struct processor_set_basic_info info; + unsigned info_count; + + /* We only know how to get the 1-minute average for this system, + so even if the caller asks for more than 1, we only return 1. */ + + if (!getloadavg_initialized) + { + if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS) + getloadavg_initialized = 1; + } + + if (getloadavg_initialized) + { + info_count = PROCESSOR_SET_BASIC_INFO_COUNT; + if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host, + (processor_set_info_t) &info, &info_count) + != KERN_SUCCESS) + getloadavg_initialized = 0; + else + { + if (nelem > 0) + loadavg[elem++] = (double) info.load_average / LOAD_SCALE; + } + } + + if (!getloadavg_initialized) + return -1; +# endif /* NeXT */ + +# if !defined (LDAV_DONE) && defined (UMAX) +# define LDAV_DONE +/* UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not + have a /dev/kmem. Information about the workings of the running kernel + can be gathered with inq_stats system calls. + We only know how to get the 1-minute average for this system. */ + + struct proc_summary proc_sum_data; + struct stat_descr proc_info; + double load; + register unsigned int i, j; + + if (cpus == 0) + { + register unsigned int c, i; + struct cpu_config conf; + struct stat_descr desc; + + desc.sd_next = 0; + desc.sd_subsys = SUBSYS_CPU; + desc.sd_type = CPUTYPE_CONFIG; + desc.sd_addr = (char *) &conf; + desc.sd_size = sizeof conf; + + if (inq_stats (1, &desc)) + return -1; + + c = 0; + for (i = 0; i < conf.config_maxclass; ++i) + { + struct class_stats stats; + memset (&stats, '\0', sizeof stats); + + desc.sd_type = CPUTYPE_CLASS; + desc.sd_objid = i; + desc.sd_addr = (char *) &stats; + desc.sd_size = sizeof stats; + + if (inq_stats (1, &desc)) + return -1; + + c += stats.class_numcpus; + } + cpus = c; + samples = cpus < 2 ? 3 : (2 * cpus / 3); + } + + proc_info.sd_next = 0; + proc_info.sd_subsys = SUBSYS_PROC; + proc_info.sd_type = PROCTYPE_SUMMARY; + proc_info.sd_addr = (char *) &proc_sum_data; + proc_info.sd_size = sizeof (struct proc_summary); + proc_info.sd_sizeused = 0; + + if (inq_stats (1, &proc_info) != 0) + return -1; + + load = proc_sum_data.ps_nrunnable; + j = 0; + for (i = samples - 1; i > 0; --i) + { + load += proc_sum_data.ps_nrun[j]; + if (j++ == PS_NRUNSIZE) + j = 0; + } + + if (nelem > 0) + loadavg[elem++] = load / samples / cpus; +# endif /* UMAX */ + +# if !defined (LDAV_DONE) && defined (DGUX) +# define LDAV_DONE + /* This call can return -1 for an error, but with good args + it's not supposed to fail. The first argument is for no + apparent reason of type `long int *'. */ + dg_sys_info ((long int *) &load_info, + DG_SYS_INFO_LOAD_INFO_TYPE, + DG_SYS_INFO_LOAD_VERSION_0); + + if (nelem > 0) + loadavg[elem++] = load_info.one_minute; + if (nelem > 1) + loadavg[elem++] = load_info.five_minute; + if (nelem > 2) + loadavg[elem++] = load_info.fifteen_minute; +# endif /* DGUX */ + +# if !defined (LDAV_DONE) && defined (apollo) +# define LDAV_DONE +/* Apollo code from lisch@mentorg.com (Ray Lischner). + + This system call is not documented. The load average is obtained as + three long integers, for the load average over the past minute, + five minutes, and fifteen minutes. Each value is a scaled integer, + with 16 bits of integer part and 16 bits of fraction part. + + I'm not sure which operating system first supported this system call, + but I know that SR10.2 supports it. */ + + extern void proc1_$get_loadav (); + unsigned long load_ave[3]; + + proc1_$get_loadav (load_ave); + + if (nelem > 0) + loadavg[elem++] = load_ave[0] / 65536.0; + if (nelem > 1) + loadavg[elem++] = load_ave[1] / 65536.0; + if (nelem > 2) + loadavg[elem++] = load_ave[2] / 65536.0; +# endif /* apollo */ + +# if !defined (LDAV_DONE) && defined (OSF_MIPS) +# define LDAV_DONE + + struct tbl_loadavg load_ave; + table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave)); + loadavg[elem++] + = (load_ave.tl_lscale == 0 + ? load_ave.tl_avenrun.d[0] + : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale)); +# endif /* OSF_MIPS */ + +# if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32)) +# define LDAV_DONE + + /* A faithful emulation is going to have to be saved for a rainy day. */ + for ( ; elem < nelem; elem++) + { + loadavg[elem] = 0.0; + } +# endif /* __MSDOS__ || WINDOWS32 */ + +# if !defined (LDAV_DONE) && defined (OSF_ALPHA) +# define LDAV_DONE + + struct tbl_loadavg load_ave; + table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave)); + for (elem = 0; elem < nelem; elem++) + loadavg[elem] + = (load_ave.tl_lscale == 0 + ? load_ave.tl_avenrun.d[elem] + : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale)); +# endif /* OSF_ALPHA */ + +# if !defined (LDAV_DONE) && defined (VMS) + /* VMS specific code -- read from the Load Ave driver. */ + + LOAD_AVE_TYPE load_ave[3]; + static int getloadavg_initialized = 0; +# ifdef eunice + struct + { + int dsc$w_length; + char *dsc$a_pointer; + } descriptor; +# endif + + /* Ensure that there is a channel open to the load ave device. */ + if (!getloadavg_initialized) + { + /* Attempt to open the channel. */ +# ifdef eunice + descriptor.dsc$w_length = 18; + descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE"; +# else + $DESCRIPTOR (descriptor, "LAV0:"); +# endif + if (sys$assign (&descriptor, &channel, 0, 0) & 1) + getloadavg_initialized = 1; + } + + /* Read the load average vector. */ + if (getloadavg_initialized + && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0, + load_ave, 12, 0, 0, 0, 0) & 1)) + { + sys$dassgn (channel); + getloadavg_initialized = 0; + } + + if (!getloadavg_initialized) + return -1; +# endif /* VMS */ + +# if !defined (LDAV_DONE) && defined(LOAD_AVE_TYPE) && !defined(VMS) + + /* UNIX-specific code -- read the average from /dev/kmem. */ + +# define LDAV_PRIVILEGED /* This code requires special installation. */ + + LOAD_AVE_TYPE load_ave[3]; + + /* Get the address of LDAV_SYMBOL. */ + if (offset == 0) + { +# ifndef sgi +# ifndef NLIST_STRUCT + strcpy (nl[0].n_name, LDAV_SYMBOL); + strcpy (nl[1].n_name, ""); +# else /* NLIST_STRUCT */ +# ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME + nl[0].n_un.n_name = LDAV_SYMBOL; + nl[1].n_un.n_name = 0; +# else /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */ + nl[0].n_name = LDAV_SYMBOL; + nl[1].n_name = 0; +# endif /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */ +# endif /* NLIST_STRUCT */ + +# ifndef SUNOS_5 + if ( +# if !(defined (_AIX) && !defined (ps2)) + nlist (KERNEL_FILE, nl) +# else /* _AIX */ + knlist (nl, 1, sizeof (nl[0])) +# endif + >= 0) + /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i. */ + { +# ifdef FIXUP_KERNEL_SYMBOL_ADDR + FIXUP_KERNEL_SYMBOL_ADDR (nl); +# endif + offset = nl[0].n_value; + } +# endif /* !SUNOS_5 */ +# else /* sgi */ + int ldav_off; + + ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN); + if (ldav_off != -1) + offset = (long) ldav_off & 0x7fffffff; +# endif /* sgi */ + } + + /* Make sure we have /dev/kmem open. */ + if (!getloadavg_initialized) + { +# ifndef SUNOS_5 + channel = open ("/dev/kmem", 0); + if (channel >= 0) + { + /* Set the channel to close on exec, so it does not + litter any child's descriptor table. */ +# ifdef F_SETFD +# ifndef FD_CLOEXEC +# define FD_CLOEXEC 1 +# endif + (void) fcntl (channel, F_SETFD, FD_CLOEXEC); +# endif + getloadavg_initialized = 1; + } +# else /* SUNOS_5 */ + /* We pass 0 for the kernel, corefile, and swapfile names + to use the currently running kernel. */ + kd = kvm_open (0, 0, 0, O_RDONLY, 0); + if (kd != 0) + { + /* nlist the currently running kernel. */ + kvm_nlist (kd, nl); + offset = nl[0].n_value; + getloadavg_initialized = 1; + } +# endif /* SUNOS_5 */ + } + + /* If we can, get the load average values. */ + if (offset && getloadavg_initialized) + { + /* Try to read the load. */ +# ifndef SUNOS_5 + if (lseek (channel, offset, 0) == -1L + || read (channel, (char *) load_ave, sizeof (load_ave)) + != sizeof (load_ave)) + { + close (channel); + getloadavg_initialized = 0; + } +# else /* SUNOS_5 */ + if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave)) + != sizeof (load_ave)) + { + kvm_close (kd); + getloadavg_initialized = 0; + } +# endif /* SUNOS_5 */ + } + + if (offset == 0 || !getloadavg_initialized) + return -1; +# endif /* LOAD_AVE_TYPE and not VMS */ + +# if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS. */ + if (nelem > 0) + loadavg[elem++] = LDAV_CVT (load_ave[0]); + if (nelem > 1) + loadavg[elem++] = LDAV_CVT (load_ave[1]); + if (nelem > 2) + loadavg[elem++] = LDAV_CVT (load_ave[2]); + +# define LDAV_DONE +# endif /* !LDAV_DONE && LOAD_AVE_TYPE */ + +# ifdef LDAV_DONE + return elem; +# else + /* Set errno to zero to indicate that there was no particular error; + this function just can't work at all on this system. */ + errno = 0; + return -1; +# endif +} + +#endif /* ! HAVE_GETLOADAVG */ + +#ifdef TEST +#include "make.h" + +int +main (int argc, char **argv) +{ + int naptime = 0; + + if (argc > 1) + naptime = atoi (argv[1]); + + while (1) + { + double avg[3]; + int loads; + + errno = 0; /* Don't be misled if it doesn't set errno. */ + loads = getloadavg (avg, 3); + if (loads == -1) + { + perror ("Error getting load average"); + exit (1); + } + if (loads > 0) + printf ("1-minute: %f ", avg[0]); + if (loads > 1) + printf ("5-minute: %f ", avg[1]); + if (loads > 2) + printf ("15-minute: %f ", avg[2]); + if (loads > 0) + putchar ('\n'); + + if (naptime == 0) + break; + sleep (naptime); + } + + exit (0); +} +#endif /* TEST */ diff --git a/getopt.c b/getopt.c new file mode 100644 index 0000000..e992da5 --- /dev/null +++ b/getopt.c @@ -0,0 +1,1028 @@ +/* Getopt for GNU. +NOTE: getopt is now part of the C library, so if you don't know what +"Keep this file name-space clean" means, talk to drepper@gnu.org +before changing it! + +Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, +1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@gnu.org. + +GNU Make 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. + +GNU Make 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 . */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# endif +#endif + +/* This is for other GNU distributions with internationalized messages. + When compiling libc, the _ macro is predefined. */ +#include "gettext.h" +#define _(msgid) gettext (msgid) + + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg = NULL; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized = 0; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include +# define my_index strchr +#else + +# if HAVE_STRING_H +# include +# else +# include +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (const char *str, int chr) +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; + +static int original_argc; +static char *const *original_argv; + +/* Make sure the environment variable bash 2.0 puts in the environment + is valid for the getopt call we must make sure that the ARGV passed + to getopt is that one passed to the process. */ +static void __attribute__ ((unused)) +store_args_and_env (int argc, char *const *argv) +{ + /* XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ + original_argc = argc; + original_argv = argv; +} +# ifdef text_set_element +text_set_element (__libc_subinit, store_args_and_env); +# endif /* text_set_element */ + +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (char **argv) +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#ifdef _LIBC + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (int argc, char *const *argv, const char *optstring) +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#ifdef _LIBC + if (posixly_correct == NULL + && argc == original_argc && argv == original_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (int argc, char *const *argv, const char *optstring, + const struct option *longopts, int *longind, int long_only) +{ + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#ifdef _LIBC +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (int argc, char *const *argv, const char *optstring) +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (int argc, char **argv) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/getopt.h b/getopt.h new file mode 100644 index 0000000..dff9998 --- /dev/null +++ b/getopt.h @@ -0,0 +1,132 @@ +/* Declarations for getopt. +Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@gnu.org. + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef _GETOPT_H +#define _GETOPT_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +#if defined (__STDC__) && __STDC__ + const char *name; +#else + char *name; +#endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +#if defined (__STDC__) && __STDC__ +#ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int argc, char *const *argv, const char *shortopts); +#else /* not __GNU_LIBRARY__ */ +extern int getopt (); +#endif /* __GNU_LIBRARY__ */ +extern int getopt_long (int argc, char *const *argv, const char *shortopts, + const struct option *longopts, int *longind); +extern int getopt_long_only (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind, + int long_only); +#else /* not __STDC__ */ +extern int getopt (); +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* getopt.h */ diff --git a/getopt1.c b/getopt1.c new file mode 100644 index 0000000..429ad4a --- /dev/null +++ b/getopt1.c @@ -0,0 +1,178 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. +Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@gnu.org. + +GNU Make 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. + +GNU Make 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 . */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "getopt.h" + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (int argc, char *const *argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (int argc, char *const *argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include + +int +main (int argc, char **argv) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/gettext.h b/gettext.h new file mode 100644 index 0000000..e8b8b3a --- /dev/null +++ b/gettext.h @@ -0,0 +1,58 @@ +/* Convenience header for conditional use of GNU . +Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +#else + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff --git a/glob/COPYING.LIB b/glob/COPYING.LIB new file mode 100644 index 0000000..bbe3fe1 --- /dev/null +++ b/glob/COPYING.LIB @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/glob/ChangeLog b/glob/ChangeLog new file mode 100644 index 0000000..8f0739c --- /dev/null +++ b/glob/ChangeLog @@ -0,0 +1,185 @@ +2008-09-28 Juan Manuel Guerrero + + * glob.c (my_realloc) [__DJGPP__]: Don't define, and don't + redefine realloc to call it, since the DJGPP's realloc handles + NULL pointers correctly. + +2007-12-22 Juan Manuel Guerrero (tiny change) + + * glob.c [__GNU_LIBRARY__ && __DJGPP__]: Add a realloc + declaration that matches the one in the DJGPP libc. + +2006-02-24 Eli Zaretskii + + * glob.c (my_malloc) [WINDOWS32]: Provide a full ISO C prototype, + to avoid compiler warnings. + +2005-06-25 Paul D. Smith + + * fnmatch.h, glob.h [WINDOWS32]: Fix ifdefs in headers. + Fixes Savannah bug #13477. + +2005-03-11 Paul D. Smith + + * glob.c (glob_in_dir): Change FNM_CASEFOLD to be enabled if + HAVE_CASE_INSENSITIVE_FS is defined. + +2003-01-30 Paul D. Smith + + * glob.h: Patch for FreeBSD by Mike Barcroft + Reported by Gerald Pfeifer . On + FreeBSD, declare __size_t to simply size_t. + +2002-04-22 Paul D. Smith + + * Makefile.am: Use automake 1.6. + Use new automake condition USE_LOCAL_GLOB to decide whether or not + to build the local GNU glob library or use the system one. + +1999-09-12 Paul D. Smith + + * fnmatch.c: Last GLIBC version wouldn't compile outside of GLIBC + (undefined reference to internal_function). Update to the latest + version + +1999-09-11 Paul Eggert + + * glob.h (glob): If #defining to glob64, do this before + declaring it, so that all declarations and uses match, and + do not declare glob64, to avoid a declaration clash. + (globfree): Likewise with globfree64. + +1999-09-08 Eli Zaretskii + + * glob.c (prefix_array) [__MSDOS__,WINDOWS32]: Keep the trailing + slash unless DIRNAME is just "x:/". + +1999-09-06 Paul D. Smith + + * fnmatch.c: Update to latest version from GLIBC. + +1999-07-21 Paul D. Smith + + * glob.c, glob.h, fnmatch.c, fnmatch.h: Update to latest version + from GLIBC. + + * fnmatch.c (internal_fnmatch): Use K&R definition syntax, not ANSI. + (__strchrnul): This won't exist outside GLIBC, so create one. + + * glob.c: Move getlogin{,_r} prototypes below glob.h to get __P() + macro. + +1998-08-05 Paul D. Smith + + * configure.in: Remove; configuration for glob is handled by the + make configure.in. + +1998-07-29 Paul D. Smith + + * glob.c, fnmatch.c: New versions from the GLIBC folks (Ulrich + Drepper). Fixes a bug reported by Eli Zaretski. Integrates + DOS/Windows32 support. + +1998-07-27 Kaveh R. Ghazi + + * glob.c (glob): Cast away const on assignment of pattern to dirname. + Cast the return type of __alloca() for traditional C compilers. + +1998-07-23 Paul D. Smith + + * glob.c, fnmatch.c: New versions of these files from the GLIBC + folks (Ulrich Drepper). Had to re-integrate some DOS/Windows + code. + +1998-07-10 Paul D. Smith + + * glob.c (glob_in_dir): If no meta chars exist in PATTERN and + GLOB_NOCHECK is present, don't look for the file--whether it's + found or not, we'll always return it, so why bother searching? + + Also, if we are searching and there are no meta chars, don't + bother trying fnmatch() if the strcmp() fails. + +1998-05-30 Eli Zaretskii + + * glob.c (glob) [__MSDOS__, WINDOWS32]: Compute the directory and + filename parts of the pattern correctly when it includes a drive + spec. Disallow wildcards in the drive spec. Prevent recursion + when dirname is of the form "d:/" or "d:". + (prefix_array) [__MSDOS__, WINDOWS32]: Don't append a slash to + "d:/" and "d:". + +1998-05-13 Paul D. Smith + + * SMakefile, Makefile.ami, glob.c, glob.h, fnmatch.c: Updated from + the latest glibc version. + +1998-04-17 Paul D. Smith + + * configure.in: Create a config.h file instead of setting things + on the compile line. This is because when build.sh runs it merely + passes -DHAVE_CONFIG_H to the glob files, just as it does to the + make files. + * config.h.in: Created by autoheader. + +Tue Aug 12 10:52:34 1997 Paul D. Smith + + * configure.in: Require autoconf 2.12. + + * glob: Updates from latest GNU libc glob code. + + * glob.c,glob.h,fnmatch.h: Change all WIN32 references to WINDOWS32. + + * glob.h: OSF4 defines macros in such a way that GLOB_ALTDIRFUNC + is not defined. Added a test to the #if which defines it if + _GNU_SOURCE is defined; that's set by both glob.c and GNU make. + + * glob.c: SunOS4 w/ cc needs #include , since assert.h + requires stderr but doesn't include stdio.h :-/. + (next_brace_sub): De-protoize function definition. + (glob): Cast __alloca(); on SunOS4 it uses the default return type + of int. + (glob): Irix defines getlogin_r() to return a char*; move the + extern for that into the _LIBC area since it isn't used except in + LIBC anyway. Likewise, move extern getlogin() into the "else". + +Sat Jul 20 21:55:31 1996 Roland McGrath + + Win32 hacks from . + * posix/glob.c [WIN32]: Don't include ; don't use d_ino; + use void * for my_realloc; include for alloca. + (glob) [WIN32]: Use "c:/users/default" for ~ if no HOME variable. + * posix/fnmatch.h [WIN32]: Use prototypes even if [!__STDC__]. + * posix/glob.h: Likewise. + +Fri Jul 19 16:56:41 1996 Roland McGrath + + * posix/glob.h [!_AMIGA && !VMS]: Check this instead of just [!_AMIGA] + for `struct stat;' forward decl. + +Sat Jun 22 10:44:09 1996 Roland McGrath + + * posix/glob.c: Include only [HAVE_ALLOCA_H], not [sparc]. + +Fri Jun 21 00:27:51 1996 Roland McGrath + + * posix/fnmatch.c (fnmatch): Fix \*[*?]+ case to increment name ptr + only for ?s, not for *s. Fix from Chet Ramey. + + +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software +Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/glob/Makefile.am b/glob/Makefile.am new file mode 100644 index 0000000..93fd60a --- /dev/null +++ b/glob/Makefile.am @@ -0,0 +1,30 @@ +# -*-Makefile-*-, or close enough +# Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +AUTOMAKE_OPTIONS = foreign + +# Only build the library when the system doesn't already have GNU glob. +if USE_LOCAL_GLOB + noinst_LIBRARIES = libglob.a +endif + +libglob_a_SOURCES = glob.c glob.h fnmatch.c fnmatch.h + + +EXTRA_DIST = COPYING.LIB Makefile.ami SCOPTIONS SMakefile \ + configure.bat diff --git a/glob/Makefile.ami b/glob/Makefile.ami new file mode 100644 index 0000000..3fbf7e5 --- /dev/null +++ b/glob/Makefile.ami @@ -0,0 +1,67 @@ +# Makefile for standalone libglob.a (fnmatch, glob). -*-Makefile-*- +# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +# Ultrix 2.2 make doesn't expand the value of VPATH. +VPATH = /glob/ +# This must repeat the value, because configure will remove `VPATH = .'. +srcdir = /glob/ + +CC = sc +RM = delete +CPPFLAGS = +CFLAGS = + +# Information determined by configure. +DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \ + Define HAVE_DIRENT_H + +# How to invoke ar. +AR = join +ARFLAGS = as + +# How to invoke ranlib. +RANLIB = ; + +.PHONY: all +all: glob.lib + +glob.lib : glob.o fnmatch.o + $(AR) $(ARFLAGS) $@ glob.o fnmatch.o + $(RANLIB) $@ + +# For some reason, Unix make wants the dependencies on the source files. +# Otherwise it refuses to use an implicit rule! +# And, get this: it doesn't work to use $(srcdir)foo.c!! +glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c +fnmatch.o: $(srcdir)fnmatch.h fnmatch.c + +OUTPUT_OPTION = +.c.o: + $(CC) IDir "" \ + $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) + +.PHONY: clean realclean glob-clean glob-realclean distclean +clean glob-clean: + -$(RM) glob.lib "#?.o" core +distclean glob-realclean: clean + -$(RM) TAGS tags Makefile config.status config.h config.log +realcean: distclean + +# For inside the C library. +glob.tar glob.tar.Z: + $(MAKE) -C .. $@ diff --git a/glob/Makefile.in b/glob/Makefile.in new file mode 100644 index 0000000..44be58d --- /dev/null +++ b/glob/Makefile.in @@ -0,0 +1,480 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# -*-Makefile-*-, or close enough +# Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = glob +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in COPYING.LIB \ + ChangeLog +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/isc-posix.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libglob_a_AR = $(AR) $(ARFLAGS) +libglob_a_LIBADD = +am_libglob_a_OBJECTS = glob.$(OBJEXT) fnmatch.$(OBJEXT) +libglob_a_OBJECTS = $(am_libglob_a_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libglob_a_SOURCES) +DIST_SOURCES = $(libglob_a_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = foreign + +# Only build the library when the system doesn't already have GNU glob. +@USE_LOCAL_GLOB_TRUE@noinst_LIBRARIES = libglob.a +libglob_a_SOURCES = glob.c glob.h fnmatch.c fnmatch.h +EXTRA_DIST = COPYING.LIB Makefile.ami SCOPTIONS SMakefile \ + configure.bat + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glob/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign glob/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libglob.a: $(libglob_a_OBJECTS) $(libglob_a_DEPENDENCIES) + -rm -f libglob.a + $(libglob_a_AR) libglob.a $(libglob_a_OBJECTS) $(libglob_a_LIBADD) + $(RANLIB) libglob.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glob.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-noinstLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/glob/SCOPTIONS b/glob/SCOPTIONS new file mode 100644 index 0000000..f89daae --- /dev/null +++ b/glob/SCOPTIONS @@ -0,0 +1,13 @@ +ERRORREXX +OPTIMIZE +NOVERSION +OPTIMIZERTIME +OPTIMIZERALIAS +DEFINE INCLUDEDIR="include:" +DEFINE LIBDIR="lib:" +DEFINE NO_ALLOCA +DEFINE NO_FLOAT +DEFINE NO_ARCHIVES +IGNORE=161 +IGNORE=100 +STARTUP=cres diff --git a/glob/SMakefile b/glob/SMakefile new file mode 100644 index 0000000..0476a15 --- /dev/null +++ b/glob/SMakefile @@ -0,0 +1,67 @@ +# Makefile for standalone distribution of libglob.a (fnmatch, glob). +# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +# Ultrix 2.2 make doesn't expand the value of VPATH. +VPATH = /glob/ +# This must repeat the value, because configure will remove `VPATH = .'. +srcdir = /glob/ + +CC = sc +CPPFLAGS = +CFLAGS = +MAKE = smake +RM = delete + +# Information determined by configure. +DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \ + Define HAVE_DIRENT_H + +# How to invoke ar. +AR = join +ARFLAGS = as + +# How to invoke ranlib. +RANLIB = ; + +.PHONY: all +all: glob.lib + +glob.lib : glob.o fnmatch.o + $(AR) $(ARFLAGS) $@ glob.o fnmatch.o + $(RANLIB) $@ + +# For some reason, Unix make wants the dependencies on the source files. +# Otherwise it refuses to use an implicit rule! +# And, get this: it doesn't work to use $(srcdir)foo.c!! +glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c +fnmatch.o: $(srcdir)fnmatch.h fnmatch.c + +.c.o: + $(CC) IDir "" \ + $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) + +.PHONY: clean realclean glob-clean glob-realclean distclean +clean glob-clean: + -$(RM) -f glob.lib *.o core +distclean glob-realclean: clean + -$(RM) -f TAGS tags Makefile config.status config.h config.log +realcean: distclean + +# For inside the C library. +glob.tar glob.tar.Z: + $(MAKE) -C .. $@ diff --git a/glob/configure.bat b/glob/configure.bat new file mode 100644 index 0000000..672d733 --- /dev/null +++ b/glob/configure.bat @@ -0,0 +1,43 @@ +@echo off +rem Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, +rem 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +rem This file is part of GNU Make. +rem +rem GNU Make is free software; you can redistribute it and/or modify it under +rem the terms of the GNU General Public License as published by the Free +rem Software Foundation; either version 3 of the License, or (at your option) +rem any later version. +rem +rem GNU Make is distributed in the hope that it will be useful, but WITHOUT +rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +rem FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for. +rem more details. +rem +rem You should have received a copy of the GNU General Public License along +rem with this program. If not, see . + +echo Configuring glob for DJGPP +rem This batch file assumes a unix-type "sed" program + +echo # Makefile generated by "configure.bat"> Makefile + +if exist config.sed del config.sed + +echo "s/@srcdir@/./ ">> config.sed +echo "s/@CC@/gcc/ ">> config.sed +echo "s/@CFLAGS@/-O2 -g/ ">> config.sed +echo "s/@CPPFLAGS@/-DHAVE_CONFIG_H -I../ ">> config.sed +echo "s/@AR@/ar/ ">> config.sed +echo "s/@RANLIB@/ranlib/ ">> config.sed +echo "s/@LDFLAGS@// ">> config.sed +echo "s/@DEFS@// ">> config.sed +echo "s/@ALLOCA@// ">> config.sed +echo "s/@LIBS@// ">> config.sed +echo "s/@LIBOBJS@// ">> config.sed +echo "s/^Makefile *:/_Makefile:/ ">> config.sed +echo "s/^config.h *:/_config.h:/ ">> config.sed + +sed -e "s/^\"//" -e "s/\"$//" -e "s/[ ]*$//" config.sed > config2.sed +sed -f config2.sed Makefile.in >> Makefile +del config.sed +del config2.sed diff --git a/glob/fnmatch.c b/glob/fnmatch.c new file mode 100644 index 0000000..4da8c5f --- /dev/null +++ b/glob/fnmatch.c @@ -0,0 +1,489 @@ +/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software +Foundation, Inc. +This file is part of the GNU C Library. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public License +along with this library; see the file COPYING.LIB. If not, write to the Free +Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 +USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +/* Enable GNU extensions in fnmatch.h. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include +#include + +#if HAVE_STRING_H || defined _LIBC +# include +#else +# include +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include +#endif + +/* For platform which support the ISO C amendement 1 functionality we + support user defined character classes. */ +#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) +/* Solaris 2.5 has a bug: must be included before . */ +# include +# include +#endif + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#if defined _LIBC || !defined __GNU_LIBRARY__ + + +# if defined STDC_HEADERS || !defined isascii +# define ISASCII(c) 1 +# else +# define ISASCII(c) isascii(c) +# endif + +# ifdef isblank +# define ISBLANK(c) (ISASCII (c) && isblank (c)) +# else +# define ISBLANK(c) ((c) == ' ' || (c) == '\t') +# endif +# ifdef isgraph +# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) +# else +# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) +# endif + +# define ISPRINT(c) (ISASCII (c) && isprint (c)) +# define ISDIGIT(c) (ISASCII (c) && isdigit (c)) +# define ISALNUM(c) (ISASCII (c) && isalnum (c)) +# define ISALPHA(c) (ISASCII (c) && isalpha (c)) +# define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) +# define ISLOWER(c) (ISASCII (c) && islower (c)) +# define ISPUNCT(c) (ISASCII (c) && ispunct (c)) +# define ISSPACE(c) (ISASCII (c) && isspace (c)) +# define ISUPPER(c) (ISASCII (c) && isupper (c)) +# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) + +# define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) + +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) +/* The GNU C library provides support for user-defined character classes + and the functions from ISO C amendement 1. */ +# ifdef CHARCLASS_NAME_MAX +# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX +# else +/* This shouldn't happen but some implementation might still have this + problem. Use a reasonable default value. */ +# define CHAR_CLASS_MAX_LENGTH 256 +# endif + +# ifdef _LIBC +# define IS_CHAR_CLASS(string) __wctype (string) +# else +# define IS_CHAR_CLASS(string) wctype (string) +# endif +# else +# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ + +# define IS_CHAR_CLASS(string) \ + (STREQ (string, "alpha") || STREQ (string, "upper") \ + || STREQ (string, "lower") || STREQ (string, "digit") \ + || STREQ (string, "alnum") || STREQ (string, "xdigit") \ + || STREQ (string, "space") || STREQ (string, "print") \ + || STREQ (string, "punct") || STREQ (string, "graph") \ + || STREQ (string, "cntrl") || STREQ (string, "blank")) +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +# if !defined _LIBC && !defined getenv +extern char *getenv (); +# endif + +# ifndef errno +extern int errno; +# endif + +/* This function doesn't exist on most systems. */ + +# if !defined HAVE___STRCHRNUL && !defined _LIBC +static char * +__strchrnul (s, c) + const char *s; + int c; +{ + char *result = strchr (s, c); + if (result == NULL) + result = strchr (s, '\0'); + return result; +} +# endif + +# ifndef internal_function +/* Inside GNU libc we mark some function in a special way. In other + environments simply ignore the marking. */ +# define internal_function +# endif + +/* Match STRING against the filename pattern PATTERN, returning zero if + it matches, nonzero if not. */ +static int internal_fnmatch __P ((const char *pattern, const char *string, + int no_leading_period, int flags)) + internal_function; +static int +internal_function +internal_fnmatch (pattern, string, no_leading_period, flags) + const char *pattern; + const char *string; + int no_leading_period; + int flags; +{ + register const char *p = pattern, *n = string; + register unsigned char c; + +/* Note that this evaluates C many times. */ +# ifdef _LIBC +# define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c)) +# else +# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c)) +# endif + + while ((c = *p++) != '\0') + { + c = FOLD (c); + + switch (c) + { + case '?': + if (*n == '\0') + return FNM_NOMATCH; + else if (*n == '/' && (flags & FNM_FILE_NAME)) + return FNM_NOMATCH; + else if (*n == '.' && no_leading_period + && (n == string + || (n[-1] == '/' && (flags & FNM_FILE_NAME)))) + return FNM_NOMATCH; + break; + + case '\\': + if (!(flags & FNM_NOESCAPE)) + { + c = *p++; + if (c == '\0') + /* Trailing \ loses. */ + return FNM_NOMATCH; + c = FOLD (c); + } + if (FOLD ((unsigned char) *n) != c) + return FNM_NOMATCH; + break; + + case '*': + if (*n == '.' && no_leading_period + && (n == string + || (n[-1] == '/' && (flags & FNM_FILE_NAME)))) + return FNM_NOMATCH; + + for (c = *p++; c == '?' || c == '*'; c = *p++) + { + if (*n == '/' && (flags & FNM_FILE_NAME)) + /* A slash does not match a wildcard under FNM_FILE_NAME. */ + return FNM_NOMATCH; + else if (c == '?') + { + /* A ? needs to match one character. */ + if (*n == '\0') + /* There isn't another character; no match. */ + return FNM_NOMATCH; + else + /* One character of the string is consumed in matching + this ? wildcard, so *??? won't match if there are + less than three characters. */ + ++n; + } + } + + if (c == '\0') + /* The wildcard(s) is/are the last element of the pattern. + If the name is a file name and contains another slash + this does mean it cannot match. */ + return ((flags & FNM_FILE_NAME) && strchr (n, '/') != NULL + ? FNM_NOMATCH : 0); + else + { + const char *endp; + + endp = __strchrnul (n, (flags & FNM_FILE_NAME) ? '/' : '\0'); + + if (c == '[') + { + int flags2 = ((flags & FNM_FILE_NAME) + ? flags : (flags & ~FNM_PERIOD)); + + for (--p; n < endp; ++n) + if (internal_fnmatch (p, n, + (no_leading_period + && (n == string + || (n[-1] == '/' + && (flags + & FNM_FILE_NAME)))), + flags2) + == 0) + return 0; + } + else if (c == '/' && (flags & FNM_FILE_NAME)) + { + while (*n != '\0' && *n != '/') + ++n; + if (*n == '/' + && (internal_fnmatch (p, n + 1, flags & FNM_PERIOD, + flags) == 0)) + return 0; + } + else + { + int flags2 = ((flags & FNM_FILE_NAME) + ? flags : (flags & ~FNM_PERIOD)); + + if (c == '\\' && !(flags & FNM_NOESCAPE)) + c = *p; + c = FOLD (c); + for (--p; n < endp; ++n) + if (FOLD ((unsigned char) *n) == c + && (internal_fnmatch (p, n, + (no_leading_period + && (n == string + || (n[-1] == '/' + && (flags + & FNM_FILE_NAME)))), + flags2) == 0)) + return 0; + } + } + + /* If we come here no match is possible with the wildcard. */ + return FNM_NOMATCH; + + case '[': + { + /* Nonzero if the sense of the character class is inverted. */ + static int posixly_correct; + register int not; + char cold; + + if (posixly_correct == 0) + posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1; + + if (*n == '\0') + return FNM_NOMATCH; + + if (*n == '.' && no_leading_period && (n == string + || (n[-1] == '/' + && (flags + & FNM_FILE_NAME)))) + return FNM_NOMATCH; + + if (*n == '/' && (flags & FNM_FILE_NAME)) + /* `/' cannot be matched. */ + return FNM_NOMATCH; + + not = (*p == '!' || (posixly_correct < 0 && *p == '^')); + if (not) + ++p; + + c = *p++; + for (;;) + { + unsigned char fn = FOLD ((unsigned char) *n); + + if (!(flags & FNM_NOESCAPE) && c == '\\') + { + if (*p == '\0') + return FNM_NOMATCH; + c = FOLD ((unsigned char) *p); + ++p; + + if (c == fn) + goto matched; + } + else if (c == '[' && *p == ':') + { + /* Leave room for the null. */ + char str[CHAR_CLASS_MAX_LENGTH + 1]; + size_t c1 = 0; +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) + wctype_t wt; +# endif + const char *startp = p; + + for (;;) + { + if (c1 == CHAR_CLASS_MAX_LENGTH) + /* The name is too long and therefore the pattern + is ill-formed. */ + return FNM_NOMATCH; + + c = *++p; + if (c == ':' && p[1] == ']') + { + p += 2; + break; + } + if (c < 'a' || c >= 'z') + { + /* This cannot possibly be a character class name. + Match it as a normal range. */ + p = startp; + c = '['; + goto normal_bracket; + } + str[c1++] = c; + } + str[c1] = '\0'; + +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) + wt = IS_CHAR_CLASS (str); + if (wt == 0) + /* Invalid character class name. */ + return FNM_NOMATCH; + + if (__iswctype (__btowc ((unsigned char) *n), wt)) + goto matched; +# else + if ((STREQ (str, "alnum") && ISALNUM ((unsigned char) *n)) + || (STREQ (str, "alpha") && ISALPHA ((unsigned char) *n)) + || (STREQ (str, "blank") && ISBLANK ((unsigned char) *n)) + || (STREQ (str, "cntrl") && ISCNTRL ((unsigned char) *n)) + || (STREQ (str, "digit") && ISDIGIT ((unsigned char) *n)) + || (STREQ (str, "graph") && ISGRAPH ((unsigned char) *n)) + || (STREQ (str, "lower") && ISLOWER ((unsigned char) *n)) + || (STREQ (str, "print") && ISPRINT ((unsigned char) *n)) + || (STREQ (str, "punct") && ISPUNCT ((unsigned char) *n)) + || (STREQ (str, "space") && ISSPACE ((unsigned char) *n)) + || (STREQ (str, "upper") && ISUPPER ((unsigned char) *n)) + || (STREQ (str, "xdigit") && ISXDIGIT ((unsigned char) *n))) + goto matched; +# endif + } + else if (c == '\0') + /* [ (unterminated) loses. */ + return FNM_NOMATCH; + else + { + normal_bracket: + if (FOLD (c) == fn) + goto matched; + + cold = c; + c = *p++; + + if (c == '-' && *p != ']') + { + /* It is a range. */ + unsigned char cend = *p++; + if (!(flags & FNM_NOESCAPE) && cend == '\\') + cend = *p++; + if (cend == '\0') + return FNM_NOMATCH; + + if (cold <= fn && fn <= FOLD (cend)) + goto matched; + + c = *p++; + } + } + + if (c == ']') + break; + } + + if (!not) + return FNM_NOMATCH; + break; + + matched: + /* Skip the rest of the [...] that already matched. */ + while (c != ']') + { + if (c == '\0') + /* [... (unterminated) loses. */ + return FNM_NOMATCH; + + c = *p++; + if (!(flags & FNM_NOESCAPE) && c == '\\') + { + if (*p == '\0') + return FNM_NOMATCH; + /* XXX 1003.2d11 is unclear if this is right. */ + ++p; + } + else if (c == '[' && *p == ':') + { + do + if (*++p == '\0') + return FNM_NOMATCH; + while (*p != ':' || p[1] == ']'); + p += 2; + c = *p; + } + } + if (not) + return FNM_NOMATCH; + } + break; + + default: + if (c != FOLD ((unsigned char) *n)) + return FNM_NOMATCH; + } + + ++n; + } + + if (*n == '\0') + return 0; + + if ((flags & FNM_LEADING_DIR) && *n == '/') + /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ + return 0; + + return FNM_NOMATCH; + +# undef FOLD +} + + +int +fnmatch (pattern, string, flags) + const char *pattern; + const char *string; + int flags; +{ + return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags); +} + +#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/glob/fnmatch.h b/glob/fnmatch.h new file mode 100644 index 0000000..a788c8e --- /dev/null +++ b/glob/fnmatch.h @@ -0,0 +1,85 @@ +/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software +Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public License +along with this library; see the file COPYING.LIB. If not, write to the Free +Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 +USA. */ + +#ifndef _FNMATCH_H +#define _FNMATCH_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32 +# if !defined __GLIBC__ +# undef __P +# define __P(protos) protos +# endif +#else /* Not C++ or ANSI C. */ +# undef __P +# define __P(protos) () +/* We can get away without defining `const' here only because in this file + it is used only inside the prototype for `fnmatch', which is elided in + non-ANSI C where `const' is problematical. */ +#endif /* C++ or ANSI C. */ + +#ifndef const +# if (defined __STDC__ && __STDC__) || defined __cplusplus || defined WINDOWS32 +# define __const const +# else +# define __const +# endif +#endif + +/* We #undef these before defining them because some losing systems + (HP-UX A.08.07 for example) define these in . */ +#undef FNM_PATHNAME +#undef FNM_NOESCAPE +#undef FNM_PERIOD + +/* Bits set in the FLAGS argument to `fnmatch'. */ +#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ +#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ +#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ + +#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE +# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ +# define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ +# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ +#endif + +/* Value returned by `fnmatch' if STRING does not match PATTERN. */ +#define FNM_NOMATCH 1 + +/* This value is returned if the implementation does not support + `fnmatch'. Since this is not the case here it will never be + returned but the conformance test suites still require the symbol + to be defined. */ +#ifdef _XOPEN_SOURCE +# define FNM_NOSYS (-1) +#endif + +/* Match NAME against the filename pattern PATTERN, + returning zero if it matches, FNM_NOMATCH if not. */ +extern int fnmatch __P ((__const char *__pattern, __const char *__name, + int __flags)); + +#ifdef __cplusplus +} +#endif + +#endif /* fnmatch.h */ diff --git a/glob/glob.c b/glob/glob.c new file mode 100644 index 0000000..1a19205 --- /dev/null +++ b/glob/glob.c @@ -0,0 +1,1427 @@ +/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999 Free +Software Foundation, Inc. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public License +along with this library; see the file COPYING.LIB. If not, write to the Free +Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 +USA. */ + +/* AIX requires this to be the first thing in the file. */ +#if defined _AIX && !defined __GNUC__ + #pragma alloca +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Enable GNU extensions in glob.h. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include +#include +#include + +/* Outcomment the following line for production quality code. */ +/* #define NDEBUG 1 */ +#include + +#include /* Needed on stupid SunOS for assert. */ + + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GLOB_INTERFACE_VERSION 1 +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include +# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + +#if defined STDC_HEADERS || defined __GNU_LIBRARY__ +# include +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +# ifndef POSIX +# ifdef _POSIX_VERSION +# define POSIX +# endif +# endif +#endif + +#if !defined _AMIGA && !defined VMS && !defined WINDOWS32 +# include +#endif + +#if !defined __GNU_LIBRARY__ && !defined STDC_HEADERS +extern int errno; +#endif +#ifndef __set_errno +# define __set_errno(val) errno = (val) +#endif + +#ifndef NULL +# define NULL 0 +#endif + + +#if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__ +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +#else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# ifdef HAVE_SYS_NDIR_H +# include +# endif +# ifdef HAVE_SYS_DIR_H +# include +# endif +# ifdef HAVE_NDIR_H +# include +# endif +# ifdef HAVE_VMSDIR_H +# include "vmsdir.h" +# endif /* HAVE_VMSDIR_H */ +#endif + + +/* In GNU systems, defines this macro for us. */ +#ifdef _D_NAMLEN +# undef NAMLEN +# define NAMLEN(d) _D_NAMLEN(d) +#endif + +/* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available + if the `d_type' member for `struct dirent' is available. */ +#ifdef _DIRENT_HAVE_D_TYPE +# define HAVE_D_TYPE 1 +#endif + + +#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__ +/* Posix does not require that the d_ino field be present, and some + systems do not provide it. */ +# define REAL_DIR_ENTRY(dp) 1 +#else +# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) +#endif /* POSIX */ + +#if defined STDC_HEADERS || defined __GNU_LIBRARY__ +# include +# include +# define ANSI_STRING +#else /* No standard headers. */ + +extern char *getenv (); + +# ifdef HAVE_STRING_H +# include +# define ANSI_STRING +# else +# include +# endif +# ifdef HAVE_MEMORY_H +# include +# endif + +extern char *malloc (), *realloc (); +extern void free (); + +extern void qsort (); +extern void abort (), exit (); + +#endif /* Standard headers. */ + +#ifndef ANSI_STRING + +# ifndef bzero +extern void bzero (); +# endif +# ifndef bcopy +extern void bcopy (); +# endif + +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# define strrchr rindex +/* memset is only used for zero here, but let's be paranoid. */ +# define memset(s, better_be_zero, n) \ + ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0))) +#endif /* Not ANSI_STRING. */ + +#if !defined HAVE_STRCOLL && !defined _LIBC +# define strcoll strcmp +#endif + +#if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1 +# define HAVE_MEMPCPY 1 +# undef mempcpy +# define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len) +#endif + +#if !defined __GNU_LIBRARY__ && !defined __DJGPP__ +# ifdef __GNUC__ +__inline +# endif +# ifndef __SASC +# ifdef WINDOWS32 +static void * +my_realloc (void *p, unsigned int n) +# else +static char * +my_realloc (p, n) + char *p; + unsigned int n; +# endif +{ + /* These casts are the for sake of the broken Ultrix compiler, + which warns of illegal pointer combinations otherwise. */ + if (p == NULL) + return (char *) malloc (n); + return (char *) realloc (p, n); +} +# define realloc my_realloc +# endif /* __SASC */ +#endif /* __GNU_LIBRARY__ || __DJGPP__ */ + + +#if !defined __alloca && !defined __GNU_LIBRARY__ + +# ifdef __GNUC__ +# undef alloca +# define alloca(n) __builtin_alloca (n) +# else /* Not GCC. */ +# ifdef HAVE_ALLOCA_H +# include +# else /* Not HAVE_ALLOCA_H. */ +# ifndef _AIX +# ifdef WINDOWS32 +# include +# else +extern char *alloca (); +# endif /* WINDOWS32 */ +# endif /* Not _AIX. */ +# endif /* sparc or HAVE_ALLOCA_H. */ +# endif /* GCC. */ + +# define __alloca alloca + +#endif + +#ifndef __GNU_LIBRARY__ +# define __stat stat +# ifdef STAT_MACROS_BROKEN +# undef S_ISDIR +# endif +# ifndef S_ISDIR +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +# endif +#endif + +#ifdef _LIBC +# undef strdup +# define strdup(str) __strdup (str) +# define sysconf(id) __sysconf (id) +# define closedir(dir) __closedir (dir) +# define opendir(name) __opendir (name) +# define readdir(str) __readdir (str) +# define getpwnam_r(name, bufp, buf, len, res) \ + __getpwnam_r (name, bufp, buf, len, res) +# ifndef __stat +# define __stat(fname, buf) __xstat (_STAT_VER, fname, buf) +# endif +#endif + +#if !(defined STDC_HEADERS || defined __GNU_LIBRARY__) +# undef size_t +# define size_t unsigned int +#endif + +/* Some system header files erroneously define these. + We want our own definitions from to take precedence. */ +#ifndef __GNU_LIBRARY__ +# undef FNM_PATHNAME +# undef FNM_NOESCAPE +# undef FNM_PERIOD +#endif +#include + +/* Some system header files erroneously define these. + We want our own definitions from to take precedence. */ +#ifndef __GNU_LIBRARY__ +# undef GLOB_ERR +# undef GLOB_MARK +# undef GLOB_NOSORT +# undef GLOB_DOOFFS +# undef GLOB_NOCHECK +# undef GLOB_APPEND +# undef GLOB_NOESCAPE +# undef GLOB_PERIOD +#endif +#include + +#ifdef HAVE_GETLOGIN_R +extern int getlogin_r __P ((char *, size_t)); +#else +extern char *getlogin __P ((void)); +#endif + +static +#if __GNUC__ - 0 >= 2 +inline +#endif +const char *next_brace_sub __P ((const char *begin)); +static int glob_in_dir __P ((const char *pattern, const char *directory, + int flags, + int (*errfunc) (const char *, int), + glob_t *pglob)); +static int prefix_array __P ((const char *prefix, char **array, size_t n)); +static int collated_compare __P ((const __ptr_t, const __ptr_t)); + +#if !defined _LIBC || !defined NO_GLOB_PATTERN_P +int __glob_pattern_p __P ((const char *pattern, int quote)); +#endif + +/* Find the end of the sub-pattern in a brace expression. We define + this as an inline function if the compiler permits. */ +static +#if __GNUC__ - 0 >= 2 +inline +#endif +const char * +next_brace_sub (begin) + const char *begin; +{ + unsigned int depth = 0; + const char *cp = begin; + + while (1) + { + if (depth == 0) + { + if (*cp != ',' && *cp != '}' && *cp != '\0') + { + if (*cp == '{') + ++depth; + ++cp; + continue; + } + } + else + { + while (*cp != '\0' && (*cp != '}' || depth > 0)) + { + if (*cp == '}') + --depth; + ++cp; + } + if (*cp == '\0') + /* An incorrectly terminated brace expression. */ + return NULL; + + continue; + } + break; + } + + return cp; +} + +/* Do glob searching for PATTERN, placing results in PGLOB. + The bits defined above may be set in FLAGS. + If a directory cannot be opened or read and ERRFUNC is not nil, + it is called with the pathname that caused the error, and the + `errno' value from the failing call; if it returns non-zero + `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored. + If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned. + Otherwise, `glob' returns zero. */ +int +glob (pattern, flags, errfunc, pglob) + const char *pattern; + int flags; + int (*errfunc) __P ((const char *, int)); + glob_t *pglob; +{ + const char *filename; + const char *dirname; + size_t dirlen; + int status; + int oldcount; + + if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) + { + __set_errno (EINVAL); + return -1; + } + + if (flags & GLOB_BRACE) + { + const char *begin = strchr (pattern, '{'); + if (begin != NULL) + { + /* Allocate working buffer large enough for our work. Note that + we have at least an opening and closing brace. */ + int firstc; + char *alt_start; + const char *p; + const char *next; + const char *rest; + size_t rest_len; +#ifdef __GNUC__ + char onealt[strlen (pattern) - 1]; +#else + char *onealt = (char *) malloc (strlen (pattern) - 1); + if (onealt == NULL) + { + if (!(flags & GLOB_APPEND)) + globfree (pglob); + return GLOB_NOSPACE; + } +#endif + + /* We know the prefix for all sub-patterns. */ +#ifdef HAVE_MEMPCPY + alt_start = mempcpy (onealt, pattern, begin - pattern); +#else + memcpy (onealt, pattern, begin - pattern); + alt_start = &onealt[begin - pattern]; +#endif + + /* Find the first sub-pattern and at the same time find the + rest after the closing brace. */ + next = next_brace_sub (begin + 1); + if (next == NULL) + { + /* It is an illegal expression. */ +#ifndef __GNUC__ + free (onealt); +#endif + return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob); + } + + /* Now find the end of the whole brace expression. */ + rest = next; + while (*rest != '}') + { + rest = next_brace_sub (rest + 1); + if (rest == NULL) + { + /* It is an illegal expression. */ +#ifndef __GNUC__ + free (onealt); +#endif + return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob); + } + } + /* Please note that we now can be sure the brace expression + is well-formed. */ + rest_len = strlen (++rest) + 1; + + /* We have a brace expression. BEGIN points to the opening {, + NEXT points past the terminator of the first element, and END + points past the final }. We will accumulate result names from + recursive runs for each brace alternative in the buffer using + GLOB_APPEND. */ + + if (!(flags & GLOB_APPEND)) + { + /* This call is to set a new vector, so clear out the + vector so we can append to it. */ + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + } + firstc = pglob->gl_pathc; + + p = begin + 1; + while (1) + { + int result; + + /* Construct the new glob expression. */ +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len); +#else + memcpy (alt_start, p, next - p); + memcpy (&alt_start[next - p], rest, rest_len); +#endif + + result = glob (onealt, + ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC)) + | GLOB_APPEND), errfunc, pglob); + + /* If we got an error, return it. */ + if (result && result != GLOB_NOMATCH) + { +#ifndef __GNUC__ + free (onealt); +#endif + if (!(flags & GLOB_APPEND)) + globfree (pglob); + return result; + } + + if (*next == '}') + /* We saw the last entry. */ + break; + + p = next + 1; + next = next_brace_sub (p); + assert (next != NULL); + } + +#ifndef __GNUC__ + free (onealt); +#endif + + if (pglob->gl_pathc != firstc) + /* We found some entries. */ + return 0; + else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC))) + return GLOB_NOMATCH; + } + } + + /* Find the filename. */ + filename = strrchr (pattern, '/'); +#if defined __MSDOS__ || defined WINDOWS32 + /* The case of "d:pattern". Since `:' is not allowed in + file names, we can safely assume that wherever it + happens in pattern, it signals the filename part. This + is so we could some day support patterns like "[a-z]:foo". */ + if (filename == NULL) + filename = strchr (pattern, ':'); +#endif /* __MSDOS__ || WINDOWS32 */ + if (filename == NULL) + { + /* This can mean two things: a simple name or "~name". The later + case is nothing but a notation for a directory. */ + if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~') + { + dirname = pattern; + dirlen = strlen (pattern); + + /* Set FILENAME to NULL as a special flag. This is ugly but + other solutions would require much more code. We test for + this special case below. */ + filename = NULL; + } + else + { + filename = pattern; +#ifdef _AMIGA + dirname = ""; +#else + dirname = "."; +#endif + dirlen = 0; + } + } + else if (filename == pattern) + { + /* "/pattern". */ + dirname = "/"; + dirlen = 1; + ++filename; + } + else + { + char *newp; + dirlen = filename - pattern; +#if defined __MSDOS__ || defined WINDOWS32 + if (*filename == ':' + || (filename > pattern + 1 && filename[-1] == ':')) + { + char *drive_spec; + + ++dirlen; + drive_spec = (char *) __alloca (dirlen + 1); +#ifdef HAVE_MEMPCPY + *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0'; +#else + memcpy (drive_spec, pattern, dirlen); + drive_spec[dirlen] = '\0'; +#endif + /* For now, disallow wildcards in the drive spec, to + prevent infinite recursion in glob. */ + if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE))) + return GLOB_NOMATCH; + /* If this is "d:pattern", we need to copy `:' to DIRNAME + as well. If it's "d:/pattern", don't remove the slash + from "d:/", since "d:" and "d:/" are not the same.*/ + } +#endif + newp = (char *) __alloca (dirlen + 1); +#ifdef HAVE_MEMPCPY + *((char *) mempcpy (newp, pattern, dirlen)) = '\0'; +#else + memcpy (newp, pattern, dirlen); + newp[dirlen] = '\0'; +#endif + dirname = newp; + ++filename; + + if (filename[0] == '\0' +#if defined __MSDOS__ || defined WINDOWS32 + && dirname[dirlen - 1] != ':' + && (dirlen < 3 || dirname[dirlen - 2] != ':' + || dirname[dirlen - 1] != '/') +#endif + && dirlen > 1) + /* "pattern/". Expand "pattern", appending slashes. */ + { + int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob); + if (val == 0) + pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK) + | (flags & GLOB_MARK)); + return val; + } + } + + if (!(flags & GLOB_APPEND)) + { + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + } + + oldcount = pglob->gl_pathc; + +#ifndef VMS + if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~') + { + if (dirname[1] == '\0' || dirname[1] == '/') + { + /* Look up home directory. */ +#ifdef VMS +/* This isn't obvious, RTLs of DECC and VAXC know about "HOME" */ + const char *home_dir = getenv ("SYS$LOGIN"); +#else + const char *home_dir = getenv ("HOME"); +#endif +# ifdef _AMIGA + if (home_dir == NULL || home_dir[0] == '\0') + home_dir = "SYS:"; +# else +# ifdef WINDOWS32 + if (home_dir == NULL || home_dir[0] == '\0') + home_dir = "c:/users/default"; /* poor default */ +# else +# ifdef VMS +/* Again, this isn't obvious, if "HOME" isn't known "SYS$LOGIN" should be set */ + if (home_dir == NULL || home_dir[0] == '\0') + home_dir = "SYS$DISK:[]"; +# else + if (home_dir == NULL || home_dir[0] == '\0') + { + int success; + char *name; +# if defined HAVE_GETLOGIN_R || defined _LIBC + size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1; + + if (buflen == 0) + /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try + a moderate value. */ + buflen = 20; + name = (char *) __alloca (buflen); + + success = getlogin_r (name, buflen) >= 0; +# else + success = (name = getlogin ()) != NULL; +# endif + if (success) + { + struct passwd *p; +# if defined HAVE_GETPWNAM_R || defined _LIBC + size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX); + char *pwtmpbuf; + struct passwd pwbuf; + int save = errno; + + if (pwbuflen == -1) + /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. + Try a moderate value. */ + pwbuflen = 1024; + pwtmpbuf = (char *) __alloca (pwbuflen); + + while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p) + != 0) + { + if (errno != ERANGE) + { + p = NULL; + break; + } + pwbuflen *= 2; + pwtmpbuf = (char *) __alloca (pwbuflen); + __set_errno (save); + } +# else + p = getpwnam (name); +# endif + if (p != NULL) + home_dir = p->pw_dir; + } + } + if (home_dir == NULL || home_dir[0] == '\0') + { + if (flags & GLOB_TILDE_CHECK) + return GLOB_NOMATCH; + else + home_dir = "~"; /* No luck. */ + } +# endif /* VMS */ +# endif /* WINDOWS32 */ +# endif + /* Now construct the full directory. */ + if (dirname[1] == '\0') + dirname = home_dir; + else + { + char *newp; + size_t home_len = strlen (home_dir); + newp = (char *) __alloca (home_len + dirlen); +# ifdef HAVE_MEMPCPY + mempcpy (mempcpy (newp, home_dir, home_len), + &dirname[1], dirlen); +# else + memcpy (newp, home_dir, home_len); + memcpy (&newp[home_len], &dirname[1], dirlen); +# endif + dirname = newp; + } + } +# if !defined _AMIGA && !defined WINDOWS32 && !defined VMS + else + { + char *end_name = strchr (dirname, '/'); + const char *user_name; + const char *home_dir; + + if (end_name == NULL) + user_name = dirname + 1; + else + { + char *newp; + newp = (char *) __alloca (end_name - dirname); +# ifdef HAVE_MEMPCPY + *((char *) mempcpy (newp, dirname + 1, end_name - dirname)) + = '\0'; +# else + memcpy (newp, dirname + 1, end_name - dirname); + newp[end_name - dirname - 1] = '\0'; +# endif + user_name = newp; + } + + /* Look up specific user's home directory. */ + { + struct passwd *p; +# if defined HAVE_GETPWNAM_R || defined _LIBC + size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX); + char *pwtmpbuf; + struct passwd pwbuf; + int save = errno; + + if (buflen == -1) + /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a + moderate value. */ + buflen = 1024; + pwtmpbuf = (char *) __alloca (buflen); + + while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0) + { + if (errno != ERANGE) + { + p = NULL; + break; + } + buflen *= 2; + pwtmpbuf = __alloca (buflen); + __set_errno (save); + } +# else + p = getpwnam (user_name); +# endif + if (p != NULL) + home_dir = p->pw_dir; + else + home_dir = NULL; + } + /* If we found a home directory use this. */ + if (home_dir != NULL) + { + char *newp; + size_t home_len = strlen (home_dir); + size_t rest_len = end_name == NULL ? 0 : strlen (end_name); + newp = (char *) __alloca (home_len + rest_len + 1); +# ifdef HAVE_MEMPCPY + *((char *) mempcpy (mempcpy (newp, home_dir, home_len), + end_name, rest_len)) = '\0'; +# else + memcpy (newp, home_dir, home_len); + memcpy (&newp[home_len], end_name, rest_len); + newp[home_len + rest_len] = '\0'; +# endif + dirname = newp; + } + else + if (flags & GLOB_TILDE_CHECK) + /* We have to regard it as an error if we cannot find the + home directory. */ + return GLOB_NOMATCH; + } +# endif /* Not Amiga && not WINDOWS32 && not VMS. */ + } +#endif /* Not VMS. */ + + /* Now test whether we looked for "~" or "~NAME". In this case we + can give the answer now. */ + if (filename == NULL) + { + struct stat st; + + /* Return the directory if we don't check for error or if it exists. */ + if ((flags & GLOB_NOCHECK) + || (((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_stat) (dirname, &st) + : __stat (dirname, &st)) == 0 + && S_ISDIR (st.st_mode))) + { + pglob->gl_pathv + = (char **) realloc (pglob->gl_pathv, + (pglob->gl_pathc + + ((flags & GLOB_DOOFFS) ? + pglob->gl_offs : 0) + + 1 + 1) * + sizeof (char *)); + if (pglob->gl_pathv == NULL) + return GLOB_NOSPACE; + + if (flags & GLOB_DOOFFS) + while (pglob->gl_pathc < pglob->gl_offs) + pglob->gl_pathv[pglob->gl_pathc++] = NULL; + +#if defined HAVE_STRDUP || defined _LIBC + pglob->gl_pathv[pglob->gl_pathc] = strdup (dirname); +#else + { + size_t len = strlen (dirname) + 1; + char *dircopy = malloc (len); + if (dircopy != NULL) + pglob->gl_pathv[pglob->gl_pathc] = memcpy (dircopy, dirname, + len); + } +#endif + if (pglob->gl_pathv[pglob->gl_pathc] == NULL) + { + free (pglob->gl_pathv); + return GLOB_NOSPACE; + } + pglob->gl_pathv[++pglob->gl_pathc] = NULL; + pglob->gl_flags = flags; + + return 0; + } + + /* Not found. */ + return GLOB_NOMATCH; + } + + if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE))) + { + /* The directory name contains metacharacters, so we + have to glob for the directory, and then glob for + the pattern in each directory found. */ + glob_t dirs; + register int i; + + status = glob (dirname, + ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE)) + | GLOB_NOSORT | GLOB_ONLYDIR), + errfunc, &dirs); + if (status != 0) + return status; + + /* We have successfully globbed the preceding directory name. + For each name we found, call glob_in_dir on it and FILENAME, + appending the results to PGLOB. */ + for (i = 0; i < dirs.gl_pathc; ++i) + { + int old_pathc; + +#ifdef SHELL + { + /* Make globbing interruptible in the bash shell. */ + extern int interrupt_state; + + if (interrupt_state) + { + globfree (&dirs); + globfree (&files); + return GLOB_ABORTED; + } + } +#endif /* SHELL. */ + + old_pathc = pglob->gl_pathc; + status = glob_in_dir (filename, dirs.gl_pathv[i], + ((flags | GLOB_APPEND) + & ~(GLOB_NOCHECK | GLOB_ERR)), + errfunc, pglob); + if (status == GLOB_NOMATCH) + /* No matches in this directory. Try the next. */ + continue; + + if (status != 0) + { + globfree (&dirs); + globfree (pglob); + return status; + } + + /* Stick the directory on the front of each name. */ + if (prefix_array (dirs.gl_pathv[i], + &pglob->gl_pathv[old_pathc], + pglob->gl_pathc - old_pathc)) + { + globfree (&dirs); + globfree (pglob); + return GLOB_NOSPACE; + } + } + + flags |= GLOB_MAGCHAR; + + /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls. + But if we have not found any matching entry and thie GLOB_NOCHECK + flag was set we must return the list consisting of the disrectory + names followed by the filename. */ + if (pglob->gl_pathc == oldcount) + { + /* No matches. */ + if (flags & GLOB_NOCHECK) + { + size_t filename_len = strlen (filename) + 1; + char **new_pathv; + struct stat st; + + /* This is an pessimistic guess about the size. */ + pglob->gl_pathv + = (char **) realloc (pglob->gl_pathv, + (pglob->gl_pathc + + ((flags & GLOB_DOOFFS) ? + pglob->gl_offs : 0) + + dirs.gl_pathc + 1) * + sizeof (char *)); + if (pglob->gl_pathv == NULL) + { + globfree (&dirs); + return GLOB_NOSPACE; + } + + if (flags & GLOB_DOOFFS) + while (pglob->gl_pathc < pglob->gl_offs) + pglob->gl_pathv[pglob->gl_pathc++] = NULL; + + for (i = 0; i < dirs.gl_pathc; ++i) + { + const char *dir = dirs.gl_pathv[i]; + size_t dir_len = strlen (dir); + + /* First check whether this really is a directory. */ + if (((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_stat) (dir, &st) : __stat (dir, &st)) != 0 + || !S_ISDIR (st.st_mode)) + /* No directory, ignore this entry. */ + continue; + + pglob->gl_pathv[pglob->gl_pathc] = malloc (dir_len + 1 + + filename_len); + if (pglob->gl_pathv[pglob->gl_pathc] == NULL) + { + globfree (&dirs); + globfree (pglob); + return GLOB_NOSPACE; + } + +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (mempcpy (pglob->gl_pathv[pglob->gl_pathc], + dir, dir_len), + "/", 1), + filename, filename_len); +#else + memcpy (pglob->gl_pathv[pglob->gl_pathc], dir, dir_len); + pglob->gl_pathv[pglob->gl_pathc][dir_len] = '/'; + memcpy (&pglob->gl_pathv[pglob->gl_pathc][dir_len + 1], + filename, filename_len); +#endif + ++pglob->gl_pathc; + } + + pglob->gl_pathv[pglob->gl_pathc] = NULL; + pglob->gl_flags = flags; + + /* Now we know how large the gl_pathv vector must be. */ + new_pathv = (char **) realloc (pglob->gl_pathv, + ((pglob->gl_pathc + 1) + * sizeof (char *))); + if (new_pathv != NULL) + pglob->gl_pathv = new_pathv; + } + else + return GLOB_NOMATCH; + } + + globfree (&dirs); + } + else + { + status = glob_in_dir (filename, dirname, flags, errfunc, pglob); + if (status != 0) + return status; + + if (dirlen > 0) + { + /* Stick the directory on the front of each name. */ + int ignore = oldcount; + + if ((flags & GLOB_DOOFFS) && ignore < pglob->gl_offs) + ignore = pglob->gl_offs; + + if (prefix_array (dirname, + &pglob->gl_pathv[ignore], + pglob->gl_pathc - ignore)) + { + globfree (pglob); + return GLOB_NOSPACE; + } + } + } + + if (flags & GLOB_MARK) + { + /* Append slashes to directory names. */ + int i; + struct stat st; + for (i = oldcount; i < pglob->gl_pathc; ++i) + if (((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st) + : __stat (pglob->gl_pathv[i], &st)) == 0 + && S_ISDIR (st.st_mode)) + { + size_t len = strlen (pglob->gl_pathv[i]) + 2; + char *new = realloc (pglob->gl_pathv[i], len); + if (new == NULL) + { + globfree (pglob); + return GLOB_NOSPACE; + } + strcpy (&new[len - 2], "/"); + pglob->gl_pathv[i] = new; + } + } + + if (!(flags & GLOB_NOSORT)) + { + /* Sort the vector. */ + int non_sort = oldcount; + + if ((flags & GLOB_DOOFFS) && pglob->gl_offs > oldcount) + non_sort = pglob->gl_offs; + + qsort ((__ptr_t) &pglob->gl_pathv[non_sort], + pglob->gl_pathc - non_sort, + sizeof (char *), collated_compare); + } + + return 0; +} + + +/* Free storage allocated in PGLOB by a previous `glob' call. */ +void +globfree (pglob) + register glob_t *pglob; +{ + if (pglob->gl_pathv != NULL) + { + register int i; + for (i = 0; i < pglob->gl_pathc; ++i) + if (pglob->gl_pathv[i] != NULL) + free ((__ptr_t) pglob->gl_pathv[i]); + free ((__ptr_t) pglob->gl_pathv); + } +} + + +/* Do a collated comparison of A and B. */ +static int +collated_compare (a, b) + const __ptr_t a; + const __ptr_t b; +{ + const char *const s1 = *(const char *const * const) a; + const char *const s2 = *(const char *const * const) b; + + if (s1 == s2) + return 0; + if (s1 == NULL) + return 1; + if (s2 == NULL) + return -1; + return strcoll (s1, s2); +} + + +/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's + elements in place. Return nonzero if out of memory, zero if successful. + A slash is inserted between DIRNAME and each elt of ARRAY, + unless DIRNAME is just "/". Each old element of ARRAY is freed. */ +static int +prefix_array (dirname, array, n) + const char *dirname; + char **array; + size_t n; +{ + register size_t i; + size_t dirlen = strlen (dirname); +#if defined __MSDOS__ || defined WINDOWS32 + int sep_char = '/'; +# define DIRSEP_CHAR sep_char +#else +# define DIRSEP_CHAR '/' +#endif + + if (dirlen == 1 && dirname[0] == '/') + /* DIRNAME is just "/", so normal prepending would get us "//foo". + We want "/foo" instead, so don't prepend any chars from DIRNAME. */ + dirlen = 0; +#if defined __MSDOS__ || defined WINDOWS32 + else if (dirlen > 1) + { + if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':') + /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */ + --dirlen; + else if (dirname[dirlen - 1] == ':') + { + /* DIRNAME is "d:". Use `:' instead of `/'. */ + --dirlen; + sep_char = ':'; + } + } +#endif + + for (i = 0; i < n; ++i) + { + size_t eltlen = strlen (array[i]) + 1; + char *new = (char *) malloc (dirlen + 1 + eltlen); + if (new == NULL) + { + while (i > 0) + free ((__ptr_t) array[--i]); + return 1; + } + +#ifdef HAVE_MEMPCPY + { + char *endp = (char *) mempcpy (new, dirname, dirlen); + *endp++ = DIRSEP_CHAR; + mempcpy (endp, array[i], eltlen); + } +#else + memcpy (new, dirname, dirlen); + new[dirlen] = DIRSEP_CHAR; + memcpy (&new[dirlen + 1], array[i], eltlen); +#endif + free ((__ptr_t) array[i]); + array[i] = new; + } + + return 0; +} + + +/* We must not compile this function twice. */ +#if !defined _LIBC || !defined NO_GLOB_PATTERN_P +/* Return nonzero if PATTERN contains any metacharacters. + Metacharacters can be quoted with backslashes if QUOTE is nonzero. */ +int +__glob_pattern_p (pattern, quote) + const char *pattern; + int quote; +{ + register const char *p; + int open = 0; + + for (p = pattern; *p != '\0'; ++p) + switch (*p) + { + case '?': + case '*': + return 1; + + case '\\': + if (quote && p[1] != '\0') + ++p; + break; + + case '[': + open = 1; + break; + + case ']': + if (open) + return 1; + break; + } + + return 0; +} +# ifdef _LIBC +weak_alias (__glob_pattern_p, glob_pattern_p) +# endif +#endif + + +/* Like `glob', but PATTERN is a final pathname component, + and matches are searched for in DIRECTORY. + The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done. + The GLOB_APPEND flag is assumed to be set (always appends). */ +static int +glob_in_dir (pattern, directory, flags, errfunc, pglob) + const char *pattern; + const char *directory; + int flags; + int (*errfunc) __P ((const char *, int)); + glob_t *pglob; +{ + __ptr_t stream = NULL; + + struct globlink + { + struct globlink *next; + char *name; + }; + struct globlink *names = NULL; + size_t nfound; + int meta; + int save; + +#ifdef VMS + if (*directory == 0) + directory = "[]"; +#endif + meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)); + if (meta == 0) + { + if (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)) + /* We need not do any tests. The PATTERN contains no meta + characters and we must not return an error therefore the + result will always contain exactly one name. */ + flags |= GLOB_NOCHECK; + else + { + /* Since we use the normal file functions we can also use stat() + to verify the file is there. */ + struct stat st; + size_t patlen = strlen (pattern); + size_t dirlen = strlen (directory); + char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1); + +# ifdef HAVE_MEMPCPY + mempcpy (mempcpy (mempcpy (fullname, directory, dirlen), + "/", 1), + pattern, patlen + 1); +# else + memcpy (fullname, directory, dirlen); + fullname[dirlen] = '/'; + memcpy (&fullname[dirlen + 1], pattern, patlen + 1); +# endif + if (((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_stat) (fullname, &st) + : __stat (fullname, &st)) == 0) + /* We found this file to be existing. Now tell the rest + of the function to copy this name into the result. */ + flags |= GLOB_NOCHECK; + } + + nfound = 0; + } + else + { + if (pattern[0] == '\0') + { + /* This is a special case for matching directories like in + "*a/". */ + names = (struct globlink *) __alloca (sizeof (struct globlink)); + names->name = (char *) malloc (1); + if (names->name == NULL) + goto memory_error; + names->name[0] = '\0'; + names->next = NULL; + nfound = 1; + meta = 0; + } + else + { + stream = ((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_opendir) (directory) + : (__ptr_t) opendir (directory)); + if (stream == NULL) + { + if (errno != ENOTDIR + && ((errfunc != NULL && (*errfunc) (directory, errno)) + || (flags & GLOB_ERR))) + return GLOB_ABORTED; + nfound = 0; + meta = 0; + } + else + { + int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) + | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0) +#if defined HAVE_CASE_INSENSITIVE_FS + | FNM_CASEFOLD +#endif + ); + nfound = 0; + flags |= GLOB_MAGCHAR; + + while (1) + { + const char *name; + size_t len; + struct dirent *d = ((flags & GLOB_ALTDIRFUNC) + ? (*pglob->gl_readdir) (stream) + : readdir ((DIR *) stream)); + if (d == NULL) + break; + if (! REAL_DIR_ENTRY (d)) + continue; + +#ifdef HAVE_D_TYPE + /* If we shall match only directories use the information + provided by the dirent call if possible. */ + if ((flags & GLOB_ONLYDIR) + && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR) + continue; +#endif + + name = d->d_name; + + if (fnmatch (pattern, name, fnm_flags) == 0) + { + struct globlink *new = (struct globlink *) + __alloca (sizeof (struct globlink)); + len = NAMLEN (d); + new->name = (char *) malloc (len + 1); + if (new->name == NULL) + goto memory_error; +#ifdef HAVE_MEMPCPY + *((char *) mempcpy ((__ptr_t) new->name, name, len)) + = '\0'; +#else + memcpy ((__ptr_t) new->name, name, len); + new->name[len] = '\0'; +#endif + new->next = names; + names = new; + ++nfound; + } + } + } + } + } + + if (nfound == 0 && (flags & GLOB_NOCHECK)) + { + size_t len = strlen (pattern); + nfound = 1; + names = (struct globlink *) __alloca (sizeof (struct globlink)); + names->next = NULL; + names->name = (char *) malloc (len + 1); + if (names->name == NULL) + goto memory_error; +#ifdef HAVE_MEMPCPY + *((char *) mempcpy (names->name, pattern, len)) = '\0'; +#else + memcpy (names->name, pattern, len); + names->name[len] = '\0'; +#endif + } + + if (nfound != 0) + { + pglob->gl_pathv + = (char **) realloc (pglob->gl_pathv, + (pglob->gl_pathc + + ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) + + nfound + 1) * + sizeof (char *)); + if (pglob->gl_pathv == NULL) + goto memory_error; + + if (flags & GLOB_DOOFFS) + while (pglob->gl_pathc < pglob->gl_offs) + pglob->gl_pathv[pglob->gl_pathc++] = NULL; + + for (; names != NULL; names = names->next) + pglob->gl_pathv[pglob->gl_pathc++] = names->name; + pglob->gl_pathv[pglob->gl_pathc] = NULL; + + pglob->gl_flags = flags; + } + + save = errno; + if (stream != NULL) + { + if (flags & GLOB_ALTDIRFUNC) + (*pglob->gl_closedir) (stream); + else + closedir ((DIR *) stream); + } + __set_errno (save); + + return nfound == 0 ? GLOB_NOMATCH : 0; + + memory_error: + { + int save = errno; + if (flags & GLOB_ALTDIRFUNC) + (*pglob->gl_closedir) (stream); + else + closedir ((DIR *) stream); + __set_errno (save); + } + while (names != NULL) + { + if (names->name != NULL) + free ((__ptr_t) names->name); + names = names->next; + } + return GLOB_NOSPACE; +} + +#endif /* Not ELIDE_CODE. */ diff --git a/glob/glob.h b/glob/glob.h new file mode 100644 index 0000000..a613aff --- /dev/null +++ b/glob/glob.h @@ -0,0 +1,210 @@ +/* Copyright (C) 1991, 1992, 1995, 1996, 1997, 1998 Free Software Foundation, +Inc. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public License +along with this library; see the file COPYING.LIB. If not, write to the Free +Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 +USA. */ + +#ifndef _GLOB_H +#define _GLOB_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#undef __ptr_t +#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32 +# if !defined __GLIBC__ +# undef __P +# undef __PMT +# define __P(protos) protos +# define __PMT(protos) protos +# if !defined __GNUC__ || __GNUC__ < 2 +# undef __const +# define __const const +# endif +# endif +# define __ptr_t void * +#else /* Not C++ or ANSI C. */ +# undef __P +# undef __PMT +# define __P(protos) () +# define __PMT(protos) () +# undef __const +# define __const +# define __ptr_t char * +#endif /* C++ or ANSI C. */ + +/* We need `size_t' for the following definitions. */ +#ifndef __size_t +# if defined __FreeBSD__ +# define __size_t size_t +# else +# if defined __GNUC__ && __GNUC__ >= 2 +typedef __SIZE_TYPE__ __size_t; +# else +/* This is a guess. */ +/*hb + * Conflicts with DECCs aready defined type __size_t. + * Defining an own type with a name beginning with '__' is no good. + * Anyway if DECC is used and __SIZE_T is defined then __size_t is + * already defined (and I hope it's exactly the one we need here). + */ +# if !(defined __DECC && defined __SIZE_T) +typedef unsigned long int __size_t; +# endif +# endif +# endif +#else +/* The GNU CC stddef.h version defines __size_t as empty. We need a real + definition. */ +# undef __size_t +# define __size_t size_t +#endif + +/* Bits set in the FLAGS argument to `glob'. */ +#define GLOB_ERR (1 << 0)/* Return on read errors. */ +#define GLOB_MARK (1 << 1)/* Append a slash to each name. */ +#define GLOB_NOSORT (1 << 2)/* Don't sort the names. */ +#define GLOB_DOOFFS (1 << 3)/* Insert PGLOB->gl_offs NULLs. */ +#define GLOB_NOCHECK (1 << 4)/* If nothing matches, return the pattern. */ +#define GLOB_APPEND (1 << 5)/* Append to results of a previous call. */ +#define GLOB_NOESCAPE (1 << 6)/* Backslashes don't quote metacharacters. */ +#define GLOB_PERIOD (1 << 7)/* Leading `.' can be matched by metachars. */ + +#if (!defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _BSD_SOURCE \ + || defined _GNU_SOURCE) +# define GLOB_MAGCHAR (1 << 8)/* Set in gl_flags if any metachars seen. */ +# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */ +# define GLOB_BRACE (1 << 10)/* Expand "{a,b}" to "a" "b". */ +# define GLOB_NOMAGIC (1 << 11)/* If no magic chars, return the pattern. */ +# define GLOB_TILDE (1 << 12)/* Expand ~user and ~ to home directories. */ +# define GLOB_ONLYDIR (1 << 13)/* Match only directories. */ +# define GLOB_TILDE_CHECK (1 << 14)/* Like GLOB_TILDE but return an error + if the user name is not available. */ +# define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \ + GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND| \ + GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE| \ + GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR|GLOB_TILDE_CHECK) +#else +# define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \ + GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND| \ + GLOB_PERIOD) +#endif + +/* Error returns from `glob'. */ +#define GLOB_NOSPACE 1 /* Ran out of memory. */ +#define GLOB_ABORTED 2 /* Read error. */ +#define GLOB_NOMATCH 3 /* No matches found. */ +#define GLOB_NOSYS 4 /* Not implemented. */ +#ifdef _GNU_SOURCE +/* Previous versions of this file defined GLOB_ABEND instead of + GLOB_ABORTED. Provide a compatibility definition here. */ +# define GLOB_ABEND GLOB_ABORTED +#endif + +/* Structure describing a globbing run. */ +#if !defined _AMIGA && !defined VMS /* Buggy compiler. */ +struct stat; +#endif +typedef struct + { + __size_t gl_pathc; /* Count of paths matched by the pattern. */ + char **gl_pathv; /* List of matched pathnames. */ + __size_t gl_offs; /* Slots to reserve in `gl_pathv'. */ + int gl_flags; /* Set to FLAGS, maybe | GLOB_MAGCHAR. */ + + /* If the GLOB_ALTDIRFUNC flag is set, the following functions + are used instead of the normal file access functions. */ + void (*gl_closedir) __PMT ((void *)); + struct dirent *(*gl_readdir) __PMT ((void *)); + __ptr_t (*gl_opendir) __PMT ((__const char *)); + int (*gl_lstat) __PMT ((__const char *, struct stat *)); +#if defined(VMS) && defined(__DECC) && !defined(_POSIX_C_SOURCE) + int (*gl_stat) __PMT ((__const char *, struct stat *, ...)); +#else + int (*gl_stat) __PMT ((__const char *, struct stat *)); +#endif + } glob_t; + +#ifdef _LARGEFILE64_SOURCE +struct stat64; +typedef struct + { + __size_t gl_pathc; + char **gl_pathv; + __size_t gl_offs; + int gl_flags; + + /* If the GLOB_ALTDIRFUNC flag is set, the following functions + are used instead of the normal file access functions. */ + void (*gl_closedir) __PMT ((void *)); + struct dirent64 *(*gl_readdir) __PMT ((void *)); + __ptr_t (*gl_opendir) __PMT ((__const char *)); + int (*gl_lstat) __PMT ((__const char *, struct stat64 *)); + int (*gl_stat) __PMT ((__const char *, struct stat64 *)); + } glob64_t; +#endif + +#if _FILE_OFFSET_BITS == 64 && __GNUC__ < 2 +# define glob glob64 +# define globfree globfree64 +#else +# ifdef _LARGEFILE64_SOURCE +extern int glob64 __P ((__const char *__pattern, int __flags, + int (*__errfunc) (__const char *, int), + glob64_t *__pglob)); + +extern void globfree64 __P ((glob64_t *__pglob)); +# endif +#endif + +/* Do glob searching for PATTERN, placing results in PGLOB. + The bits defined above may be set in FLAGS. + If a directory cannot be opened or read and ERRFUNC is not nil, + it is called with the pathname that caused the error, and the + `errno' value from the failing call; if it returns non-zero + `glob' returns GLOB_ABEND; if it returns zero, the error is ignored. + If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned. + Otherwise, `glob' returns zero. */ +#if _FILE_OFFSET_BITS != 64 || __GNUC__ < 2 +extern int glob __P ((__const char *__pattern, int __flags, + int (*__errfunc) (__const char *, int), + glob_t *__pglob)); + +/* Free storage allocated in PGLOB by a previous `glob' call. */ +extern void globfree __P ((glob_t *__pglob)); +#else +extern int glob __P ((__const char *__pattern, int __flags, + int (*__errfunc) (__const char *, int), + glob_t *__pglob)) __asm__ ("glob64"); + +extern void globfree __P ((glob_t *__pglob)) __asm__ ("globfree64"); +#endif + + +#ifdef _GNU_SOURCE +/* Return nonzero if PATTERN contains any metacharacters. + Metacharacters can be quoted with backslashes if QUOTE is nonzero. + + This function is not part of the interface specified by POSIX.2 + but several programs want to use it. */ +extern int glob_pattern_p __P ((__const char *__pattern, int __quote)); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* glob.h */ diff --git a/hash.c b/hash.c new file mode 100644 index 0000000..b91447c --- /dev/null +++ b/hash.c @@ -0,0 +1,330 @@ +/* hash.c -- hash table maintenance +Copyright (C) 1995, 1999, 2002, 2010 Free Software Foundation, Inc. +Written by Greg McGary + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "hash.h" + +#define CALLOC(t, n) ((t *) calloc (sizeof (t), (n))) +#define MALLOC(t, n) ((t *) xmalloc (sizeof (t) * (n))) +#define REALLOC(o, t, n) ((t *) xrealloc ((o), sizeof (t) * (n))) +#define CLONE(o, t, n) ((t *) memcpy (MALLOC (t, (n)), (o), sizeof (t) * (n))) + +static void hash_rehash __P((struct hash_table* ht)); +static unsigned long round_up_2 __P((unsigned long rough)); + +/* Implement double hashing with open addressing. The table size is + always a power of two. The secondary (`increment') hash function + is forced to return an odd-value, in order to be relatively prime + to the table size. This guarantees that the increment can + potentially hit every slot in the table during collision + resolution. */ + +void *hash_deleted_item = &hash_deleted_item; + +/* Force the table size to be a power of two, possibly rounding up the + given size. */ + +void +hash_init (struct hash_table *ht, unsigned long size, + hash_func_t hash_1, hash_func_t hash_2, hash_cmp_func_t hash_cmp) +{ + ht->ht_size = round_up_2 (size); + ht->ht_empty_slots = ht->ht_size; + ht->ht_vec = (void**) CALLOC (struct token *, ht->ht_size); + if (ht->ht_vec == 0) + { + fprintf (stderr, _("can't allocate %lu bytes for hash table: memory exhausted"), + ht->ht_size * (unsigned long) sizeof (struct token *)); + exit (1); + } + + ht->ht_capacity = ht->ht_size - (ht->ht_size / 16); /* 93.75% loading factor */ + ht->ht_fill = 0; + ht->ht_collisions = 0; + ht->ht_lookups = 0; + ht->ht_rehashes = 0; + ht->ht_hash_1 = hash_1; + ht->ht_hash_2 = hash_2; + ht->ht_compare = hash_cmp; +} + +/* Load an array of items into `ht'. */ + +void +hash_load (struct hash_table *ht, void *item_table, + unsigned long cardinality, unsigned long size) +{ + char *items = (char *) item_table; + while (cardinality--) + { + hash_insert (ht, items); + items += size; + } +} + +/* Returns the address of the table slot matching `key'. If `key' is + not found, return the address of an empty slot suitable for + inserting `key'. The caller is responsible for incrementing + ht_fill on insertion. */ + +void ** +hash_find_slot (struct hash_table *ht, const void *key) +{ + void **slot; + void **deleted_slot = 0; + unsigned int hash_2 = 0; + unsigned int hash_1 = (*ht->ht_hash_1) (key); + + ht->ht_lookups++; + for (;;) + { + hash_1 &= (ht->ht_size - 1); + slot = &ht->ht_vec[hash_1]; + + if (*slot == 0) + return (deleted_slot ? deleted_slot : slot); + if (*slot == hash_deleted_item) + { + if (deleted_slot == 0) + deleted_slot = slot; + } + else + { + if (key == *slot) + return slot; + if ((*ht->ht_compare) (key, *slot) == 0) + return slot; + ht->ht_collisions++; + } + if (!hash_2) + hash_2 = (*ht->ht_hash_2) (key) | 1; + hash_1 += hash_2; + } +} + +void * +hash_find_item (struct hash_table *ht, const void *key) +{ + void **slot = hash_find_slot (ht, key); + return ((HASH_VACANT (*slot)) ? 0 : *slot); +} + +void * +hash_insert (struct hash_table *ht, const void *item) +{ + void **slot = hash_find_slot (ht, item); + const void *old_item = *slot; + hash_insert_at (ht, item, slot); + return (void *)((HASH_VACANT (old_item)) ? 0 : old_item); +} + +void * +hash_insert_at (struct hash_table *ht, const void *item, const void *slot) +{ + const void *old_item = *(void **) slot; + if (HASH_VACANT (old_item)) + { + ht->ht_fill++; + if (old_item == 0) + ht->ht_empty_slots--; + old_item = item; + } + *(void const **) slot = item; + if (ht->ht_empty_slots < ht->ht_size - ht->ht_capacity) + { + hash_rehash (ht); + return (void *) hash_find_slot (ht, item); + } + else + return (void *) slot; +} + +void * +hash_delete (struct hash_table *ht, const void *item) +{ + void **slot = hash_find_slot (ht, item); + return hash_delete_at (ht, slot); +} + +void * +hash_delete_at (struct hash_table *ht, const void *slot) +{ + void *item = *(void **) slot; + if (!HASH_VACANT (item)) + { + *(void const **) slot = hash_deleted_item; + ht->ht_fill--; + return item; + } + else + return 0; +} + +void +hash_free_items (struct hash_table *ht) +{ + void **vec = ht->ht_vec; + void **end = &vec[ht->ht_size]; + for (; vec < end; vec++) + { + void *item = *vec; + if (!HASH_VACANT (item)) + free (item); + *vec = 0; + } + ht->ht_fill = 0; + ht->ht_empty_slots = ht->ht_size; +} + +void +hash_delete_items (struct hash_table *ht) +{ + void **vec = ht->ht_vec; + void **end = &vec[ht->ht_size]; + for (; vec < end; vec++) + *vec = 0; + ht->ht_fill = 0; + ht->ht_collisions = 0; + ht->ht_lookups = 0; + ht->ht_rehashes = 0; + ht->ht_empty_slots = ht->ht_size; +} + +void +hash_free (struct hash_table *ht, int free_items) +{ + if (free_items) + hash_free_items (ht); + else + { + ht->ht_fill = 0; + ht->ht_empty_slots = ht->ht_size; + } + free (ht->ht_vec); + ht->ht_vec = 0; + ht->ht_capacity = 0; +} + +void +hash_map (struct hash_table *ht, hash_map_func_t map) +{ + void **slot; + void **end = &ht->ht_vec[ht->ht_size]; + + for (slot = ht->ht_vec; slot < end; slot++) + { + if (!HASH_VACANT (*slot)) + (*map) (*slot); + } +} + +void +hash_map_arg (struct hash_table *ht, hash_map_arg_func_t map, void *arg) +{ + void **slot; + void **end = &ht->ht_vec[ht->ht_size]; + + for (slot = ht->ht_vec; slot < end; slot++) + { + if (!HASH_VACANT (*slot)) + (*map) (*slot, arg); + } +} + +/* Double the size of the hash table in the event of overflow... */ + +static void +hash_rehash (struct hash_table *ht) +{ + unsigned long old_ht_size = ht->ht_size; + void **old_vec = ht->ht_vec; + void **ovp; + + if (ht->ht_fill >= ht->ht_capacity) + { + ht->ht_size *= 2; + ht->ht_capacity = ht->ht_size - (ht->ht_size >> 4); + } + ht->ht_rehashes++; + ht->ht_vec = (void **) CALLOC (struct token *, ht->ht_size); + + for (ovp = old_vec; ovp < &old_vec[old_ht_size]; ovp++) + { + if (! HASH_VACANT (*ovp)) + { + void **slot = hash_find_slot (ht, *ovp); + *slot = *ovp; + } + } + ht->ht_empty_slots = ht->ht_size - ht->ht_fill; + free (old_vec); +} + +void +hash_print_stats (struct hash_table *ht, FILE *out_FILE) +{ + /* GKM FIXME: honor NO_FLOAT */ + fprintf (out_FILE, _("Load=%ld/%ld=%.0f%%, "), ht->ht_fill, ht->ht_size, + 100.0 * (double) ht->ht_fill / (double) ht->ht_size); + fprintf (out_FILE, _("Rehash=%d, "), ht->ht_rehashes); + fprintf (out_FILE, _("Collisions=%ld/%ld=%.0f%%"), ht->ht_collisions, ht->ht_lookups, + (ht->ht_lookups + ? (100.0 * (double) ht->ht_collisions / (double) ht->ht_lookups) + : 0)); +} + +/* Dump all items into a NULL-terminated vector. Use the + user-supplied vector, or malloc one. */ + +void ** +hash_dump (struct hash_table *ht, void **vector_0, qsort_cmp_t compare) +{ + void **vector; + void **slot; + void **end = &ht->ht_vec[ht->ht_size]; + + if (vector_0 == 0) + vector_0 = MALLOC (void *, ht->ht_fill + 1); + vector = vector_0; + + for (slot = ht->ht_vec; slot < end; slot++) + if (!HASH_VACANT (*slot)) + *vector++ = *slot; + *vector = 0; + + if (compare) + qsort (vector_0, ht->ht_fill, sizeof (void *), compare); + return vector_0; +} + +/* Round a given number up to the nearest power of 2. */ + +static unsigned long +round_up_2 (unsigned long n) +{ + n |= (n >> 1); + n |= (n >> 2); + n |= (n >> 4); + n |= (n >> 8); + n |= (n >> 16); + +#if !defined(HAVE_LIMITS_H) || ULONG_MAX > 4294967295 + /* We only need this on systems where unsigned long is >32 bits. */ + n |= (n >> 32); +#endif + + return n + 1; +} diff --git a/hash.h b/hash.h new file mode 100644 index 0000000..2c78e63 --- /dev/null +++ b/hash.h @@ -0,0 +1,234 @@ +/* hash.h -- decls for hash table +Copyright (C) 1995, 1999, 2002, 2010 Free Software Foundation, Inc. +Written by Greg McGary + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef _hash_h_ +#define _hash_h_ + +#include +#include + +#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32 +# if !defined __GLIBC__ || !defined __P +# undef __P +# define __P(protos) protos +# endif +#else /* Not C++ or ANSI C. */ +# undef __P +# define __P(protos) () +/* We can get away without defining `const' here only because in this file + it is used only inside the prototype for `fnmatch', which is elided in + non-ANSI C where `const' is problematical. */ +#endif /* C++ or ANSI C. */ + +typedef unsigned long (*hash_func_t) __P((void const *key)); +typedef int (*hash_cmp_func_t) __P((void const *x, void const *y)); +typedef void (*hash_map_func_t) __P((void const *item)); +typedef void (*hash_map_arg_func_t) __P((void const *item, void *arg)); + +struct hash_table +{ + void **ht_vec; + unsigned long ht_size; /* total number of slots (power of 2) */ + unsigned long ht_capacity; /* usable slots, limited by loading-factor */ + unsigned long ht_fill; /* items in table */ + unsigned long ht_empty_slots; /* empty slots not including deleted slots */ + unsigned long ht_collisions; /* # of failed calls to comparison function */ + unsigned long ht_lookups; /* # of queries */ + unsigned int ht_rehashes; /* # of times we've expanded table */ + hash_func_t ht_hash_1; /* primary hash function */ + hash_func_t ht_hash_2; /* secondary hash function */ + hash_cmp_func_t ht_compare; /* comparison function */ +}; + +typedef int (*qsort_cmp_t) __P((void const *, void const *)); + +void hash_init __P((struct hash_table *ht, unsigned long size, + hash_func_t hash_1, hash_func_t hash_2, hash_cmp_func_t hash_cmp)); +void hash_load __P((struct hash_table *ht, void *item_table, + unsigned long cardinality, unsigned long size)); +void **hash_find_slot __P((struct hash_table *ht, void const *key)); +void *hash_find_item __P((struct hash_table *ht, void const *key)); +void *hash_insert __P((struct hash_table *ht, const void *item)); +void *hash_insert_at __P((struct hash_table *ht, const void *item, void const *slot)); +void *hash_delete __P((struct hash_table *ht, void const *item)); +void *hash_delete_at __P((struct hash_table *ht, void const *slot)); +void hash_delete_items __P((struct hash_table *ht)); +void hash_free_items __P((struct hash_table *ht)); +void hash_free __P((struct hash_table *ht, int free_items)); +void hash_map __P((struct hash_table *ht, hash_map_func_t map)); +void hash_map_arg __P((struct hash_table *ht, hash_map_arg_func_t map, void *arg)); +void hash_print_stats __P((struct hash_table *ht, FILE *out_FILE)); +void **hash_dump __P((struct hash_table *ht, void **vector_0, qsort_cmp_t compare)); + +extern void *hash_deleted_item; +#define HASH_VACANT(item) ((item) == 0 || (void *) (item) == hash_deleted_item) + + +/* hash and comparison macros for case-sensitive string keys. */ + +/* Due to the strcache, it's not uncommon for the string pointers to + be identical. Take advantage of that to short-circuit string compares. */ + +#define STRING_HASH_1(KEY, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + while (*++_key_) \ + (RESULT) += (*_key_ << (_key_[1] & 0xf)); \ +} while (0) +#define return_STRING_HASH_1(KEY) do { \ + unsigned long _result_ = 0; \ + STRING_HASH_1 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define STRING_HASH_2(KEY, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + while (*++_key_) \ + (RESULT) += (*_key_ << (_key_[1] & 0x7)); \ +} while (0) +#define return_STRING_HASH_2(KEY) do { \ + unsigned long _result_ = 0; \ + STRING_HASH_2 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define STRING_COMPARE(X, Y, RESULT) do { \ + RESULT = (X) == (Y) ? 0 : strcmp ((X), (Y)); \ +} while (0) +#define return_STRING_COMPARE(X, Y) do { \ + return (X) == (Y) ? 0 : strcmp ((X), (Y)); \ +} while (0) + + +#define STRING_N_HASH_1(KEY, N, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + int _n_ = (N); \ + if (_n_) \ + while (--_n_ && *++_key_) \ + (RESULT) += (*_key_ << (_key_[1] & 0xf)); \ + (RESULT) += *++_key_; \ +} while (0) +#define return_STRING_N_HASH_1(KEY, N) do { \ + unsigned long _result_ = 0; \ + STRING_N_HASH_1 ((KEY), (N), _result_); \ + return _result_; \ +} while (0) + +#define STRING_N_HASH_2(KEY, N, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + int _n_ = (N); \ + if (_n_) \ + while (--_n_ && *++_key_) \ + (RESULT) += (*_key_ << (_key_[1] & 0x7)); \ + (RESULT) += *++_key_; \ +} while (0) +#define return_STRING_N_HASH_2(KEY, N) do { \ + unsigned long _result_ = 0; \ + STRING_N_HASH_2 ((KEY), (N), _result_); \ + return _result_; \ +} while (0) + +#define STRING_N_COMPARE(X, Y, N, RESULT) do { \ + RESULT = (X) == (Y) ? 0 : strncmp ((X), (Y), (N)); \ +} while (0) +#define return_STRING_N_COMPARE(X, Y, N) do { \ + return (X) == (Y) ? 0 : strncmp ((X), (Y), (N)); \ +} while (0) + +#ifdef HAVE_CASE_INSENSITIVE_FS + +/* hash and comparison macros for case-insensitive string _key_s. */ + +#define ISTRING_HASH_1(KEY, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + while (*++_key_) \ + (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] & 0xf)); \ +} while (0) +#define return_ISTRING_HASH_1(KEY) do { \ + unsigned long _result_ = 0; \ + ISTRING_HASH_1 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define ISTRING_HASH_2(KEY, RESULT) do { \ + unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \ + while (*++_key_) \ + (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] & 0x7)); \ +} while (0) +#define return_ISTRING_HASH_2(KEY) do { \ + unsigned long _result_ = 0; \ + ISTRING_HASH_2 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define ISTRING_COMPARE(X, Y, RESULT) do { \ + RESULT = (X) == (Y) ? 0 : strcasecmp ((X), (Y)); \ +} while (0) +#define return_ISTRING_COMPARE(X, Y) do { \ + return (X) == (Y) ? 0 : strcasecmp ((X), (Y)); \ +} while (0) + +#else + +#define ISTRING_HASH_1(KEY, RESULT) STRING_HASH_1 ((KEY), (RESULT)) +#define return_ISTRING_HASH_1(KEY) return_STRING_HASH_1 (KEY) + +#define ISTRING_HASH_2(KEY, RESULT) STRING_HASH_2 ((KEY), (RESULT)) +#define return_ISTRING_HASH_2(KEY) return_STRING_HASH_2 (KEY) + +#define ISTRING_COMPARE(X, Y, RESULT) STRING_COMPARE ((X), (Y), (RESULT)) +#define return_ISTRING_COMPARE(X, Y) return_STRING_COMPARE ((X), (Y)) + +#endif + +/* hash and comparison macros for integer _key_s. */ + +#define INTEGER_HASH_1(KEY, RESULT) do { \ + (RESULT) += ((unsigned long)(KEY)); \ +} while (0) +#define return_INTEGER_HASH_1(KEY) do { \ + unsigned long _result_ = 0; \ + INTEGER_HASH_1 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define INTEGER_HASH_2(KEY, RESULT) do { \ + (RESULT) += ~((unsigned long)(KEY)); \ +} while (0) +#define return_INTEGER_HASH_2(KEY) do { \ + unsigned long _result_ = 0; \ + INTEGER_HASH_2 ((KEY), _result_); \ + return _result_; \ +} while (0) + +#define INTEGER_COMPARE(X, Y, RESULT) do { \ + (RESULT) = X - Y; \ +} while (0) +#define return_INTEGER_COMPARE(X, Y) do { \ + int _result_; \ + INTEGER_COMPARE (X, Y, _result_); \ + return _result_; \ +} while (0) + +/* hash and comparison macros for address keys. */ + +#define ADDRESS_HASH_1(KEY, RESULT) INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3, (RESULT)) +#define ADDRESS_HASH_2(KEY, RESULT) INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3, (RESULT)) +#define ADDRESS_COMPARE(X, Y, RESULT) INTEGER_COMPARE ((X), (Y), (RESULT)) +#define return_ADDRESS_HASH_1(KEY) return_INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3) +#define return_ADDRESS_HASH_2(KEY) return_INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3) +#define return_ADDRESS_COMPARE(X, Y) return_INTEGER_COMPARE ((X), (Y)) + +#endif /* not _hash_h_ */ diff --git a/implicit.c b/implicit.c new file mode 100644 index 0000000..5f98108 --- /dev/null +++ b/implicit.c @@ -0,0 +1,979 @@ +/* Implicit rule searching for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "filedef.h" +#include "rule.h" +#include "dep.h" +#include "debug.h" +#include "variable.h" +#include "job.h" /* struct child, used inside commands.h */ +#include "commands.h" /* set_file_variables */ + +static int pattern_search (struct file *file, int archive, + unsigned int depth, unsigned int recursions); + +/* For a FILE which has no commands specified, try to figure out some + from the implicit pattern rules. + Returns 1 if a suitable implicit rule was found, + after modifying FILE to contain the appropriate commands and deps, + or returns 0 if no implicit rule was found. */ + +int +try_implicit_rule (struct file *file, unsigned int depth) +{ + DBF (DB_IMPLICIT, _("Looking for an implicit rule for `%s'.\n")); + + /* The order of these searches was previously reversed. My logic now is + that since the non-archive search uses more information in the target + (the archive search omits the archive name), it is more specific and + should come first. */ + + if (pattern_search (file, 0, depth, 0)) + return 1; + +#ifndef NO_ARCHIVES + /* If this is an archive member reference, use just the + archive member name to search for implicit rules. */ + if (ar_name (file->name)) + { + DBF (DB_IMPLICIT, + _("Looking for archive-member implicit rule for `%s'.\n")); + if (pattern_search (file, 1, depth, 0)) + return 1; + } +#endif + + return 0; +} + + +/* Scans the BUFFER for the next word with whitespace as a separator. + Returns the pointer to the beginning of the word. LENGTH hold the + length of the word. */ + +static const char * +get_next_word (const char *buffer, unsigned int *length) +{ + const char *p = buffer, *beg; + char c; + + /* Skip any leading whitespace. */ + while (isblank ((unsigned char)*p)) + ++p; + + beg = p; + c = *(p++); + + if (c == '\0') + return 0; + + + /* We already found the first value of "c", above. */ + while (1) + { + char closeparen; + int count; + + switch (c) + { + case '\0': + case ' ': + case '\t': + goto done_word; + + case '$': + c = *(p++); + if (c == '$') + break; + + /* This is a variable reference, so read it to the matching + close paren. */ + + if (c == '(') + closeparen = ')'; + else if (c == '{') + closeparen = '}'; + else + /* This is a single-letter variable reference. */ + break; + + for (count = 0; *p != '\0'; ++p) + { + if (*p == c) + ++count; + else if (*p == closeparen && --count < 0) + { + ++p; + break; + } + } + break; + + case '|': + goto done; + + default: + break; + } + + c = *(p++); + } + done_word: + --p; + + done: + if (length) + *length = p - beg; + + return beg; +} + +/* This structure stores information about the expanded prerequisites for a + pattern rule. NAME is always set to the strcache'd name of the prereq. + FILE and PATTERN will be set for intermediate files only. IGNORE_MTIME is + copied from the prerequisite we expanded. + */ +struct patdeps + { + const char *name; + const char *pattern; + struct file *file; + unsigned int ignore_mtime : 1; + }; + +/* This structure stores information about pattern rules that we need + to try. +*/ +struct tryrule + { + struct rule *rule; + + /* Index of the target in this rule that matched the file. */ + unsigned int matches; + + /* Stem length for this match. */ + unsigned int stemlen; + + /* Definition order of this rule. Used to implement stable sort.*/ + unsigned int order; + + /* Nonzero if the LASTSLASH logic was used in matching this rule. */ + char checked_lastslash; + }; + +int +stemlen_compare (const void *v1, const void *v2) +{ + const struct tryrule *r1 = v1; + const struct tryrule *r2 = v2; + int r = r1->stemlen - r2->stemlen; + return r != 0 ? r : (int)(r1->order - r2->order); +} + +/* Search the pattern rules for a rule with an existing dependency to make + FILE. If a rule is found, the appropriate commands and deps are put in FILE + and 1 is returned. If not, 0 is returned. + + If ARCHIVE is nonzero, FILE->name is of the form "LIB(MEMBER)". A rule for + "(MEMBER)" will be searched for, and "(MEMBER)" will not be chopped up into + directory and filename parts. + + If an intermediate file is found by pattern search, the intermediate file + is set up as a target by the recursive call and is also made a dependency + of FILE. + + DEPTH is used for debugging messages. */ + +static int +pattern_search (struct file *file, int archive, + unsigned int depth, unsigned int recursions) +{ + /* Filename we are searching for a rule for. */ + const char *filename = archive ? strchr (file->name, '(') : file->name; + + /* Length of FILENAME. */ + unsigned int namelen = strlen (filename); + + /* The last slash in FILENAME (or nil if there is none). */ + const char *lastslash; + + /* This is a file-object used as an argument in + recursive calls. It never contains any data + except during a recursive call. */ + struct file *int_file = 0; + + /* List of dependencies found recursively. */ + struct patdeps *deplist + = xmalloc (max_pattern_deps * sizeof (struct patdeps)); + struct patdeps *pat = deplist; + + /* All the prerequisites actually found for a rule, after expansion. */ + struct dep *deps; + + /* Names of possible dependencies are constructed in this buffer. */ + char *depname = alloca (namelen + max_pattern_dep_length); + + /* The start and length of the stem of FILENAME for the current rule. */ + const char *stem = 0; + unsigned int stemlen = 0; + unsigned int fullstemlen = 0; + + /* Buffer in which we store all the rules that are possibly applicable. */ + struct tryrule *tryrules = xmalloc (num_pattern_rules * max_pattern_targets + * sizeof (struct tryrule)); + + /* Number of valid elements in TRYRULES. */ + unsigned int nrules; + + /* The index in TRYRULES of the rule we found. */ + unsigned int foundrule; + + /* Nonzero if should consider intermediate files as dependencies. */ + int intermed_ok; + + /* Nonzero if we have initialized file variables for this target. */ + int file_vars_initialized = 0; + + /* Nonzero if we have matched a pattern-rule target + that is not just `%'. */ + int specific_rule_matched = 0; + + struct dep dep_simple; + + unsigned int ri; /* uninit checks OK */ + struct rule *rule; + + char *pathdir = NULL; + unsigned long pathlen; + + PATH_VAR (stem_str); /* @@ Need to get rid of stem, stemlen, etc. */ + +#ifndef NO_ARCHIVES + if (archive || ar_name (filename)) + lastslash = 0; + else +#endif + { + /* Set LASTSLASH to point at the last slash in FILENAME + but not counting any slash at the end. (foo/bar/ counts as + bar/ in directory foo/, not empty in directory foo/bar/.) */ +#ifdef VMS + lastslash = strrchr (filename, ']'); + if (lastslash == 0) + lastslash = strrchr (filename, ':'); +#else + lastslash = strrchr (filename, '/'); +#ifdef HAVE_DOS_PATHS + /* Handle backslashes (possibly mixed with forward slashes) + and the case of "d:file". */ + { + char *bslash = strrchr (filename, '\\'); + if (lastslash == 0 || bslash > lastslash) + lastslash = bslash; + if (lastslash == 0 && filename[0] && filename[1] == ':') + lastslash = filename + 1; + } +#endif +#endif + if (lastslash != 0 && lastslash[1] == '\0') + lastslash = 0; + } + + pathlen = lastslash - filename + 1; + + /* First see which pattern rules match this target and may be considered. + Put them in TRYRULES. */ + + nrules = 0; + for (rule = pattern_rules; rule != 0; rule = rule->next) + { + unsigned int ti; + + /* If the pattern rule has deps but no commands, ignore it. + Users cancel built-in rules by redefining them without commands. */ + if (rule->deps != 0 && rule->cmds == 0) + continue; + + /* If this rule is in use by a parent pattern_search, + don't use it here. */ + if (rule->in_use) + { + DBS (DB_IMPLICIT, (_("Avoiding implicit rule recursion.\n"))); + continue; + } + + for (ti = 0; ti < rule->num; ++ti) + { + const char *target = rule->targets[ti]; + const char *suffix = rule->suffixes[ti]; + int check_lastslash; + + /* Rules that can match any filename and are not terminal + are ignored if we're recursing, so that they cannot be + intermediate files. */ + if (recursions > 0 && target[1] == '\0' && !rule->terminal) + continue; + + if (rule->lens[ti] > namelen) + /* It can't possibly match. */ + continue; + + /* From the lengths of the filename and the pattern parts, + find the stem: the part of the filename that matches the %. */ + stem = filename + (suffix - target - 1); + stemlen = namelen - rule->lens[ti] + 1; + + /* Set CHECK_LASTSLASH if FILENAME contains a directory + prefix and the target pattern does not contain a slash. */ + + check_lastslash = 0; + if (lastslash) + { +#ifdef VMS + check_lastslash = (strchr (target, ']') == 0 + && strchr (target, ':') == 0); +#else + check_lastslash = strchr (target, '/') == 0; +#ifdef HAVE_DOS_PATHS + /* Didn't find it yet: check for DOS-type directories. */ + if (check_lastslash) + { + char *b = strchr (target, '\\'); + check_lastslash = !(b || (target[0] && target[1] == ':')); + } +#endif +#endif + } + if (check_lastslash) + { + /* If so, don't include the directory prefix in STEM here. */ + if (pathlen > stemlen) + continue; + stemlen -= pathlen; + stem += pathlen; + } + + /* Check that the rule pattern matches the text before the stem. */ + if (check_lastslash) + { + if (stem > (lastslash + 1) + && !strneq (target, lastslash + 1, stem - lastslash - 1)) + continue; + } + else if (stem > filename + && !strneq (target, filename, stem - filename)) + continue; + + /* Check that the rule pattern matches the text after the stem. + We could test simply use streq, but this way we compare the + first two characters immediately. This saves time in the very + common case where the first character matches because it is a + period. */ + if (*suffix != stem[stemlen] + || (*suffix != '\0' && !streq (&suffix[1], &stem[stemlen + 1]))) + continue; + + /* Record if we match a rule that not all filenames will match. */ + if (target[1] != '\0') + specific_rule_matched = 1; + + /* A rule with no dependencies and no commands exists solely to set + specific_rule_matched when it matches. Don't try to use it. */ + if (rule->deps == 0 && rule->cmds == 0) + continue; + + /* Record this rule in TRYRULES and the index of the matching + target in MATCHES. If several targets of the same rule match, + that rule will be in TRYRULES more than once. */ + tryrules[nrules].rule = rule; + tryrules[nrules].matches = ti; + tryrules[nrules].stemlen = stemlen + (check_lastslash ? pathlen : 0); + tryrules[nrules].order = nrules; + tryrules[nrules].checked_lastslash = check_lastslash; + ++nrules; + } + } + + /* Bail out early if we haven't found any rules. */ + if (nrules == 0) + goto done; + + /* Sort the rules to place matches with the shortest stem first. This + way the most specific rules will be tried first. */ + if (nrules > 1) + qsort (tryrules, nrules, sizeof (struct tryrule), stemlen_compare); + + /* If we have found a matching rule that won't match all filenames, + retroactively reject any non-"terminal" rules that do always match. */ + if (specific_rule_matched) + for (ri = 0; ri < nrules; ++ri) + if (!tryrules[ri].rule->terminal) + { + unsigned int j; + for (j = 0; j < tryrules[ri].rule->num; ++j) + if (tryrules[ri].rule->targets[j][1] == '\0') + { + tryrules[ri].rule = 0; + break; + } + } + + /* Try each rule once without intermediate files, then once with them. */ + for (intermed_ok = 0; intermed_ok < 2; ++intermed_ok) + { + pat = deplist; + + /* Try each pattern rule till we find one that applies. If it does, + expand its dependencies (as substituted) and chain them in DEPS. */ + for (ri = 0; ri < nrules; ri++) + { + struct dep *dep; + int check_lastslash; + unsigned int failed = 0; + int file_variables_set = 0; + unsigned int deps_found = 0; + /* NPTR points to the part of the prereq we haven't processed. */ + const char *nptr = 0; + const char *dir = NULL; + int order_only = 0; + unsigned int matches; + + rule = tryrules[ri].rule; + + /* RULE is nil when we discover that a rule, already placed in + TRYRULES, should not be applied. */ + if (rule == 0) + continue; + + /* Reject any terminal rules if we're looking to make intermediate + files. */ + if (intermed_ok && rule->terminal) + continue; + + /* From the lengths of the filename and the matching pattern parts, + find the stem: the part of the filename that matches the %. */ + matches = tryrules[ri].matches; + stem = filename + (rule->suffixes[matches] + - rule->targets[matches]) - 1; + stemlen = (namelen - rule->lens[matches]) + 1; + check_lastslash = tryrules[ri].checked_lastslash; + if (check_lastslash) + { + stem += pathlen; + stemlen -= pathlen; + + /* We need to add the directory prefix, so set it up. */ + if (! pathdir) + { + pathdir = alloca (pathlen + 1); + memcpy (pathdir, filename, pathlen); + pathdir[pathlen] = '\0'; + } + dir = pathdir; + } + + DBS (DB_IMPLICIT, (_("Trying pattern rule with stem `%.*s'.\n"), + (int) stemlen, stem)); + + strncpy (stem_str, stem, stemlen); + stem_str[stemlen] = '\0'; + + /* If there are no prerequisites, then this rule matches. */ + if (rule->deps == 0) + break; + + /* Temporary assign STEM to file->stem (needed to set file + variables below). */ + file->stem = stem_str; + + /* Mark this rule as in use so a recursive pattern_search won't try + to use it. */ + rule->in_use = 1; + + /* Try each prerequisite; see if it exists or can be created. We'll + build a list of prereq info in DEPLIST. Due to 2nd expansion we + may have to process multiple prereqs for a single dep entry. */ + + pat = deplist; + dep = rule->deps; + nptr = dep_name (dep); + while (1) + { + struct dep *dl, *d; + char *p; + + /* If we're out of name to parse, start the next prereq. */ + if (! nptr) + { + dep = dep->next; + if (dep == 0) + break; + nptr = dep_name (dep); + } + + /* If we don't need a second expansion, just replace the %. */ + if (! dep->need_2nd_expansion) + { + dep_simple = *dep; + dep_simple.next = 0; + p = strchr (nptr, '%'); + if (p == 0) + dep_simple.name = nptr; + else + { + char *o = depname; + if (check_lastslash) + { + memcpy (o, filename, pathlen); + o += pathlen; + } + memcpy (o, nptr, p - nptr); + o += p - nptr; + memcpy (o, stem_str, stemlen); + o += stemlen; + strcpy (o, p + 1); + dep_simple.name = strcache_add (depname); + } + dl = &dep_simple; + + /* We've used up this dep, so next time get a new one. */ + nptr = 0; + ++deps_found; + } + + /* We have to perform second expansion on this prereq. In an + ideal world we would take the dependency line, substitute the + stem, re-expand the whole line and chop it into individual + prerequisites. Unfortunately this won't work because of the + "check_lastslash" twist. Instead, we will have to go word by + word, taking $()'s into account. For each word we will + substitute the stem, re-expand, chop it up, and, if + check_lastslash != 0, add the directory part to each + resulting prerequisite. */ + else + { + int add_dir = 0; + unsigned int len; + + nptr = get_next_word (nptr, &len); + if (nptr == 0) + continue; + + /* See this is a transition to order-only prereqs. */ + if (! order_only && len == 1 && nptr[0] == '|') + { + order_only = 1; + nptr += len; + continue; + } + + /* If the dependency name has %, substitute the stem. If we + just replace % with the stem value then later, when we do + the 2nd expansion, we will re-expand this stem value + again. This is not good if you have certain characters + in your stem (like $). + + Instead, we will replace % with $* and allow the second + expansion to take care of it for us. This way (since $* + is a simple variable) there won't be additional + re-expansion of the stem. */ + + p = lindex (nptr, nptr + len, '%'); + if (p == 0) + { + memcpy (depname, nptr, len); + depname[len] = '\0'; + } + else + { + unsigned int i = p - nptr; + memcpy (depname, nptr, i); + memcpy (depname + i, "$*", 2); + memcpy (depname + i + 2, p + 1, len - i - 1); + depname[len + 2 - 1] = '\0'; + + if (check_lastslash) + add_dir = 1; + } + + /* Initialize and set file variables if we haven't already + done so. */ + if (!file_vars_initialized) + { + initialize_file_variables (file, 0); + set_file_variables (file); + file_vars_initialized = 1; + } + /* Update the stem value in $* for this rule. */ + else if (!file_variables_set) + { + define_variable_for_file ( + "*", 1, file->stem, o_automatic, 0, file); + file_variables_set = 1; + } + + /* Perform the 2nd expansion. */ + p = variable_expand_for_file (depname, file); + + /* Parse the expanded string. */ + dl = PARSE_FILE_SEQ (&p, struct dep, order_only ? '\0' : '|', + add_dir ? dir : NULL, 0); + + for (d = dl; d != NULL; d = d->next) + { + ++deps_found; + if (order_only) + d->ignore_mtime = 1; + } + + /* Set up for the next word. */ + nptr += len; + } + + /* If there are more than max_pattern_deps prerequisites (due to + 2nd expansion), reset it and realloc the arrays. */ + + if (deps_found > max_pattern_deps) + { + unsigned int l = pat - deplist; + deplist = xrealloc (deplist, + deps_found * sizeof (struct patdeps)); + pat = deplist + l; + max_pattern_deps = deps_found; + } + + /* Go through the nameseq and handle each as a prereq name. */ + for (d = dl; d != 0; d = d->next) + { + struct dep *expl_d; + int is_rule = d->name == dep_name (dep); + + if (file_impossible_p (d->name)) + { + /* If this prereq has already been ruled "impossible", + then the rule fails. Don't bother trying it on the + second pass either since we know that will fail. */ + DBS (DB_IMPLICIT, + (is_rule + ? _("Rejecting impossible rule prerequisite `%s'.\n") + : _("Rejecting impossible implicit prerequisite `%s'.\n"), + d->name)); + tryrules[ri].rule = 0; + + failed = 1; + break; + } + + memset (pat, '\0', sizeof (struct patdeps)); + pat->ignore_mtime = d->ignore_mtime; + + DBS (DB_IMPLICIT, + (is_rule + ? _("Trying rule prerequisite `%s'.\n") + : _("Trying implicit prerequisite `%s'.\n"), d->name)); + + /* If this prereq is also explicitly mentioned for FILE, + skip all tests below since it must be built no matter + which implicit rule we choose. */ + + for (expl_d = file->deps; expl_d != 0; expl_d = expl_d->next) + if (streq (dep_name (expl_d), d->name)) + break; + if (expl_d != 0) + { + (pat++)->name = d->name; + continue; + } + + /* The DEP->changed flag says that this dependency resides + in a nonexistent directory. So we normally can skip + looking for the file. However, if CHECK_LASTSLASH is + set, then the dependency file we are actually looking for + is in a different directory (the one gotten by prepending + FILENAME's directory), so it might actually exist. */ + + /* @@ dep->changed check is disabled. */ + if (lookup_file (d->name) != 0 + /*|| ((!dep->changed || check_lastslash) && */ + || file_exists_p (d->name)) + { + (pat++)->name = d->name; + continue; + } + + /* This code, given FILENAME = "lib/foo.o", dependency name + "lib/foo.c", and VPATH=src, searches for + "src/lib/foo.c". */ + { + const char *vname = vpath_search (d->name, 0, NULL, NULL); + if (vname) + { + DBS (DB_IMPLICIT, + (_("Found prerequisite `%s' as VPATH `%s'\n"), + d->name, vname)); + (pat++)->name = d->name; + continue; + } + } + + /* We could not find the file in any place we should look. + Try to make this dependency as an intermediate file, but + only on the second pass. */ + + if (intermed_ok) + { + DBS (DB_IMPLICIT, + (_("Looking for a rule with intermediate file `%s'.\n"), + d->name)); + + if (int_file == 0) + int_file = alloca (sizeof (struct file)); + memset (int_file, '\0', sizeof (struct file)); + int_file->name = d->name; + + if (pattern_search (int_file, + 0, + depth + 1, + recursions + 1)) + { + pat->pattern = int_file->name; + int_file->name = d->name; + pat->file = int_file; + (pat++)->name = d->name; + int_file = 0; + continue; + } + + /* If we have tried to find P as an intermediate file + and failed, mark that name as impossible so we won't + go through the search again later. */ + if (int_file->variables) + free_variable_set (int_file->variables); + if (int_file->pat_variables) + free_variable_set (int_file->pat_variables); + file_impossible (d->name); + } + + /* A dependency of this rule does not exist. Therefore, this + rule fails. */ + failed = 1; + break; + } + + /* Free the ns chain. */ + if (dl != &dep_simple) + free_dep_chain (dl); + + if (failed) + break; + } + + /* Reset the stem in FILE. */ + + file->stem = 0; + + /* This rule is no longer `in use' for recursive searches. */ + rule->in_use = 0; + + if (! failed) + /* This pattern rule does apply. Stop looking for one. */ + break; + + /* This pattern rule does not apply. If some of its dependencies + succeeded, free the data structure describing them. */ + /* free_idep_chain (deps); */ + deps = 0; + } + + /* If we found an applicable rule without intermediate files, don't try + with them. */ + if (ri < nrules) + break; + + rule = 0; + } + + /* RULE is nil if the loop went through the list but everything failed. */ + if (rule == 0) + goto done; + + foundrule = ri; + + /* If we are recursing, store the pattern that matched FILENAME in + FILE->name for use in upper levels. */ + + if (recursions > 0) + /* Kludge-o-matic */ + file->name = rule->targets[tryrules[foundrule].matches]; + + /* DEPLIST lists the prerequisites for the rule we found. This includes the + intermediate files, if any. Convert them into entries on the deps-chain + of FILE. */ + + while (pat-- > deplist) + { + struct dep *dep; + const char *s; + + if (pat->file != 0) + { + /* If we need to use an intermediate file, make sure it is entered + as a target, with the info that was found for it in the recursive + pattern_search call. We know that the intermediate file did not + already exist as a target; therefore we can assume that the deps + and cmds of F below are null before we change them. */ + + struct file *imf = pat->file; + struct file *f = lookup_file (imf->name); + + /* We don't want to delete an intermediate file that happened + to be a prerequisite of some (other) target. Mark it as + precious. */ + if (f != 0) + f->precious = 1; + else + f = enter_file (imf->name); + + f->deps = imf->deps; + f->cmds = imf->cmds; + f->stem = imf->stem; + f->variables = imf->variables; + f->pat_variables = imf->pat_variables; + f->pat_searched = imf->pat_searched; + f->also_make = imf->also_make; + f->is_target = 1; + f->intermediate = 1; + f->tried_implicit = 1; + + imf = lookup_file (pat->pattern); + if (imf != 0 && imf->precious) + f->precious = 1; + + for (dep = f->deps; dep != 0; dep = dep->next) + { + dep->file = enter_file (dep->name); + dep->name = 0; + dep->file->tried_implicit |= dep->changed; + } + } + + dep = alloc_dep (); + dep->ignore_mtime = pat->ignore_mtime; + s = strcache_add (pat->name); + if (recursions) + dep->name = s; + else + { + dep->file = lookup_file (s); + if (dep->file == 0) + dep->file = enter_file (s); + } + + if (pat->file == 0 && tryrules[foundrule].rule->terminal) + { + /* If the file actually existed (was not an intermediate file), and + the rule that found it was a terminal one, then we want to mark + the found file so that it will not have implicit rule search done + for it. If we are not entering a `struct file' for it now, we + indicate this with the `changed' flag. */ + if (dep->file == 0) + dep->changed = 1; + else + dep->file->tried_implicit = 1; + } + + dep->next = file->deps; + file->deps = dep; + } + + if (!tryrules[foundrule].checked_lastslash) + { + /* Always allocate new storage, since STEM might be on the stack for an + intermediate file. */ + file->stem = strcache_add_len (stem, stemlen); + fullstemlen = stemlen; + } + else + { + int dirlen = (lastslash + 1) - filename; + char *sp; + + /* We want to prepend the directory from + the original FILENAME onto the stem. */ + fullstemlen = dirlen + stemlen; + sp = alloca (fullstemlen + 1); + memcpy (sp, filename, dirlen); + memcpy (sp + dirlen, stem, stemlen); + sp[fullstemlen] = '\0'; + file->stem = strcache_add (sp); + } + + file->cmds = rule->cmds; + file->is_target = 1; + + /* Set precious flag. */ + { + struct file *f = lookup_file (rule->targets[tryrules[foundrule].matches]); + if (f && f->precious) + file->precious = 1; + } + + /* If this rule builds other targets, too, put the others into FILE's + `also_make' member. */ + + if (rule->num > 1) + for (ri = 0; ri < rule->num; ++ri) + if (ri != tryrules[foundrule].matches) + { + char *nm = alloca (rule->lens[ri] + fullstemlen + 1); + char *p = nm; + struct file *f; + struct dep *new = alloc_dep (); + + /* GKM FIMXE: handle '|' here too */ + memcpy (p, rule->targets[ri], + rule->suffixes[ri] - rule->targets[ri] - 1); + p += rule->suffixes[ri] - rule->targets[ri] - 1; + memcpy (p, file->stem, fullstemlen); + p += fullstemlen; + memcpy (p, rule->suffixes[ri], + rule->lens[ri] - (rule->suffixes[ri] - rule->targets[ri])+1); + new->name = strcache_add (nm); + new->file = enter_file (new->name); + new->next = file->also_make; + + /* Set precious flag. */ + f = lookup_file (rule->targets[ri]); + if (f && f->precious) + new->file->precious = 1; + + /* Set the is_target flag so that this file is not treated as + intermediate by the pattern rule search algorithm and + file_exists_p cannot pick it up yet. */ + new->file->is_target = 1; + + file->also_make = new; + } + + done: + free (tryrules); + free (deplist); + + return rule != 0; +} diff --git a/job.c b/job.c new file mode 100644 index 0000000..aacfb84 --- /dev/null +++ b/job.c @@ -0,0 +1,3236 @@ +/* Job execution and handling for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +#include + +#include "job.h" +#include "debug.h" +#include "filedef.h" +#include "commands.h" +#include "variable.h" +#include "debug.h" + +#include + +/* Default shell to use. */ +#ifdef WINDOWS32 +#include + +char *default_shell = "sh.exe"; +int no_default_sh_exe = 1; +int batch_mode_shell = 1; +HANDLE main_thread; + +#elif defined (_AMIGA) + +char default_shell[] = ""; +extern int MyExecute (char **); +int batch_mode_shell = 0; + +#elif defined (__MSDOS__) + +/* The default shell is a pointer so we can change it if Makefile + says so. It is without an explicit path so we get a chance + to search the $PATH for it (since MSDOS doesn't have standard + directories we could trust). */ +char *default_shell = "command.com"; +int batch_mode_shell = 0; + +#elif defined (__EMX__) + +char *default_shell = "/bin/sh"; +int batch_mode_shell = 0; + +#elif defined (VMS) + +# include +char default_shell[] = ""; +int batch_mode_shell = 0; + +#elif defined (__riscos__) + +char default_shell[] = ""; +int batch_mode_shell = 0; + +#else + +char default_shell[] = "/bin/sh"; +int batch_mode_shell = 0; + +#endif + +#ifdef __MSDOS__ +# include +static int execute_by_shell; +static int dos_pid = 123; +int dos_status; +int dos_command_running; +#endif /* __MSDOS__ */ + +#ifdef _AMIGA +# include +static int amiga_pid = 123; +static int amiga_status; +static char amiga_bname[32]; +static int amiga_batch_file; +#endif /* Amiga. */ + +#ifdef VMS +# ifndef __GNUC__ +# include +# endif +# include +# include +static void vmsWaitForChildren (int *); +#endif + +#ifdef WINDOWS32 +# include +# include +# include +# include "sub_proc.h" +# include "w32err.h" +# include "pathstuff.h" +#endif /* WINDOWS32 */ + +#ifdef __EMX__ +# include +#endif + +#if defined (HAVE_SYS_WAIT_H) || defined (HAVE_UNION_WAIT) +# include +#endif + +#ifdef HAVE_WAITPID +# define WAIT_NOHANG(status) waitpid (-1, (status), WNOHANG) +#else /* Don't have waitpid. */ +# ifdef HAVE_WAIT3 +# ifndef wait3 +extern int wait3 (); +# endif +# define WAIT_NOHANG(status) wait3 ((status), WNOHANG, (struct rusage *) 0) +# endif /* Have wait3. */ +#endif /* Have waitpid. */ + +#if !defined (wait) && !defined (POSIX) +int wait (); +#endif + +#ifndef HAVE_UNION_WAIT + +# define WAIT_T int + +# ifndef WTERMSIG +# define WTERMSIG(x) ((x) & 0x7f) +# endif +# ifndef WCOREDUMP +# define WCOREDUMP(x) ((x) & 0x80) +# endif +# ifndef WEXITSTATUS +# define WEXITSTATUS(x) (((x) >> 8) & 0xff) +# endif +# ifndef WIFSIGNALED +# define WIFSIGNALED(x) (WTERMSIG (x) != 0) +# endif +# ifndef WIFEXITED +# define WIFEXITED(x) (WTERMSIG (x) == 0) +# endif + +#else /* Have `union wait'. */ + +# define WAIT_T union wait +# ifndef WTERMSIG +# define WTERMSIG(x) ((x).w_termsig) +# endif +# ifndef WCOREDUMP +# define WCOREDUMP(x) ((x).w_coredump) +# endif +# ifndef WEXITSTATUS +# define WEXITSTATUS(x) ((x).w_retcode) +# endif +# ifndef WIFSIGNALED +# define WIFSIGNALED(x) (WTERMSIG(x) != 0) +# endif +# ifndef WIFEXITED +# define WIFEXITED(x) (WTERMSIG(x) == 0) +# endif + +#endif /* Don't have `union wait'. */ + +#if !defined(HAVE_UNISTD_H) && !defined(WINDOWS32) +int dup2 (); +int execve (); +void _exit (); +# ifndef VMS +int geteuid (); +int getegid (); +int setgid (); +int getgid (); +# endif +#endif + +/* Different systems have different requirements for pid_t. + Plus we have to support gettext string translation... Argh. */ +static const char * +pid2str (pid_t pid) +{ + static char pidstring[100]; +#if defined(WINDOWS32) && (__GNUC__ > 3 || _MSC_VER > 1300) + /* %Id is only needed for 64-builds, which were not supported by + older versions of Windows compilers. */ + sprintf (pidstring, "%Id", pid); +#else + sprintf (pidstring, "%lu", (unsigned long) pid); +#endif + return pidstring; +} + +int getloadavg (double loadavg[], int nelem); +int start_remote_job (char **argv, char **envp, int stdin_fd, int *is_remote, + int *id_ptr, int *used_stdin); +int start_remote_job_p (int); +int remote_status (int *exit_code_ptr, int *signal_ptr, int *coredump_ptr, + int block); + +RETSIGTYPE child_handler (int); +static void free_child (struct child *); +static void start_job_command (struct child *child); +static int load_too_high (void); +static int job_next_command (struct child *); +static int start_waiting_job (struct child *); + +/* Chain of all live (or recently deceased) children. */ + +struct child *children = 0; + +/* Number of children currently running. */ + +unsigned int job_slots_used = 0; + +/* Nonzero if the `good' standard input is in use. */ + +static int good_stdin_used = 0; + +/* Chain of children waiting to run until the load average goes down. */ + +static struct child *waiting_jobs = 0; + +/* Non-zero if we use a *real* shell (always so on Unix). */ + +int unixy_shell = 1; + +/* Number of jobs started in the current second. */ + +unsigned long job_counter = 0; + +/* Number of jobserver tokens this instance is currently using. */ + +unsigned int jobserver_tokens = 0; + +#ifdef WINDOWS32 +/* + * The macro which references this function is defined in make.h. + */ +int +w32_kill(pid_t pid, int sig) +{ + return ((process_kill((HANDLE)pid, sig) == TRUE) ? 0 : -1); +} + +/* This function creates a temporary file name with an extension specified + * by the unixy arg. + * Return an xmalloc'ed string of a newly created temp file and its + * file descriptor, or die. */ +static char * +create_batch_file (char const *base, int unixy, int *fd) +{ + const char *const ext = unixy ? "sh" : "bat"; + const char *error_string = NULL; + char temp_path[MAXPATHLEN]; /* need to know its length */ + unsigned path_size = GetTempPath(sizeof temp_path, temp_path); + int path_is_dot = 0; + unsigned uniq = 1; + const unsigned sizemax = strlen (base) + strlen (ext) + 10; + + if (path_size == 0) + { + path_size = GetCurrentDirectory (sizeof temp_path, temp_path); + path_is_dot = 1; + } + + while (path_size > 0 && + path_size + sizemax < sizeof temp_path && + uniq < 0x10000) + { + unsigned size = sprintf (temp_path + path_size, + "%s%s-%x.%s", + temp_path[path_size - 1] == '\\' ? "" : "\\", + base, uniq, ext); + HANDLE h = CreateFile (temp_path, /* file name */ + GENERIC_READ | GENERIC_WRITE, /* desired access */ + 0, /* no share mode */ + NULL, /* default security attributes */ + CREATE_NEW, /* creation disposition */ + FILE_ATTRIBUTE_NORMAL | /* flags and attributes */ + FILE_ATTRIBUTE_TEMPORARY, /* we'll delete it */ + NULL); /* no template file */ + + if (h == INVALID_HANDLE_VALUE) + { + const DWORD er = GetLastError(); + + if (er == ERROR_FILE_EXISTS || er == ERROR_ALREADY_EXISTS) + ++uniq; + + /* the temporary path is not guaranteed to exist */ + else if (path_is_dot == 0) + { + path_size = GetCurrentDirectory (sizeof temp_path, temp_path); + path_is_dot = 1; + } + + else + { + error_string = map_windows32_error_to_string (er); + break; + } + } + else + { + const unsigned final_size = path_size + size + 1; + char *const path = xmalloc (final_size); + memcpy (path, temp_path, final_size); + *fd = _open_osfhandle ((intptr_t)h, 0); + if (unixy) + { + char *p; + int ch; + for (p = path; (ch = *p) != 0; ++p) + if (ch == '\\') + *p = '/'; + } + return path; /* good return */ + } + } + + *fd = -1; + if (error_string == NULL) + error_string = _("Cannot create a temporary file\n"); + fatal (NILF, error_string); + + /* not reached */ + return NULL; +} +#endif /* WINDOWS32 */ + +#ifdef __EMX__ +/* returns whether path is assumed to be a unix like shell. */ +int +_is_unixy_shell (const char *path) +{ + /* list of non unix shells */ + const char *known_os2shells[] = { + "cmd.exe", + "cmd", + "4os2.exe", + "4os2", + "4dos.exe", + "4dos", + "command.com", + "command", + NULL + }; + + /* find the rightmost '/' or '\\' */ + const char *name = strrchr (path, '/'); + const char *p = strrchr (path, '\\'); + unsigned i; + + if (name && p) /* take the max */ + name = (name > p) ? name : p; + else if (p) /* name must be 0 */ + name = p; + else if (!name) /* name and p must be 0 */ + name = path; + + if (*name == '/' || *name == '\\') name++; + + i = 0; + while (known_os2shells[i] != NULL) { + if (strcasecmp (name, known_os2shells[i]) == 0) + return 0; /* not a unix shell */ + i++; + } + + /* in doubt assume a unix like shell */ + return 1; +} +#endif /* __EMX__ */ + +/* determines whether path looks to be a Bourne-like shell. */ +int +is_bourne_compatible_shell (const char *path) +{ + /* list of known unix (Bourne-like) shells */ + const char *unix_shells[] = { + "sh", + "bash", + "ksh", + "rksh", + "zsh", + "ash", + "dash", + NULL + }; + unsigned i, len; + + /* find the rightmost '/' or '\\' */ + const char *name = strrchr (path, '/'); + char *p = strrchr (path, '\\'); + + if (name && p) /* take the max */ + name = (name > p) ? name : p; + else if (p) /* name must be 0 */ + name = p; + else if (!name) /* name and p must be 0 */ + name = path; + + if (*name == '/' || *name == '\\') name++; + + /* this should be able to deal with extensions on Windows-like systems */ + for (i = 0; unix_shells[i] != NULL; i++) { + len = strlen(unix_shells[i]); +#if defined(WINDOWS32) || defined(__MSDOS__) + if ((strncasecmp (name, unix_shells[i], len) == 0) && + (strlen(name) >= len && (name[len] == '\0' || name[len] == '.'))) +#else + if ((strncmp (name, unix_shells[i], len) == 0) && + (strlen(name) >= len && name[len] == '\0')) +#endif + return 1; /* a known unix-style shell */ + } + + /* if not on the list, assume it's not a Bourne-like shell */ + return 0; +} + + +/* Write an error message describing the exit status given in + EXIT_CODE, EXIT_SIG, and COREDUMP, for the target TARGET_NAME. + Append "(ignored)" if IGNORED is nonzero. */ + +static void +child_error (const char *target_name, + int exit_code, int exit_sig, int coredump, int ignored) +{ + if (ignored && silent_flag) + return; + +#ifdef VMS + if (!(exit_code & 1)) + error (NILF, + (ignored ? _("*** [%s] Error 0x%x (ignored)") + : _("*** [%s] Error 0x%x")), + target_name, exit_code); +#else + if (exit_sig == 0) + error (NILF, ignored ? _("[%s] Error %d (ignored)") : + _("*** [%s] Error %d"), + target_name, exit_code); + else + error (NILF, "*** [%s] %s%s", + target_name, strsignal (exit_sig), + coredump ? _(" (core dumped)") : ""); +#endif /* VMS */ +} + + +/* Handle a dead child. This handler may or may not ever be installed. + + If we're using the jobserver feature, we need it. First, installing it + ensures the read will interrupt on SIGCHLD. Second, we close the dup'd + read FD to ensure we don't enter another blocking read without reaping all + the dead children. In this case we don't need the dead_children count. + + If we don't have either waitpid or wait3, then make is unreliable, but we + use the dead_children count to reap children as best we can. */ + +static unsigned int dead_children = 0; + +RETSIGTYPE +child_handler (int sig UNUSED) +{ + ++dead_children; + + if (job_rfd >= 0) + { + close (job_rfd); + job_rfd = -1; + } + +#ifdef __EMX__ + /* The signal handler must called only once! */ + signal (SIGCHLD, SIG_DFL); +#endif + + /* This causes problems if the SIGCHLD interrupts a printf(). + DB (DB_JOBS, (_("Got a SIGCHLD; %u unreaped children.\n"), dead_children)); + */ +} + +extern int shell_function_pid, shell_function_completed; + +/* Reap all dead children, storing the returned status and the new command + state (`cs_finished') in the `file' member of the `struct child' for the + dead child, and removing the child from the chain. In addition, if BLOCK + nonzero, we block in this function until we've reaped at least one + complete child, waiting for it to die if necessary. If ERR is nonzero, + print an error message first. */ + +void +reap_children (int block, int err) +{ +#ifndef WINDOWS32 + WAIT_T status; + /* Initially, assume we have some. */ + int reap_more = 1; +#endif + +#ifdef WAIT_NOHANG +# define REAP_MORE reap_more +#else +# define REAP_MORE dead_children +#endif + + /* As long as: + + We have at least one child outstanding OR a shell function in progress, + AND + We're blocking for a complete child OR there are more children to reap + + we'll keep reaping children. */ + + while ((children != 0 || shell_function_pid != 0) + && (block || REAP_MORE)) + { + int remote = 0; + pid_t pid; + int exit_code, exit_sig, coredump; + register struct child *lastc, *c; + int child_failed; + int any_remote, any_local; + int dontcare; + + if (err && block) + { + static int printed = 0; + + /* We might block for a while, so let the user know why. + Only print this message once no matter how many jobs are left. */ + fflush (stdout); + if (!printed) + error (NILF, _("*** Waiting for unfinished jobs....")); + printed = 1; + } + + /* We have one less dead child to reap. As noted in + child_handler() above, this count is completely unimportant for + all modern, POSIX-y systems that support wait3() or waitpid(). + The rest of this comment below applies only to early, broken + pre-POSIX systems. We keep the count only because... it's there... + + The test and decrement are not atomic; if it is compiled into: + register = dead_children - 1; + dead_children = register; + a SIGCHLD could come between the two instructions. + child_handler increments dead_children. + The second instruction here would lose that increment. But the + only effect of dead_children being wrong is that we might wait + longer than necessary to reap a child, and lose some parallelism; + and we might print the "Waiting for unfinished jobs" message above + when not necessary. */ + + if (dead_children > 0) + --dead_children; + + any_remote = 0; + any_local = shell_function_pid != 0; + for (c = children; c != 0; c = c->next) + { + any_remote |= c->remote; + any_local |= ! c->remote; + DB (DB_JOBS, (_("Live child %p (%s) PID %s %s\n"), + c, c->file->name, pid2str (c->pid), + c->remote ? _(" (remote)") : "")); +#ifdef VMS + break; +#endif + } + + /* First, check for remote children. */ + if (any_remote) + pid = remote_status (&exit_code, &exit_sig, &coredump, 0); + else + pid = 0; + + if (pid > 0) + /* We got a remote child. */ + remote = 1; + else if (pid < 0) + { + /* A remote status command failed miserably. Punt. */ + remote_status_lose: + pfatal_with_name ("remote_status"); + } + else + { + /* No remote children. Check for local children. */ +#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32) + if (any_local) + { +#ifdef VMS + vmsWaitForChildren (&status); + pid = c->pid; +#else +#ifdef WAIT_NOHANG + if (!block) + pid = WAIT_NOHANG (&status); + else +#endif + EINTRLOOP(pid, wait (&status)); +#endif /* !VMS */ + } + else + pid = 0; + + if (pid < 0) + { + /* The wait*() failed miserably. Punt. */ + pfatal_with_name ("wait"); + } + else if (pid > 0) + { + /* We got a child exit; chop the status word up. */ + exit_code = WEXITSTATUS (status); + exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0; + coredump = WCOREDUMP (status); + + /* If we have started jobs in this second, remove one. */ + if (job_counter) + --job_counter; + } + else + { + /* No local children are dead. */ + reap_more = 0; + + if (!block || !any_remote) + break; + + /* Now try a blocking wait for a remote child. */ + pid = remote_status (&exit_code, &exit_sig, &coredump, 1); + if (pid < 0) + goto remote_status_lose; + else if (pid == 0) + /* No remote children either. Finally give up. */ + break; + + /* We got a remote child. */ + remote = 1; + } +#endif /* !__MSDOS__, !Amiga, !WINDOWS32. */ + +#ifdef __MSDOS__ + /* Life is very different on MSDOS. */ + pid = dos_pid - 1; + status = dos_status; + exit_code = WEXITSTATUS (status); + if (exit_code == 0xff) + exit_code = -1; + exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0; + coredump = 0; +#endif /* __MSDOS__ */ +#ifdef _AMIGA + /* Same on Amiga */ + pid = amiga_pid - 1; + status = amiga_status; + exit_code = amiga_status; + exit_sig = 0; + coredump = 0; +#endif /* _AMIGA */ +#ifdef WINDOWS32 + { + HANDLE hPID; + int werr; + HANDLE hcTID, hcPID; + exit_code = 0; + exit_sig = 0; + coredump = 0; + + /* Record the thread ID of the main process, so that we + could suspend it in the signal handler. */ + if (!main_thread) + { + hcTID = GetCurrentThread (); + hcPID = GetCurrentProcess (); + if (!DuplicateHandle (hcPID, hcTID, hcPID, &main_thread, 0, + FALSE, DUPLICATE_SAME_ACCESS)) + { + DWORD e = GetLastError (); + fprintf (stderr, + "Determine main thread ID (Error %ld: %s)\n", + e, map_windows32_error_to_string(e)); + } + else + DB (DB_VERBOSE, ("Main thread handle = %p\n", main_thread)); + } + + /* wait for anything to finish */ + hPID = process_wait_for_any(); + if (hPID) + { + + /* was an error found on this process? */ + werr = process_last_err(hPID); + + /* get exit data */ + exit_code = process_exit_code(hPID); + + if (werr) + fprintf(stderr, "make (e=%d): %s", + exit_code, map_windows32_error_to_string(exit_code)); + + /* signal */ + exit_sig = process_signal(hPID); + + /* cleanup process */ + process_cleanup(hPID); + + coredump = 0; + } + pid = (pid_t) hPID; + } +#endif /* WINDOWS32 */ + } + + /* Check if this is the child of the `shell' function. */ + if (!remote && pid == shell_function_pid) + { + /* It is. Leave an indicator for the `shell' function. */ + if (exit_sig == 0 && exit_code == 127) + shell_function_completed = -1; + else + shell_function_completed = 1; + break; + } + + child_failed = exit_sig != 0 || exit_code != 0; + + /* Search for a child matching the deceased one. */ + lastc = 0; + for (c = children; c != 0; lastc = c, c = c->next) + if (c->remote == remote && c->pid == pid) + break; + + if (c == 0) + /* An unknown child died. + Ignore it; it was inherited from our invoker. */ + continue; + + DB (DB_JOBS, (child_failed + ? _("Reaping losing child %p PID %s %s\n") + : _("Reaping winning child %p PID %s %s\n"), + c, pid2str (c->pid), c->remote ? _(" (remote)") : "")); + + if (c->sh_batch_file) { + DB (DB_JOBS, (_("Cleaning up temp batch file %s\n"), + c->sh_batch_file)); + + /* just try and remove, don't care if this fails */ + remove (c->sh_batch_file); + + /* all done with memory */ + free (c->sh_batch_file); + c->sh_batch_file = NULL; + } + + /* If this child had the good stdin, say it is now free. */ + if (c->good_stdin) + good_stdin_used = 0; + + dontcare = c->dontcare; + + if (child_failed && !c->noerror && !ignore_errors_flag) + { + /* The commands failed. Write an error message, + delete non-precious targets, and abort. */ + static int delete_on_error = -1; + + if (!dontcare) + child_error (c->file->name, exit_code, exit_sig, coredump, 0); + + c->file->update_status = 2; + if (delete_on_error == -1) + { + struct file *f = lookup_file (".DELETE_ON_ERROR"); + delete_on_error = f != 0 && f->is_target; + } + if (exit_sig != 0 || delete_on_error) + delete_child_targets (c); + } + else + { + if (child_failed) + { + /* The commands failed, but we don't care. */ + child_error (c->file->name, + exit_code, exit_sig, coredump, 1); + child_failed = 0; + } + + /* If there are more commands to run, try to start them. */ + if (job_next_command (c)) + { + if (handling_fatal_signal) + { + /* Never start new commands while we are dying. + Since there are more commands that wanted to be run, + the target was not completely remade. So we treat + this as if a command had failed. */ + c->file->update_status = 2; + } + else + { + /* Check again whether to start remotely. + Whether or not we want to changes over time. + Also, start_remote_job may need state set up + by start_remote_job_p. */ + c->remote = start_remote_job_p (0); + start_job_command (c); + /* Fatal signals are left blocked in case we were + about to put that child on the chain. But it is + already there, so it is safe for a fatal signal to + arrive now; it will clean up this child's targets. */ + unblock_sigs (); + if (c->file->command_state == cs_running) + /* We successfully started the new command. + Loop to reap more children. */ + continue; + } + + if (c->file->update_status != 0) + /* We failed to start the commands. */ + delete_child_targets (c); + } + else + /* There are no more commands. We got through them all + without an unignored error. Now the target has been + successfully updated. */ + c->file->update_status = 0; + } + + /* When we get here, all the commands for C->file are finished + (or aborted) and C->file->update_status contains 0 or 2. But + C->file->command_state is still cs_running if all the commands + ran; notice_finish_file looks for cs_running to tell it that + it's interesting to check the file's modtime again now. */ + + if (! handling_fatal_signal) + /* Notice if the target of the commands has been changed. + This also propagates its values for command_state and + update_status to its also_make files. */ + notice_finished_file (c->file); + + DB (DB_JOBS, (_("Removing child %p PID %s%s from chain.\n"), + c, pid2str (c->pid), c->remote ? _(" (remote)") : "")); + + /* Block fatal signals while frobnicating the list, so that + children and job_slots_used are always consistent. Otherwise + a fatal signal arriving after the child is off the chain and + before job_slots_used is decremented would believe a child was + live and call reap_children again. */ + block_sigs (); + + /* There is now another slot open. */ + if (job_slots_used > 0) + --job_slots_used; + + /* Remove the child from the chain and free it. */ + if (lastc == 0) + children = c->next; + else + lastc->next = c->next; + + free_child (c); + + unblock_sigs (); + + /* If the job failed, and the -k flag was not given, die, + unless we are already in the process of dying. */ + if (!err && child_failed && !dontcare && !keep_going_flag && + /* fatal_error_signal will die with the right signal. */ + !handling_fatal_signal) + die (2); + + /* Only block for one child. */ + block = 0; + } + + return; +} + +/* Free the storage allocated for CHILD. */ + +static void +free_child (struct child *child) +{ + if (!jobserver_tokens) + fatal (NILF, "INTERNAL: Freeing child %p (%s) but no tokens left!\n", + child, child->file->name); + + /* If we're using the jobserver and this child is not the only outstanding + job, put a token back into the pipe for it. */ + + if (job_fds[1] >= 0 && jobserver_tokens > 1) + { + char token = '+'; + int r; + + /* Write a job token back to the pipe. */ + + EINTRLOOP (r, write (job_fds[1], &token, 1)); + if (r != 1) + pfatal_with_name (_("write jobserver")); + + DB (DB_JOBS, (_("Released token for child %p (%s).\n"), + child, child->file->name)); + } + + --jobserver_tokens; + + if (handling_fatal_signal) /* Don't bother free'ing if about to die. */ + return; + + if (child->command_lines != 0) + { + register unsigned int i; + for (i = 0; i < child->file->cmds->ncommand_lines; ++i) + free (child->command_lines[i]); + free (child->command_lines); + } + + if (child->environment != 0) + { + register char **ep = child->environment; + while (*ep != 0) + free (*ep++); + free (child->environment); + } + + free (child); +} + +#ifdef POSIX +extern sigset_t fatal_signal_set; +#endif + +void +block_sigs (void) +{ +#ifdef POSIX + (void) sigprocmask (SIG_BLOCK, &fatal_signal_set, (sigset_t *) 0); +#else +# ifdef HAVE_SIGSETMASK + (void) sigblock (fatal_signal_mask); +# endif +#endif +} + +#ifdef POSIX +void +unblock_sigs (void) +{ + sigset_t empty; + sigemptyset (&empty); + sigprocmask (SIG_SETMASK, &empty, (sigset_t *) 0); +} +#endif + +#ifdef MAKE_JOBSERVER +RETSIGTYPE +job_noop (int sig UNUSED) +{ +} +/* Set the child handler action flags to FLAGS. */ +static void +set_child_handler_action_flags (int set_handler, int set_alarm) +{ + struct sigaction sa; + +#ifdef __EMX__ + /* The child handler must be turned off here. */ + signal (SIGCHLD, SIG_DFL); +#endif + + memset (&sa, '\0', sizeof sa); + sa.sa_handler = child_handler; + sa.sa_flags = set_handler ? 0 : SA_RESTART; +#if defined SIGCHLD + sigaction (SIGCHLD, &sa, NULL); +#endif +#if defined SIGCLD && SIGCLD != SIGCHLD + sigaction (SIGCLD, &sa, NULL); +#endif +#if defined SIGALRM + if (set_alarm) + { + /* If we're about to enter the read(), set an alarm to wake up in a + second so we can check if the load has dropped and we can start more + work. On the way out, turn off the alarm and set SIG_DFL. */ + alarm (set_handler ? 1 : 0); + sa.sa_handler = set_handler ? job_noop : SIG_DFL; + sa.sa_flags = 0; + sigaction (SIGALRM, &sa, NULL); + } +#endif +} +#endif + + +/* Start a job to run the commands specified in CHILD. + CHILD is updated to reflect the commands and ID of the child process. + + NOTE: On return fatal signals are blocked! The caller is responsible + for calling `unblock_sigs', once the new child is safely on the chain so + it can be cleaned up in the event of a fatal signal. */ + +static void +start_job_command (struct child *child) +{ +#if !defined(_AMIGA) && !defined(WINDOWS32) + static int bad_stdin = -1; +#endif + char *p; + /* Must be volatile to silence bogus GCC warning about longjmp/vfork. */ + volatile int flags; +#ifdef VMS + char *argv; +#else + char **argv; +#endif + + /* If we have a completely empty commandset, stop now. */ + if (!child->command_ptr) + goto next_command; + + /* Combine the flags parsed for the line itself with + the flags specified globally for this target. */ + flags = (child->file->command_flags + | child->file->cmds->lines_flags[child->command_line - 1]); + + p = child->command_ptr; + child->noerror = ((flags & COMMANDS_NOERROR) != 0); + + while (*p != '\0') + { + if (*p == '@') + flags |= COMMANDS_SILENT; + else if (*p == '+') + flags |= COMMANDS_RECURSE; + else if (*p == '-') + child->noerror = 1; + else if (!isblank ((unsigned char)*p)) + break; + ++p; + } + + /* Update the file's command flags with any new ones we found. We only + keep the COMMANDS_RECURSE setting. Even this isn't 100% correct; we are + now marking more commands recursive than should be in the case of + multiline define/endef scripts where only one line is marked "+". In + order to really fix this, we'll have to keep a lines_flags for every + actual line, after expansion. */ + child->file->cmds->lines_flags[child->command_line - 1] + |= flags & COMMANDS_RECURSE; + + /* Figure out an argument list from this command line. */ + + { + char *end = 0; +#ifdef VMS + argv = p; +#else + argv = construct_command_argv (p, &end, child->file, + child->file->cmds->lines_flags[child->command_line - 1], + &child->sh_batch_file); +#endif + if (end == NULL) + child->command_ptr = NULL; + else + { + *end++ = '\0'; + child->command_ptr = end; + } + } + + /* If -q was given, say that updating `failed' if there was any text on the + command line, or `succeeded' otherwise. The exit status of 1 tells the + user that -q is saying `something to do'; the exit status for a random + error is 2. */ + if (argv != 0 && question_flag && !(flags & COMMANDS_RECURSE)) + { +#ifndef VMS + free (argv[0]); + free (argv); +#endif + child->file->update_status = 1; + notice_finished_file (child->file); + return; + } + + if (touch_flag && !(flags & COMMANDS_RECURSE)) + { + /* Go on to the next command. It might be the recursive one. + We construct ARGV only to find the end of the command line. */ +#ifndef VMS + if (argv) + { + free (argv[0]); + free (argv); + } +#endif + argv = 0; + } + + if (argv == 0) + { + next_command: +#ifdef __MSDOS__ + execute_by_shell = 0; /* in case construct_command_argv sets it */ +#endif + /* This line has no commands. Go to the next. */ + if (job_next_command (child)) + start_job_command (child); + else + { + /* No more commands. Make sure we're "running"; we might not be if + (e.g.) all commands were skipped due to -n. */ + set_command_state (child->file, cs_running); + child->file->update_status = 0; + notice_finished_file (child->file); + } + return; + } + + /* Print out the command. If silent, we call `message' with null so it + can log the working directory before the command's own error messages + appear. */ + + message (0, (just_print_flag || (!(flags & COMMANDS_SILENT) && !silent_flag)) + ? "%s" : (char *) 0, p); + + /* Tell update_goal_chain that a command has been started on behalf of + this target. It is important that this happens here and not in + reap_children (where we used to do it), because reap_children might be + reaping children from a different target. We want this increment to + guaranteedly indicate that a command was started for the dependency + chain (i.e., update_file recursion chain) we are processing. */ + + ++commands_started; + + /* Optimize an empty command. People use this for timestamp rules, + so avoid forking a useless shell. Do this after we increment + commands_started so make still treats this special case as if it + performed some action (makes a difference as to what messages are + printed, etc. */ + +#if !defined(VMS) && !defined(_AMIGA) + if ( +#if defined __MSDOS__ || defined (__EMX__) + unixy_shell /* the test is complicated and we already did it */ +#else + (argv[0] && is_bourne_compatible_shell(argv[0])) +#endif + && (argv[1] && argv[1][0] == '-' + && + ((argv[1][1] == 'c' && argv[1][2] == '\0') + || + (argv[1][1] == 'e' && argv[1][2] == 'c' && argv[1][3] == '\0'))) + && (argv[2] && argv[2][0] == ':' && argv[2][1] == '\0') + && argv[3] == NULL) + { + free (argv[0]); + free (argv); + goto next_command; + } +#endif /* !VMS && !_AMIGA */ + + /* If -n was given, recurse to get the next line in the sequence. */ + + if (just_print_flag && !(flags & COMMANDS_RECURSE)) + { +#ifndef VMS + free (argv[0]); + free (argv); +#endif + goto next_command; + } + + /* Flush the output streams so they won't have things written twice. */ + + fflush (stdout); + fflush (stderr); + +#ifndef VMS +#if !defined(WINDOWS32) && !defined(_AMIGA) && !defined(__MSDOS__) + + /* Set up a bad standard input that reads from a broken pipe. */ + + if (bad_stdin == -1) + { + /* Make a file descriptor that is the read end of a broken pipe. + This will be used for some children's standard inputs. */ + int pd[2]; + if (pipe (pd) == 0) + { + /* Close the write side. */ + (void) close (pd[1]); + /* Save the read side. */ + bad_stdin = pd[0]; + + /* Set the descriptor to close on exec, so it does not litter any + child's descriptor table. When it is dup2'd onto descriptor 0, + that descriptor will not close on exec. */ + CLOSE_ON_EXEC (bad_stdin); + } + } + +#endif /* !WINDOWS32 && !_AMIGA && !__MSDOS__ */ + + /* Decide whether to give this child the `good' standard input + (one that points to the terminal or whatever), or the `bad' one + that points to the read side of a broken pipe. */ + + child->good_stdin = !good_stdin_used; + if (child->good_stdin) + good_stdin_used = 1; + +#endif /* !VMS */ + + child->deleted = 0; + +#ifndef _AMIGA + /* Set up the environment for the child. */ + if (child->environment == 0) + child->environment = target_environment (child->file); +#endif + +#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32) + +#ifndef VMS + /* start_waiting_job has set CHILD->remote if we can start a remote job. */ + if (child->remote) + { + int is_remote, id, used_stdin; + if (start_remote_job (argv, child->environment, + child->good_stdin ? 0 : bad_stdin, + &is_remote, &id, &used_stdin)) + /* Don't give up; remote execution may fail for various reasons. If + so, simply run the job locally. */ + goto run_local; + else + { + if (child->good_stdin && !used_stdin) + { + child->good_stdin = 0; + good_stdin_used = 0; + } + child->remote = is_remote; + child->pid = id; + } + } + else +#endif /* !VMS */ + { + /* Fork the child process. */ + + char **parent_environ; + + run_local: + block_sigs (); + + child->remote = 0; + +#ifdef VMS + if (!child_execute_job (argv, child)) { + /* Fork failed! */ + perror_with_name ("vfork", ""); + goto error; + } + +#else + + parent_environ = environ; + +# ifdef __EMX__ + /* If we aren't running a recursive command and we have a jobserver + pipe, close it before exec'ing. */ + if (!(flags & COMMANDS_RECURSE) && job_fds[0] >= 0) + { + CLOSE_ON_EXEC (job_fds[0]); + CLOSE_ON_EXEC (job_fds[1]); + } + if (job_rfd >= 0) + CLOSE_ON_EXEC (job_rfd); + + /* Never use fork()/exec() here! Use spawn() instead in exec_command() */ + child->pid = child_execute_job (child->good_stdin ? 0 : bad_stdin, 1, + argv, child->environment); + if (child->pid < 0) + { + /* spawn failed! */ + unblock_sigs (); + perror_with_name ("spawn", ""); + goto error; + } + + /* undo CLOSE_ON_EXEC() after the child process has been started */ + if (!(flags & COMMANDS_RECURSE) && job_fds[0] >= 0) + { + fcntl (job_fds[0], F_SETFD, 0); + fcntl (job_fds[1], F_SETFD, 0); + } + if (job_rfd >= 0) + fcntl (job_rfd, F_SETFD, 0); + +#else /* !__EMX__ */ + + child->pid = vfork (); + environ = parent_environ; /* Restore value child may have clobbered. */ + if (child->pid == 0) + { + /* We are the child side. */ + unblock_sigs (); + + /* If we aren't running a recursive command and we have a jobserver + pipe, close it before exec'ing. */ + if (!(flags & COMMANDS_RECURSE) && job_fds[0] >= 0) + { + close (job_fds[0]); + close (job_fds[1]); + } + if (job_rfd >= 0) + close (job_rfd); + +#ifdef SET_STACK_SIZE + /* Reset limits, if necessary. */ + if (stack_limit.rlim_cur) + setrlimit (RLIMIT_STACK, &stack_limit); +#endif + + child_execute_job (child->good_stdin ? 0 : bad_stdin, 1, + argv, child->environment); + } + else if (child->pid < 0) + { + /* Fork failed! */ + unblock_sigs (); + perror_with_name ("vfork", ""); + goto error; + } +# endif /* !__EMX__ */ +#endif /* !VMS */ + } + +#else /* __MSDOS__ or Amiga or WINDOWS32 */ +#ifdef __MSDOS__ + { + int proc_return; + + block_sigs (); + dos_status = 0; + + /* We call `system' to do the job of the SHELL, since stock DOS + shell is too dumb. Our `system' knows how to handle long + command lines even if pipes/redirection is needed; it will only + call COMMAND.COM when its internal commands are used. */ + if (execute_by_shell) + { + char *cmdline = argv[0]; + /* We don't have a way to pass environment to `system', + so we need to save and restore ours, sigh... */ + char **parent_environ = environ; + + environ = child->environment; + + /* If we have a *real* shell, tell `system' to call + it to do everything for us. */ + if (unixy_shell) + { + /* A *real* shell on MSDOS may not support long + command lines the DJGPP way, so we must use `system'. */ + cmdline = argv[2]; /* get past "shell -c" */ + } + + dos_command_running = 1; + proc_return = system (cmdline); + environ = parent_environ; + execute_by_shell = 0; /* for the next time */ + } + else + { + dos_command_running = 1; + proc_return = spawnvpe (P_WAIT, argv[0], argv, child->environment); + } + + /* Need to unblock signals before turning off + dos_command_running, so that child's signals + will be treated as such (see fatal_error_signal). */ + unblock_sigs (); + dos_command_running = 0; + + /* If the child got a signal, dos_status has its + high 8 bits set, so be careful not to alter them. */ + if (proc_return == -1) + dos_status |= 0xff; + else + dos_status |= (proc_return & 0xff); + ++dead_children; + child->pid = dos_pid++; + } +#endif /* __MSDOS__ */ +#ifdef _AMIGA + amiga_status = MyExecute (argv); + + ++dead_children; + child->pid = amiga_pid++; + if (amiga_batch_file) + { + amiga_batch_file = 0; + DeleteFile (amiga_bname); /* Ignore errors. */ + } +#endif /* Amiga */ +#ifdef WINDOWS32 + { + HANDLE hPID; + char* arg0; + + /* make UNC paths safe for CreateProcess -- backslash format */ + arg0 = argv[0]; + if (arg0 && arg0[0] == '/' && arg0[1] == '/') + for ( ; arg0 && *arg0; arg0++) + if (*arg0 == '/') + *arg0 = '\\'; + + /* make sure CreateProcess() has Path it needs */ + sync_Path_environment(); + + hPID = process_easy(argv, child->environment); + + if (hPID != INVALID_HANDLE_VALUE) + child->pid = (pid_t) hPID; + else { + int i; + unblock_sigs(); + fprintf(stderr, + _("process_easy() failed to launch process (e=%ld)\n"), + process_last_err(hPID)); + for (i = 0; argv[i]; i++) + fprintf(stderr, "%s ", argv[i]); + fprintf(stderr, _("\nCounted %d args in failed launch\n"), i); + goto error; + } + } +#endif /* WINDOWS32 */ +#endif /* __MSDOS__ or Amiga or WINDOWS32 */ + + /* Bump the number of jobs started in this second. */ + ++job_counter; + + /* We are the parent side. Set the state to + say the commands are running and return. */ + + set_command_state (child->file, cs_running); + + /* Free the storage used by the child's argument list. */ +#ifndef VMS + free (argv[0]); + free (argv); +#endif + + return; + + error: + child->file->update_status = 2; + notice_finished_file (child->file); + return; +} + +/* Try to start a child running. + Returns nonzero if the child was started (and maybe finished), or zero if + the load was too high and the child was put on the `waiting_jobs' chain. */ + +static int +start_waiting_job (struct child *c) +{ + struct file *f = c->file; + + /* If we can start a job remotely, we always want to, and don't care about + the local load average. We record that the job should be started + remotely in C->remote for start_job_command to test. */ + + c->remote = start_remote_job_p (1); + + /* If we are running at least one job already and the load average + is too high, make this one wait. */ + if (!c->remote + && ((job_slots_used > 0 && load_too_high ()) +#ifdef WINDOWS32 + || (process_used_slots () >= MAXIMUM_WAIT_OBJECTS) +#endif + )) + { + /* Put this child on the chain of children waiting for the load average + to go down. */ + set_command_state (f, cs_running); + c->next = waiting_jobs; + waiting_jobs = c; + return 0; + } + + /* Start the first command; reap_children will run later command lines. */ + start_job_command (c); + + switch (f->command_state) + { + case cs_running: + c->next = children; + DB (DB_JOBS, (_("Putting child %p (%s) PID %s%s on the chain.\n"), + c, c->file->name, pid2str (c->pid), + c->remote ? _(" (remote)") : "")); + children = c; + /* One more job slot is in use. */ + ++job_slots_used; + unblock_sigs (); + break; + + case cs_not_started: + /* All the command lines turned out to be empty. */ + f->update_status = 0; + /* FALLTHROUGH */ + + case cs_finished: + notice_finished_file (f); + free_child (c); + break; + + default: + assert (f->command_state == cs_finished); + break; + } + + return 1; +} + +/* Create a `struct child' for FILE and start its commands running. */ + +void +new_job (struct file *file) +{ + struct commands *cmds = file->cmds; + struct child *c; + char **lines; + unsigned int i; + + /* Let any previously decided-upon jobs that are waiting + for the load to go down start before this new one. */ + start_waiting_jobs (); + + /* Reap any children that might have finished recently. */ + reap_children (0, 0); + + /* Chop the commands up into lines if they aren't already. */ + chop_commands (cmds); + + /* Expand the command lines and store the results in LINES. */ + lines = xmalloc (cmds->ncommand_lines * sizeof (char *)); + for (i = 0; i < cmds->ncommand_lines; ++i) + { + /* Collapse backslash-newline combinations that are inside variable + or function references. These are left alone by the parser so + that they will appear in the echoing of commands (where they look + nice); and collapsed by construct_command_argv when it tokenizes. + But letting them survive inside function invocations loses because + we don't want the functions to see them as part of the text. */ + + char *in, *out, *ref; + + /* IN points to where in the line we are scanning. + OUT points to where in the line we are writing. + When we collapse a backslash-newline combination, + IN gets ahead of OUT. */ + + in = out = cmds->command_lines[i]; + while ((ref = strchr (in, '$')) != 0) + { + ++ref; /* Move past the $. */ + + if (out != in) + /* Copy the text between the end of the last chunk + we processed (where IN points) and the new chunk + we are about to process (where REF points). */ + memmove (out, in, ref - in); + + /* Move both pointers past the boring stuff. */ + out += ref - in; + in = ref; + + if (*ref == '(' || *ref == '{') + { + char openparen = *ref; + char closeparen = openparen == '(' ? ')' : '}'; + int count; + char *p; + + *out++ = *in++; /* Copy OPENPAREN. */ + /* IN now points past the opening paren or brace. + Count parens or braces until it is matched. */ + count = 0; + while (*in != '\0') + { + if (*in == closeparen && --count < 0) + break; + else if (*in == '\\' && in[1] == '\n') + { + /* We have found a backslash-newline inside a + variable or function reference. Eat it and + any following whitespace. */ + + int quoted = 0; + for (p = in - 1; p > ref && *p == '\\'; --p) + quoted = !quoted; + + if (quoted) + /* There were two or more backslashes, so this is + not really a continuation line. We don't collapse + the quoting backslashes here as is done in + collapse_continuations, because the line will + be collapsed again after expansion. */ + *out++ = *in++; + else + { + /* Skip the backslash, newline and + any following whitespace. */ + in = next_token (in + 2); + + /* Discard any preceding whitespace that has + already been written to the output. */ + while (out > ref + && isblank ((unsigned char)out[-1])) + --out; + + /* Replace it all with a single space. */ + *out++ = ' '; + } + } + else + { + if (*in == openparen) + ++count; + + *out++ = *in++; + } + } + } + } + + /* There are no more references in this line to worry about. + Copy the remaining uninteresting text to the output. */ + if (out != in) + memmove (out, in, strlen (in) + 1); + + /* Finally, expand the line. */ + lines[i] = allocated_variable_expand_for_file (cmds->command_lines[i], + file); + } + + /* Start the command sequence, record it in a new + `struct child', and add that to the chain. */ + + c = xcalloc (sizeof (struct child)); + c->file = file; + c->command_lines = lines; + c->sh_batch_file = NULL; + + /* Cache dontcare flag because file->dontcare can be changed once we + return. Check dontcare inheritance mechanism for details. */ + c->dontcare = file->dontcare; + + /* Fetch the first command line to be run. */ + job_next_command (c); + + /* Wait for a job slot to be freed up. If we allow an infinite number + don't bother; also job_slots will == 0 if we're using the jobserver. */ + + if (job_slots != 0) + while (job_slots_used == job_slots) + reap_children (1, 0); + +#ifdef MAKE_JOBSERVER + /* If we are controlling multiple jobs make sure we have a token before + starting the child. */ + + /* This can be inefficient. There's a decent chance that this job won't + actually have to run any subprocesses: the command script may be empty + or otherwise optimized away. It would be nice if we could defer + obtaining a token until just before we need it, in start_job_command. + To do that we'd need to keep track of whether we'd already obtained a + token (since start_job_command is called for each line of the job, not + just once). Also more thought needs to go into the entire algorithm; + this is where the old parallel job code waits, so... */ + + else if (job_fds[0] >= 0) + while (1) + { + char token; + int got_token; + int saved_errno; + + DB (DB_JOBS, ("Need a job token; we %shave children\n", + children ? "" : "don't ")); + + /* If we don't already have a job started, use our "free" token. */ + if (!jobserver_tokens) + break; + + /* Read a token. As long as there's no token available we'll block. + We enable interruptible system calls before the read(2) so that if + we get a SIGCHLD while we're waiting, we'll return with EINTR and + we can process the death(s) and return tokens to the free pool. + + Once we return from the read, we immediately reinstate restartable + system calls. This allows us to not worry about checking for + EINTR on all the other system calls in the program. + + There is one other twist: there is a span between the time + reap_children() does its last check for dead children and the time + the read(2) call is entered, below, where if a child dies we won't + notice. This is extremely serious as it could cause us to + deadlock, given the right set of events. + + To avoid this, we do the following: before we reap_children(), we + dup(2) the read FD on the jobserver pipe. The read(2) call below + uses that new FD. In the signal handler, we close that FD. That + way, if a child dies during the section mentioned above, the + read(2) will be invoked with an invalid FD and will return + immediately with EBADF. */ + + /* Make sure we have a dup'd FD. */ + if (job_rfd < 0) + { + DB (DB_JOBS, ("Duplicate the job FD\n")); + job_rfd = dup (job_fds[0]); + } + + /* Reap anything that's currently waiting. */ + reap_children (0, 0); + + /* Kick off any jobs we have waiting for an opportunity that + can run now (ie waiting for load). */ + start_waiting_jobs (); + + /* If our "free" slot has become available, use it; we don't need an + actual token. */ + if (!jobserver_tokens) + break; + + /* There must be at least one child already, or we have no business + waiting for a token. */ + if (!children) + fatal (NILF, "INTERNAL: no children as we go to sleep on read\n"); + + /* Set interruptible system calls, and read() for a job token. */ + set_child_handler_action_flags (1, waiting_jobs != NULL); + got_token = read (job_rfd, &token, 1); + saved_errno = errno; + set_child_handler_action_flags (0, waiting_jobs != NULL); + + /* If we got one, we're done here. */ + if (got_token == 1) + { + DB (DB_JOBS, (_("Obtained token for child %p (%s).\n"), + c, c->file->name)); + break; + } + + /* If the error _wasn't_ expected (EINTR or EBADF), punt. Otherwise, + go back and reap_children(), and try again. */ + errno = saved_errno; + if (errno != EINTR && errno != EBADF) + pfatal_with_name (_("read jobs pipe")); + if (errno == EBADF) + DB (DB_JOBS, ("Read returned EBADF.\n")); + } +#endif + + ++jobserver_tokens; + + /* The job is now primed. Start it running. + (This will notice if there is in fact no recipe.) */ + if (cmds->fileinfo.filenm) + DB (DB_BASIC, (_("Invoking recipe from %s:%lu to update target `%s'.\n"), + cmds->fileinfo.filenm, cmds->fileinfo.lineno, + c->file->name)); + else + DB (DB_BASIC, (_("Invoking builtin recipe to update target `%s'.\n"), + c->file->name)); + + + start_waiting_job (c); + + if (job_slots == 1 || not_parallel) + /* Since there is only one job slot, make things run linearly. + Wait for the child to die, setting the state to `cs_finished'. */ + while (file->command_state == cs_running) + reap_children (1, 0); + + return; +} + +/* Move CHILD's pointers to the next command for it to execute. + Returns nonzero if there is another command. */ + +static int +job_next_command (struct child *child) +{ + while (child->command_ptr == 0 || *child->command_ptr == '\0') + { + /* There are no more lines in the expansion of this line. */ + if (child->command_line == child->file->cmds->ncommand_lines) + { + /* There are no more lines to be expanded. */ + child->command_ptr = 0; + return 0; + } + else + /* Get the next line to run. */ + child->command_ptr = child->command_lines[child->command_line++]; + } + return 1; +} + +/* Determine if the load average on the system is too high to start a new job. + The real system load average is only recomputed once a second. However, a + very parallel make can easily start tens or even hundreds of jobs in a + second, which brings the system to its knees for a while until that first + batch of jobs clears out. + + To avoid this we use a weighted algorithm to try to account for jobs which + have been started since the last second, and guess what the load average + would be now if it were computed. + + This algorithm was provided by Thomas Riedl , + who writes: + +! calculate something load-oid and add to the observed sys.load, +! so that latter can catch up: +! - every job started increases jobctr; +! - every dying job decreases a positive jobctr; +! - the jobctr value gets zeroed every change of seconds, +! after its value*weight_b is stored into the 'backlog' value last_sec +! - weight_a times the sum of jobctr and last_sec gets +! added to the observed sys.load. +! +! The two weights have been tried out on 24 and 48 proc. Sun Solaris-9 +! machines, using a several-thousand-jobs-mix of cpp, cc, cxx and smallish +! sub-shelled commands (rm, echo, sed...) for tests. +! lowering the 'direct influence' factor weight_a (e.g. to 0.1) +! resulted in significant excession of the load limit, raising it +! (e.g. to 0.5) took bad to small, fast-executing jobs and didn't +! reach the limit in most test cases. +! +! lowering the 'history influence' weight_b (e.g. to 0.1) resulted in +! exceeding the limit for longer-running stuff (compile jobs in +! the .5 to 1.5 sec. range),raising it (e.g. to 0.5) overrepresented +! small jobs' effects. + + */ + +#define LOAD_WEIGHT_A 0.25 +#define LOAD_WEIGHT_B 0.25 + +static int +load_too_high (void) +{ +#if defined(__MSDOS__) || defined(VMS) || defined(_AMIGA) || defined(__riscos__) + return 1; +#else + static double last_sec; + static time_t last_now; + double load, guess; + time_t now; + +#ifdef WINDOWS32 + /* sub_proc.c cannot wait for more than MAXIMUM_WAIT_OBJECTS children */ + if (process_used_slots () >= MAXIMUM_WAIT_OBJECTS) + return 1; +#endif + + if (max_load_average < 0) + return 0; + + /* Find the real system load average. */ + make_access (); + if (getloadavg (&load, 1) != 1) + { + static int lossage = -1; + /* Complain only once for the same error. */ + if (lossage == -1 || errno != lossage) + { + if (errno == 0) + /* An errno value of zero means getloadavg is just unsupported. */ + error (NILF, + _("cannot enforce load limits on this operating system")); + else + perror_with_name (_("cannot enforce load limit: "), "getloadavg"); + } + lossage = errno; + load = 0; + } + user_access (); + + /* If we're in a new second zero the counter and correct the backlog + value. Only keep the backlog for one extra second; after that it's 0. */ + now = time (NULL); + if (last_now < now) + { + if (last_now == now - 1) + last_sec = LOAD_WEIGHT_B * job_counter; + else + last_sec = 0.0; + + job_counter = 0; + last_now = now; + } + + /* Try to guess what the load would be right now. */ + guess = load + (LOAD_WEIGHT_A * (job_counter + last_sec)); + + DB (DB_JOBS, ("Estimated system load = %f (actual = %f) (max requested = %f)\n", + guess, load, max_load_average)); + + return guess >= max_load_average; +#endif +} + +/* Start jobs that are waiting for the load to be lower. */ + +void +start_waiting_jobs (void) +{ + struct child *job; + + if (waiting_jobs == 0) + return; + + do + { + /* Check for recently deceased descendants. */ + reap_children (0, 0); + + /* Take a job off the waiting list. */ + job = waiting_jobs; + waiting_jobs = job->next; + + /* Try to start that job. We break out of the loop as soon + as start_waiting_job puts one back on the waiting list. */ + } + while (start_waiting_job (job) && waiting_jobs != 0); + + return; +} + +#ifndef WINDOWS32 + +/* EMX: Start a child process. This function returns the new pid. */ +# if defined __EMX__ +int +child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp) +{ + int pid; + /* stdin_fd == 0 means: nothing to do for stdin; + stdout_fd == 1 means: nothing to do for stdout */ + int save_stdin = (stdin_fd != 0) ? dup (0) : 0; + int save_stdout = (stdout_fd != 1) ? dup (1): 1; + + /* < 0 only if dup() failed */ + if (save_stdin < 0) + fatal (NILF, _("no more file handles: could not duplicate stdin\n")); + if (save_stdout < 0) + fatal (NILF, _("no more file handles: could not duplicate stdout\n")); + + /* Close unnecessary file handles for the child. */ + if (save_stdin != 0) + CLOSE_ON_EXEC (save_stdin); + if (save_stdout != 1) + CLOSE_ON_EXEC (save_stdout); + + /* Connect the pipes to the child process. */ + if (stdin_fd != 0) + (void) dup2 (stdin_fd, 0); + if (stdout_fd != 1) + (void) dup2 (stdout_fd, 1); + + /* stdin_fd and stdout_fd must be closed on exit because we are + still in the parent process */ + if (stdin_fd != 0) + CLOSE_ON_EXEC (stdin_fd); + if (stdout_fd != 1) + CLOSE_ON_EXEC (stdout_fd); + + /* Run the command. */ + pid = exec_command (argv, envp); + + /* Restore stdout/stdin of the parent and close temporary FDs. */ + if (stdin_fd != 0) + { + if (dup2 (save_stdin, 0) != 0) + fatal (NILF, _("Could not restore stdin\n")); + else + close (save_stdin); + } + + if (stdout_fd != 1) + { + if (dup2 (save_stdout, 1) != 1) + fatal (NILF, _("Could not restore stdout\n")); + else + close (save_stdout); + } + + return pid; +} + +#elif !defined (_AMIGA) && !defined (__MSDOS__) && !defined (VMS) + +/* UNIX: + Replace the current process with one executing the command in ARGV. + STDIN_FD and STDOUT_FD are used as the process's stdin and stdout; ENVP is + the environment of the new program. This function does not return. */ +void +child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp) +{ + if (stdin_fd != 0) + (void) dup2 (stdin_fd, 0); + if (stdout_fd != 1) + (void) dup2 (stdout_fd, 1); + if (stdin_fd != 0) + (void) close (stdin_fd); + if (stdout_fd != 1) + (void) close (stdout_fd); + + /* Run the command. */ + exec_command (argv, envp); +} +#endif /* !AMIGA && !__MSDOS__ && !VMS */ +#endif /* !WINDOWS32 */ + +#ifndef _AMIGA +/* Replace the current process with one running the command in ARGV, + with environment ENVP. This function does not return. */ + +/* EMX: This function returns the pid of the child process. */ +# ifdef __EMX__ +int +# else +void +# endif +exec_command (char **argv, char **envp) +{ +#ifdef VMS + /* to work around a problem with signals and execve: ignore them */ +#ifdef SIGCHLD + signal (SIGCHLD,SIG_IGN); +#endif + /* Run the program. */ + execve (argv[0], argv, envp); + perror_with_name ("execve: ", argv[0]); + _exit (EXIT_FAILURE); +#else +#ifdef WINDOWS32 + HANDLE hPID; + HANDLE hWaitPID; + int err = 0; + int exit_code = EXIT_FAILURE; + + /* make sure CreateProcess() has Path it needs */ + sync_Path_environment(); + + /* launch command */ + hPID = process_easy(argv, envp); + + /* make sure launch ok */ + if (hPID == INVALID_HANDLE_VALUE) + { + int i; + fprintf(stderr, + _("process_easy() failed to launch process (e=%ld)\n"), + process_last_err(hPID)); + for (i = 0; argv[i]; i++) + fprintf(stderr, "%s ", argv[i]); + fprintf(stderr, _("\nCounted %d args in failed launch\n"), i); + exit(EXIT_FAILURE); + } + + /* wait and reap last child */ + hWaitPID = process_wait_for_any(); + while (hWaitPID) + { + /* was an error found on this process? */ + err = process_last_err(hWaitPID); + + /* get exit data */ + exit_code = process_exit_code(hWaitPID); + + if (err) + fprintf(stderr, "make (e=%d, rc=%d): %s", + err, exit_code, map_windows32_error_to_string(err)); + + /* cleanup process */ + process_cleanup(hWaitPID); + + /* expect to find only last pid, warn about other pids reaped */ + if (hWaitPID == hPID) + break; + else + { + char *pidstr = xstrdup (pid2str ((pid_t)hWaitPID)); + + fprintf(stderr, + _("make reaped child pid %s, still waiting for pid %s\n"), + pidstr, pid2str ((pid_t)hPID)); + free (pidstr); + } + } + + /* return child's exit code as our exit code */ + exit(exit_code); + +#else /* !WINDOWS32 */ + +# ifdef __EMX__ + int pid; +# endif + + /* Be the user, permanently. */ + child_access (); + +# ifdef __EMX__ + + /* Run the program. */ + pid = spawnvpe (P_NOWAIT, argv[0], argv, envp); + + if (pid >= 0) + return pid; + + /* the file might have a strange shell extension */ + if (errno == ENOENT) + errno = ENOEXEC; + +# else + + /* Run the program. */ + environ = envp; + execvp (argv[0], argv); + +# endif /* !__EMX__ */ + + switch (errno) + { + case ENOENT: + error (NILF, _("%s: Command not found"), argv[0]); + break; + case ENOEXEC: + { + /* The file is not executable. Try it as a shell script. */ + extern char *getenv (); + char *shell; + char **new_argv; + int argc; + int i=1; + +# ifdef __EMX__ + /* Do not use $SHELL from the environment */ + struct variable *p = lookup_variable ("SHELL", 5); + if (p) + shell = p->value; + else + shell = 0; +# else + shell = getenv ("SHELL"); +# endif + if (shell == 0) + shell = default_shell; + + argc = 1; + while (argv[argc] != 0) + ++argc; + +# ifdef __EMX__ + if (!unixy_shell) + ++argc; +# endif + + new_argv = alloca ((1 + argc + 1) * sizeof (char *)); + new_argv[0] = shell; + +# ifdef __EMX__ + if (!unixy_shell) + { + new_argv[1] = "/c"; + ++i; + --argc; + } +# endif + + new_argv[i] = argv[0]; + while (argc > 0) + { + new_argv[i + argc] = argv[argc]; + --argc; + } + +# ifdef __EMX__ + pid = spawnvpe (P_NOWAIT, shell, new_argv, envp); + if (pid >= 0) + break; +# else + execvp (shell, new_argv); +# endif + if (errno == ENOENT) + error (NILF, _("%s: Shell program not found"), shell); + else + perror_with_name ("execvp: ", shell); + break; + } + +# ifdef __EMX__ + case EINVAL: + /* this nasty error was driving me nuts :-( */ + error (NILF, _("spawnvpe: environment space might be exhausted")); + /* FALLTHROUGH */ +# endif + + default: + perror_with_name ("execvp: ", argv[0]); + break; + } + +# ifdef __EMX__ + return pid; +# else + _exit (127); +# endif +#endif /* !WINDOWS32 */ +#endif /* !VMS */ +} +#else /* On Amiga */ +void exec_command (char **argv) +{ + MyExecute (argv); +} + +void clean_tmp (void) +{ + DeleteFile (amiga_bname); +} + +#endif /* On Amiga */ + +#ifndef VMS +/* Figure out the argument list necessary to run LINE as a command. Try to + avoid using a shell. This routine handles only ' quoting, and " quoting + when no backslash, $ or ` characters are seen in the quotes. Starting + quotes may be escaped with a backslash. If any of the characters in + sh_chars[] is seen, or any of the builtin commands listed in sh_cmds[] + is the first word of a line, the shell is used. + + If RESTP is not NULL, *RESTP is set to point to the first newline in LINE. + If *RESTP is NULL, newlines will be ignored. + + SHELL is the shell to use, or nil to use the default shell. + IFS is the value of $IFS, or nil (meaning the default). + + FLAGS is the value of lines_flags for this command line. It is + used in the WINDOWS32 port to check whether + or $(MAKE) were found + in this command line, in which case the effect of just_print_flag + is overridden. */ + +static char ** +construct_command_argv_internal (char *line, char **restp, char *shell, + char *shellflags, char *ifs, int flags, + char **batch_filename_ptr) +{ +#ifdef __MSDOS__ + /* MSDOS supports both the stock DOS shell and ports of Unixy shells. + We call `system' for anything that requires ``slow'' processing, + because DOS shells are too dumb. When $SHELL points to a real + (unix-style) shell, `system' just calls it to do everything. When + $SHELL points to a DOS shell, `system' does most of the work + internally, calling the shell only for its internal commands. + However, it looks on the $PATH first, so you can e.g. have an + external command named `mkdir'. + + Since we call `system', certain characters and commands below are + actually not specific to COMMAND.COM, but to the DJGPP implementation + of `system'. In particular: + + The shell wildcard characters are in DOS_CHARS because they will + not be expanded if we call the child via `spawnXX'. + + The `;' is in DOS_CHARS, because our `system' knows how to run + multiple commands on a single line. + + DOS_CHARS also include characters special to 4DOS/NDOS, so we + won't have to tell one from another and have one more set of + commands and special characters. */ + static char sh_chars_dos[] = "*?[];|<>%^&()"; + static char *sh_cmds_dos[] = { "break", "call", "cd", "chcp", "chdir", "cls", + "copy", "ctty", "date", "del", "dir", "echo", + "erase", "exit", "for", "goto", "if", "md", + "mkdir", "path", "pause", "prompt", "rd", + "rmdir", "rem", "ren", "rename", "set", + "shift", "time", "type", "ver", "verify", + "vol", ":", 0 }; + + static char sh_chars_sh[] = "#;\"*?[]&|<>(){}$`^"; + static char *sh_cmds_sh[] = { "cd", "echo", "eval", "exec", "exit", "login", + "logout", "set", "umask", "wait", "while", + "for", "case", "if", ":", ".", "break", + "continue", "export", "read", "readonly", + "shift", "times", "trap", "switch", "unset", + "ulimit", 0 }; + + char *sh_chars; + char **sh_cmds; +#elif defined (__EMX__) + static char sh_chars_dos[] = "*?[];|<>%^&()"; + static char *sh_cmds_dos[] = { "break", "call", "cd", "chcp", "chdir", "cls", + "copy", "ctty", "date", "del", "dir", "echo", + "erase", "exit", "for", "goto", "if", "md", + "mkdir", "path", "pause", "prompt", "rd", + "rmdir", "rem", "ren", "rename", "set", + "shift", "time", "type", "ver", "verify", + "vol", ":", 0 }; + + static char sh_chars_os2[] = "*?[];|<>%^()\"'&"; + static char *sh_cmds_os2[] = { "call", "cd", "chcp", "chdir", "cls", "copy", + "date", "del", "detach", "dir", "echo", + "endlocal", "erase", "exit", "for", "goto", "if", + "keys", "md", "mkdir", "move", "path", "pause", + "prompt", "rd", "rem", "ren", "rename", "rmdir", + "set", "setlocal", "shift", "start", "time", + "type", "ver", "verify", "vol", ":", 0 }; + + static char sh_chars_sh[] = "#;\"*?[]&|<>(){}$`^~'"; + static char *sh_cmds_sh[] = { "echo", "cd", "eval", "exec", "exit", "login", + "logout", "set", "umask", "wait", "while", + "for", "case", "if", ":", ".", "break", + "continue", "export", "read", "readonly", + "shift", "times", "trap", "switch", "unset", + 0 }; + char *sh_chars; + char **sh_cmds; + +#elif defined (_AMIGA) + static char sh_chars[] = "#;\"|<>()?*$`"; + static char *sh_cmds[] = { "cd", "eval", "if", "delete", "echo", "copy", + "rename", "set", "setenv", "date", "makedir", + "skip", "else", "endif", "path", "prompt", + "unset", "unsetenv", "version", + 0 }; +#elif defined (WINDOWS32) + static char sh_chars_dos[] = "\"|&<>"; + static char *sh_cmds_dos[] = { "assoc", "break", "call", "cd", "chcp", + "chdir", "cls", "color", "copy", "ctty", + "date", "del", "dir", "echo", "echo.", + "endlocal", "erase", "exit", "for", "ftype", + "goto", "if", "if", "md", "mkdir", "path", + "pause", "prompt", "rd", "rem", "ren", + "rename", "rmdir", "set", "setlocal", + "shift", "time", "title", "type", "ver", + "verify", "vol", ":", 0 }; + static char sh_chars_sh[] = "#;\"*?[]&|<>(){}$`^"; + static char *sh_cmds_sh[] = { "cd", "eval", "exec", "exit", "login", + "logout", "set", "umask", "wait", "while", "for", + "case", "if", ":", ".", "break", "continue", + "export", "read", "readonly", "shift", "times", + "trap", "switch", "test", +#ifdef BATCH_MODE_ONLY_SHELL + "echo", +#endif + 0 }; + char* sh_chars; + char** sh_cmds; +#elif defined(__riscos__) + static char sh_chars[] = ""; + static char *sh_cmds[] = { 0 }; +#else /* must be UNIX-ish */ + static char sh_chars[] = "#;\"*?[]&|<>(){}$`^~!"; + static char *sh_cmds[] = { ".", ":", "break", "case", "cd", "continue", + "eval", "exec", "exit", "export", "for", "if", + "login", "logout", "read", "readonly", "set", + "shift", "switch", "test", "times", "trap", + "ulimit", "umask", "unset", "wait", "while", 0 }; +# ifdef HAVE_DOS_PATHS + /* This is required if the MSYS/Cygwin ports (which do not define + WINDOWS32) are compiled with HAVE_DOS_PATHS defined, which uses + sh_chars_sh[] directly (see below). */ + static char *sh_chars_sh = sh_chars; +# endif /* HAVE_DOS_PATHS */ +#endif + int i; + char *p; + char *ap; + char *end; + int instring, word_has_equals, seen_nonequals, last_argument_was_empty; + char **new_argv = 0; + char *argstr = 0; +#ifdef WINDOWS32 + int slow_flag = 0; + + if (!unixy_shell) { + sh_cmds = sh_cmds_dos; + sh_chars = sh_chars_dos; + } else { + sh_cmds = sh_cmds_sh; + sh_chars = sh_chars_sh; + } +#endif /* WINDOWS32 */ + + if (restp != NULL) + *restp = NULL; + + /* Make sure not to bother processing an empty line. */ + while (isblank ((unsigned char)*line)) + ++line; + if (*line == '\0') + return 0; + + /* See if it is safe to parse commands internally. */ + if (shell == 0) + shell = default_shell; +#ifdef WINDOWS32 + else if (strcmp (shell, default_shell)) + { + char *s1 = _fullpath (NULL, shell, 0); + char *s2 = _fullpath (NULL, default_shell, 0); + + slow_flag = strcmp ((s1 ? s1 : ""), (s2 ? s2 : "")); + + if (s1) + free (s1); + if (s2) + free (s2); + } + if (slow_flag) + goto slow; +#else /* not WINDOWS32 */ +#if defined (__MSDOS__) || defined (__EMX__) + else if (strcasecmp (shell, default_shell)) + { + extern int _is_unixy_shell (const char *_path); + + DB (DB_BASIC, (_("$SHELL changed (was `%s', now `%s')\n"), + default_shell, shell)); + unixy_shell = _is_unixy_shell (shell); + /* we must allocate a copy of shell: construct_command_argv() will free + * shell after this function returns. */ + default_shell = xstrdup (shell); + } + if (unixy_shell) + { + sh_chars = sh_chars_sh; + sh_cmds = sh_cmds_sh; + } + else + { + sh_chars = sh_chars_dos; + sh_cmds = sh_cmds_dos; +# ifdef __EMX__ + if (_osmode == OS2_MODE) + { + sh_chars = sh_chars_os2; + sh_cmds = sh_cmds_os2; + } +# endif + } +#else /* !__MSDOS__ */ + else if (strcmp (shell, default_shell)) + goto slow; +#endif /* !__MSDOS__ && !__EMX__ */ +#endif /* not WINDOWS32 */ + + if (ifs != 0) + for (ap = ifs; *ap != '\0'; ++ap) + if (*ap != ' ' && *ap != '\t' && *ap != '\n') + goto slow; + + if (shellflags != 0) + if (shellflags[0] != '-' + || ((shellflags[1] != 'c' || shellflags[2] != '\0') + && (shellflags[1] != 'e' || shellflags[2] != 'c' || shellflags[3] != '\0'))) + goto slow; + + i = strlen (line) + 1; + + /* More than 1 arg per character is impossible. */ + new_argv = xmalloc (i * sizeof (char *)); + + /* All the args can fit in a buffer as big as LINE is. */ + ap = new_argv[0] = argstr = xmalloc (i); + end = ap + i; + + /* I is how many complete arguments have been found. */ + i = 0; + instring = word_has_equals = seen_nonequals = last_argument_was_empty = 0; + for (p = line; *p != '\0'; ++p) + { + assert (ap <= end); + + if (instring) + { + /* Inside a string, just copy any char except a closing quote + or a backslash-newline combination. */ + if (*p == instring) + { + instring = 0; + if (ap == new_argv[0] || *(ap-1) == '\0') + last_argument_was_empty = 1; + } + else if (*p == '\\' && p[1] == '\n') + { + /* Backslash-newline is handled differently depending on what + kind of string we're in: inside single-quoted strings you + keep them; in double-quoted strings they disappear. + For DOS/Windows/OS2, if we don't have a POSIX shell, + we keep the pre-POSIX behavior of removing the + backslash-newline. */ + if (instring == '"' +#if defined (__MSDOS__) || defined (__EMX__) || defined (WINDOWS32) + || !unixy_shell +#endif + ) + ++p; + else + { + *(ap++) = *(p++); + *(ap++) = *p; + } + } + else if (*p == '\n' && restp != NULL) + { + /* End of the command line. */ + *restp = p; + goto end_of_line; + } + /* Backslash, $, and ` are special inside double quotes. + If we see any of those, punt. + But on MSDOS, if we use COMMAND.COM, double and single + quotes have the same effect. */ + else if (instring == '"' && strchr ("\\$`", *p) != 0 && unixy_shell) + goto slow; + else + *ap++ = *p; + } + else if (strchr (sh_chars, *p) != 0) + /* Not inside a string, but it's a special char. */ + goto slow; + else if (one_shell && *p == '\n') + /* In .ONESHELL mode \n is a separator like ; or && */ + goto slow; +#ifdef __MSDOS__ + else if (*p == '.' && p[1] == '.' && p[2] == '.' && p[3] != '.') + /* `...' is a wildcard in DJGPP. */ + goto slow; +#endif + else + /* Not a special char. */ + switch (*p) + { + case '=': + /* Equals is a special character in leading words before the + first word with no equals sign in it. This is not the case + with sh -k, but we never get here when using nonstandard + shell flags. */ + if (! seen_nonequals && unixy_shell) + goto slow; + word_has_equals = 1; + *ap++ = '='; + break; + + case '\\': + /* Backslash-newline has special case handling, ref POSIX. + We're in the fastpath, so emulate what the shell would do. */ + if (p[1] == '\n') + { + /* Throw out the backslash and newline. */ + ++p; + + /* If there's nothing in this argument yet, skip any + whitespace before the start of the next word. */ + if (ap == new_argv[i]) + p = next_token (p + 1) - 1; + } + else if (p[1] != '\0') + { +#ifdef HAVE_DOS_PATHS + /* Only remove backslashes before characters special to Unixy + shells. All other backslashes are copied verbatim, since + they are probably DOS-style directory separators. This + still leaves a small window for problems, but at least it + should work for the vast majority of naive users. */ + +#ifdef __MSDOS__ + /* A dot is only special as part of the "..." + wildcard. */ + if (strneq (p + 1, ".\\.\\.", 5)) + { + *ap++ = '.'; + *ap++ = '.'; + p += 4; + } + else +#endif + if (p[1] != '\\' && p[1] != '\'' + && !isspace ((unsigned char)p[1]) + && strchr (sh_chars_sh, p[1]) == 0) + /* back up one notch, to copy the backslash */ + --p; +#endif /* HAVE_DOS_PATHS */ + + /* Copy and skip the following char. */ + *ap++ = *++p; + } + break; + + case '\'': + case '"': + instring = *p; + break; + + case '\n': + if (restp != NULL) + { + /* End of the command line. */ + *restp = p; + goto end_of_line; + } + else + /* Newlines are not special. */ + *ap++ = '\n'; + break; + + case ' ': + case '\t': + /* We have the end of an argument. + Terminate the text of the argument. */ + *ap++ = '\0'; + new_argv[++i] = ap; + last_argument_was_empty = 0; + + /* Update SEEN_NONEQUALS, which tells us if every word + heretofore has contained an `='. */ + seen_nonequals |= ! word_has_equals; + if (word_has_equals && ! seen_nonequals) + /* An `=' in a word before the first + word without one is magical. */ + goto slow; + word_has_equals = 0; /* Prepare for the next word. */ + + /* If this argument is the command name, + see if it is a built-in shell command. + If so, have the shell handle it. */ + if (i == 1) + { + register int j; + for (j = 0; sh_cmds[j] != 0; ++j) + { + if (streq (sh_cmds[j], new_argv[0])) + goto slow; +# ifdef __EMX__ + /* Non-Unix shells are case insensitive. */ + if (!unixy_shell + && strcasecmp (sh_cmds[j], new_argv[0]) == 0) + goto slow; +# endif + } + } + + /* Ignore multiple whitespace chars. */ + p = next_token (p) - 1; + break; + + default: + *ap++ = *p; + break; + } + } + end_of_line: + + if (instring) + /* Let the shell deal with an unterminated quote. */ + goto slow; + + /* Terminate the last argument and the argument list. */ + + *ap = '\0'; + if (new_argv[i][0] != '\0' || last_argument_was_empty) + ++i; + new_argv[i] = 0; + + if (i == 1) + { + register int j; + for (j = 0; sh_cmds[j] != 0; ++j) + if (streq (sh_cmds[j], new_argv[0])) + goto slow; + } + + if (new_argv[0] == 0) + { + /* Line was empty. */ + free (argstr); + free (new_argv); + return 0; + } + + return new_argv; + + slow:; + /* We must use the shell. */ + + if (new_argv != 0) + { + /* Free the old argument list we were working on. */ + free (argstr); + free (new_argv); + } + +#ifdef __MSDOS__ + execute_by_shell = 1; /* actually, call `system' if shell isn't unixy */ +#endif + +#ifdef _AMIGA + { + char *ptr; + char *buffer; + char *dptr; + + buffer = xmalloc (strlen (line)+1); + + ptr = line; + for (dptr=buffer; *ptr; ) + { + if (*ptr == '\\' && ptr[1] == '\n') + ptr += 2; + else if (*ptr == '@') /* Kludge: multiline commands */ + { + ptr += 2; + *dptr++ = '\n'; + } + else + *dptr++ = *ptr++; + } + *dptr = 0; + + new_argv = xmalloc (2 * sizeof (char *)); + new_argv[0] = buffer; + new_argv[1] = 0; + } +#else /* Not Amiga */ +#ifdef WINDOWS32 + /* + * Not eating this whitespace caused things like + * + * sh -c "\n" + * + * which gave the shell fits. I think we have to eat + * whitespace here, but this code should be considered + * suspicious if things start failing.... + */ + + /* Make sure not to bother processing an empty line. */ + while (isspace ((unsigned char)*line)) + ++line; + if (*line == '\0') + return 0; +#endif /* WINDOWS32 */ + + { + /* SHELL may be a multi-word command. Construct a command line + "$(SHELL) $(.SHELLFLAGS) LINE", with all special chars in LINE escaped. + Then recurse, expanding this command line to get the final + argument list. */ + + unsigned int shell_len = strlen (shell); + unsigned int line_len = strlen (line); + unsigned int sflags_len = strlen (shellflags); + char *command_ptr = NULL; /* used for batch_mode_shell mode */ + char *new_line; + +# ifdef __EMX__ /* is this necessary? */ + if (!unixy_shell) + shellflags[0] = '/'; /* "/c" */ +# endif + + /* In .ONESHELL mode we are allowed to throw the entire current + recipe string at a single shell and trust that the user + has configured the shell and shell flags, and formatted + the string, appropriately. */ + if (one_shell) + { + /* If the shell is Bourne compatible, we must remove and ignore + interior special chars [@+-] because they're meaningless to + the shell itself. If, however, we're in .ONESHELL mode and + have changed SHELL to something non-standard, we should + leave those alone because they could be part of the + script. In this case we must also leave in place + any leading [@+-] for the same reason. */ + + /* Remove and ignore interior prefix chars [@+-] because they're + meaningless given a single shell. */ +#if defined __MSDOS__ || defined (__EMX__) + if (unixy_shell) /* the test is complicated and we already did it */ +#else + if (is_bourne_compatible_shell(shell)) +#endif + { + const char *f = line; + char *t = line; + + /* Copy the recipe, removing and ignoring interior prefix chars + [@+-]: they're meaningless in .ONESHELL mode. */ + while (f[0] != '\0') + { + int esc = 0; + + /* This is the start of a new recipe line. + Skip whitespace and prefix characters. */ + while (isblank (*f) || *f == '-' || *f == '@' || *f == '+') + ++f; + + /* Copy until we get to the next logical recipe line. */ + while (*f != '\0') + { + *(t++) = *(f++); + if (f[-1] == '\\') + esc = !esc; + else + { + /* On unescaped newline, we're done with this line. */ + if (f[-1] == '\n' && ! esc) + break; + + /* Something else: reset the escape sequence. */ + esc = 0; + } + } + } + *t = '\0'; + } + + new_argv = xmalloc (4 * sizeof (char *)); + new_argv[0] = xstrdup(shell); + new_argv[1] = xstrdup(shellflags); + new_argv[2] = line; + new_argv[3] = NULL; + return new_argv; + } + + new_line = alloca (shell_len + 1 + sflags_len + 1 + + (line_len*2) + 1); + ap = new_line; + memcpy (ap, shell, shell_len); + ap += shell_len; + *(ap++) = ' '; + memcpy (ap, shellflags, sflags_len); + ap += sflags_len; + *(ap++) = ' '; + command_ptr = ap; + for (p = line; *p != '\0'; ++p) + { + if (restp != NULL && *p == '\n') + { + *restp = p; + break; + } + else if (*p == '\\' && p[1] == '\n') + { + /* POSIX says we keep the backslash-newline. If we don't have a + POSIX shell on DOS/Windows/OS2, mimic the pre-POSIX behavior + and remove the backslash/newline. */ +#if defined (__MSDOS__) || defined (__EMX__) || defined (WINDOWS32) +# define PRESERVE_BSNL unixy_shell +#else +# define PRESERVE_BSNL 1 +#endif + if (PRESERVE_BSNL) + { + *(ap++) = '\\'; + /* Only non-batch execution needs another backslash, + because it will be passed through a recursive + invocation of this function. */ + if (!batch_mode_shell) + *(ap++) = '\\'; + *(ap++) = '\n'; + } + ++p; + continue; + } + + /* DOS shells don't know about backslash-escaping. */ + if (unixy_shell && !batch_mode_shell && + (*p == '\\' || *p == '\'' || *p == '"' + || isspace ((unsigned char)*p) + || strchr (sh_chars, *p) != 0)) + *ap++ = '\\'; +#ifdef __MSDOS__ + else if (unixy_shell && strneq (p, "...", 3)) + { + /* The case of `...' wildcard again. */ + strcpy (ap, "\\.\\.\\"); + ap += 5; + p += 2; + } +#endif + *ap++ = *p; + } + if (ap == new_line + shell_len + sflags_len + 2) + /* Line was empty. */ + return 0; + *ap = '\0'; + +#ifdef WINDOWS32 + /* Some shells do not work well when invoked as 'sh -c xxx' to run a + command line (e.g. Cygnus GNUWIN32 sh.exe on WIN32 systems). In these + cases, run commands via a script file. */ + if (just_print_flag && !(flags & COMMANDS_RECURSE)) { + /* Need to allocate new_argv, although it's unused, because + start_job_command will want to free it and its 0'th element. */ + new_argv = xmalloc(2 * sizeof (char *)); + new_argv[0] = xstrdup (""); + new_argv[1] = NULL; + } else if ((no_default_sh_exe || batch_mode_shell) && batch_filename_ptr) { + int temp_fd; + FILE* batch = NULL; + int id = GetCurrentProcessId(); + PATH_VAR(fbuf); + + /* create a file name */ + sprintf(fbuf, "make%d", id); + *batch_filename_ptr = create_batch_file (fbuf, unixy_shell, &temp_fd); + + DB (DB_JOBS, (_("Creating temporary batch file %s\n"), + *batch_filename_ptr)); + + /* Create a FILE object for the batch file, and write to it the + commands to be executed. Put the batch file in TEXT mode. */ + _setmode (temp_fd, _O_TEXT); + batch = _fdopen (temp_fd, "wt"); + if (!unixy_shell) + fputs ("@echo off\n", batch); + fputs (command_ptr, batch); + fputc ('\n', batch); + fclose (batch); + DB (DB_JOBS, (_("Batch file contents:%s\n\t%s\n"), + !unixy_shell ? "\n\t@echo off" : "", command_ptr)); + + /* create argv */ + new_argv = xmalloc(3 * sizeof (char *)); + if (unixy_shell) { + new_argv[0] = xstrdup (shell); + new_argv[1] = *batch_filename_ptr; /* only argv[0] gets freed later */ + } else { + new_argv[0] = xstrdup (*batch_filename_ptr); + new_argv[1] = NULL; + } + new_argv[2] = NULL; + } else +#endif /* WINDOWS32 */ + + if (unixy_shell) + new_argv = construct_command_argv_internal (new_line, 0, 0, 0, 0, flags, 0); + +#ifdef __EMX__ + else if (!unixy_shell) + { + /* new_line is local, must not be freed therefore + We use line here instead of new_line because we run the shell + manually. */ + size_t line_len = strlen (line); + char *p = new_line; + char *q = new_line; + memcpy (new_line, line, line_len + 1); + /* Replace all backslash-newline combination and also following tabs. + Important: stop at the first '\n' because that's what the loop above + did. The next line starting at restp[0] will be executed during the + next call of this function. */ + while (*q != '\0' && *q != '\n') + { + if (q[0] == '\\' && q[1] == '\n') + q += 2; /* remove '\\' and '\n' */ + else + *p++ = *q++; + } + *p = '\0'; + +# ifndef NO_CMD_DEFAULT + if (strnicmp (new_line, "echo", 4) == 0 + && (new_line[4] == ' ' || new_line[4] == '\t')) + { + /* the builtin echo command: handle it separately */ + size_t echo_len = line_len - 5; + char *echo_line = new_line + 5; + + /* special case: echo 'x="y"' + cmd works this way: a string is printed as is, i.e., no quotes + are removed. But autoconf uses a command like echo 'x="y"' to + determine whether make works. autoconf expects the output x="y" + so we will do exactly that. + Note: if we do not allow cmd to be the default shell + we do not need this kind of voodoo */ + if (echo_line[0] == '\'' + && echo_line[echo_len - 1] == '\'' + && strncmp (echo_line + 1, "ac_maketemp=", + strlen ("ac_maketemp=")) == 0) + { + /* remove the enclosing quotes */ + memmove (echo_line, echo_line + 1, echo_len - 2); + echo_line[echo_len - 2] = '\0'; + } + } +# endif + + { + /* Let the shell decide what to do. Put the command line into the + 2nd command line argument and hope for the best ;-) */ + size_t sh_len = strlen (shell); + + /* exactly 3 arguments + NULL */ + new_argv = xmalloc (4 * sizeof (char *)); + /* Exactly strlen(shell) + strlen("/c") + strlen(line) + 3 times + the trailing '\0' */ + new_argv[0] = xmalloc (sh_len + line_len + 5); + memcpy (new_argv[0], shell, sh_len + 1); + new_argv[1] = new_argv[0] + sh_len + 1; + memcpy (new_argv[1], "/c", 3); + new_argv[2] = new_argv[1] + 3; + memcpy (new_argv[2], new_line, line_len + 1); + new_argv[3] = NULL; + } + } +#elif defined(__MSDOS__) + else + { + /* With MSDOS shells, we must construct the command line here + instead of recursively calling ourselves, because we + cannot backslash-escape the special characters (see above). */ + new_argv = xmalloc (sizeof (char *)); + line_len = strlen (new_line) - shell_len - sflags_len - 2; + new_argv[0] = xmalloc (line_len + 1); + strncpy (new_argv[0], + new_line + shell_len + sflags_len + 2, line_len); + new_argv[0][line_len] = '\0'; + } +#else + else + fatal (NILF, _("%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"), + __FILE__, __LINE__); +#endif + } +#endif /* ! AMIGA */ + + return new_argv; +} +#endif /* !VMS */ + +/* Figure out the argument list necessary to run LINE as a command. Try to + avoid using a shell. This routine handles only ' quoting, and " quoting + when no backslash, $ or ` characters are seen in the quotes. Starting + quotes may be escaped with a backslash. If any of the characters in + sh_chars[] is seen, or any of the builtin commands listed in sh_cmds[] + is the first word of a line, the shell is used. + + If RESTP is not NULL, *RESTP is set to point to the first newline in LINE. + If *RESTP is NULL, newlines will be ignored. + + FILE is the target whose commands these are. It is used for + variable expansion for $(SHELL) and $(IFS). */ + +char ** +construct_command_argv (char *line, char **restp, struct file *file, + int cmd_flags, char **batch_filename_ptr) +{ + char *shell, *ifs, *shellflags; + char **argv; + +#ifdef VMS + char *cptr; + int argc; + + argc = 0; + cptr = line; + for (;;) + { + while ((*cptr != 0) + && (isspace ((unsigned char)*cptr))) + cptr++; + if (*cptr == 0) + break; + while ((*cptr != 0) + && (!isspace((unsigned char)*cptr))) + cptr++; + argc++; + } + + argv = xmalloc (argc * sizeof (char *)); + if (argv == 0) + abort (); + + cptr = line; + argc = 0; + for (;;) + { + while ((*cptr != 0) + && (isspace ((unsigned char)*cptr))) + cptr++; + if (*cptr == 0) + break; + DB (DB_JOBS, ("argv[%d] = [%s]\n", argc, cptr)); + argv[argc++] = cptr; + while ((*cptr != 0) + && (!isspace((unsigned char)*cptr))) + cptr++; + if (*cptr != 0) + *cptr++ = 0; + } +#else + { + /* Turn off --warn-undefined-variables while we expand SHELL and IFS. */ + int save = warn_undefined_variables_flag; + warn_undefined_variables_flag = 0; + + shell = allocated_variable_expand_for_file ("$(SHELL)", file); +#ifdef WINDOWS32 + /* + * Convert to forward slashes so that construct_command_argv_internal() + * is not confused. + */ + if (shell) { + char *p = w32ify (shell, 0); + strcpy (shell, p); + } +#endif +#ifdef __EMX__ + { + static const char *unixroot = NULL; + static const char *last_shell = ""; + static int init = 0; + if (init == 0) + { + unixroot = getenv ("UNIXROOT"); + /* unixroot must be NULL or not empty */ + if (unixroot && unixroot[0] == '\0') unixroot = NULL; + init = 1; + } + + /* if we have an unixroot drive and if shell is not default_shell + (which means it's either cmd.exe or the test has already been + performed) and if shell is an absolute path without drive letter, + try whether it exists e.g.: if "/bin/sh" does not exist use + "$UNIXROOT/bin/sh" instead. */ + if (unixroot && shell && strcmp (shell, last_shell) != 0 + && (shell[0] == '/' || shell[0] == '\\')) + { + /* trying a new shell, check whether it exists */ + size_t size = strlen (shell); + char *buf = xmalloc (size + 7); + memcpy (buf, shell, size); + memcpy (buf + size, ".exe", 5); /* including the trailing '\0' */ + if (access (shell, F_OK) != 0 && access (buf, F_OK) != 0) + { + /* try the same for the unixroot drive */ + memmove (buf + 2, buf, size + 5); + buf[0] = unixroot[0]; + buf[1] = unixroot[1]; + if (access (buf, F_OK) == 0) + /* we have found a shell! */ + /* free(shell); */ + shell = buf; + else + free (buf); + } + else + free (buf); + } + } +#endif /* __EMX__ */ + + shellflags = allocated_variable_expand_for_file ("$(.SHELLFLAGS)", file); + ifs = allocated_variable_expand_for_file ("$(IFS)", file); + + warn_undefined_variables_flag = save; + } + + argv = construct_command_argv_internal (line, restp, shell, shellflags, ifs, + cmd_flags, batch_filename_ptr); + + free (shell); + free (shellflags); + free (ifs); +#endif /* !VMS */ + return argv; +} + +#if !defined(HAVE_DUP2) && !defined(_AMIGA) +int +dup2 (int old, int new) +{ + int fd; + + (void) close (new); + fd = dup (old); + if (fd != new) + { + (void) close (fd); + errno = EMFILE; + return -1; + } + + return fd; +} +#endif /* !HAVE_DUP2 && !_AMIGA */ + +/* On VMS systems, include special VMS functions. */ + +#ifdef VMS +#include "vmsjobs.c" +#endif diff --git a/job.h b/job.h new file mode 100644 index 0000000..d346b5e --- /dev/null +++ b/job.h @@ -0,0 +1,109 @@ +/* Definitions for managing subprocesses in GNU Make. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef SEEN_JOB_H +#define SEEN_JOB_H + +#ifdef HAVE_FCNTL_H +# include +#else +# include +#endif + +/* How to set close-on-exec for a file descriptor. */ + +#if !defined F_SETFD +# define CLOSE_ON_EXEC(_d) +#else +# ifndef FD_CLOEXEC +# define FD_CLOEXEC 1 +# endif +# define CLOSE_ON_EXEC(_d) (void) fcntl ((_d), F_SETFD, FD_CLOEXEC) +#endif + +/* Structure describing a running or dead child process. */ + +struct child + { + struct child *next; /* Link in the chain. */ + + struct file *file; /* File being remade. */ + + char **environment; /* Environment for commands. */ + + char **command_lines; /* Array of variable-expanded cmd lines. */ + unsigned int command_line; /* Index into above. */ + char *command_ptr; /* Ptr into command_lines[command_line]. */ + + pid_t pid; /* Child process's ID number. */ +#ifdef VMS + int efn; /* Completion event flag number */ + int cstatus; /* Completion status */ + char *comname; /* Temporary command file name */ +#endif + char *sh_batch_file; /* Script file for shell commands */ + unsigned int remote:1; /* Nonzero if executing remotely. */ + + unsigned int noerror:1; /* Nonzero if commands contained a `-'. */ + + unsigned int good_stdin:1; /* Nonzero if this child has a good stdin. */ + unsigned int deleted:1; /* Nonzero if targets have been deleted. */ + unsigned int dontcare:1; /* Saved dontcare flag. */ + }; + +extern struct child *children; + +int is_bourne_compatible_shell(const char *path); +void new_job (struct file *file); +void reap_children (int block, int err); +void start_waiting_jobs (void); + +char **construct_command_argv (char *line, char **restp, struct file *file, + int cmd_flags, char** batch_file); +#ifdef VMS +int child_execute_job (char *argv, struct child *child); +#elif defined(__EMX__) +int child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp); +#else +void child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp); +#endif +#ifdef _AMIGA +void exec_command (char **argv); +#elif defined(__EMX__) +int exec_command (char **argv, char **envp); +#else +void exec_command (char **argv, char **envp); +#endif + +extern unsigned int job_slots_used; + +void block_sigs (void); +#ifdef POSIX +void unblock_sigs (void); +#else +#ifdef HAVE_SIGSETMASK +extern int fatal_signal_mask; +#define unblock_sigs() sigsetmask (0) +#else +#define unblock_sigs() +#endif +#endif + +extern unsigned int jobserver_tokens; + +#endif /* SEEN_JOB_H */ diff --git a/main.c b/main.c new file mode 100644 index 0000000..c6989e3 --- /dev/null +++ b/main.c @@ -0,0 +1,3265 @@ +/* Argument parsing and main program of GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "dep.h" +#include "filedef.h" +#include "variable.h" +#include "job.h" +#include "commands.h" +#include "rule.h" +#include "debug.h" +#include "getopt.h" + +#include +#ifdef _AMIGA +# include +# include +#endif +#ifdef WINDOWS32 +#include +#include +#include "pathstuff.h" +#endif +#ifdef __EMX__ +# include +# include +#endif +#ifdef HAVE_FCNTL_H +# include +#endif + +#ifdef _AMIGA +int __stack = 20000; /* Make sure we have 20K of stack space */ +#endif + +void init_dir (void); +void remote_setup (void); +void remote_cleanup (void); +RETSIGTYPE fatal_error_signal (int sig); + +void print_variable_data_base (void); +void print_dir_data_base (void); +void print_rule_data_base (void); +void print_vpath_data_base (void); + +void verify_file_data_base (void); + +#if defined HAVE_WAITPID || defined HAVE_WAIT3 +# define HAVE_WAIT_NOHANG +#endif + +#ifndef HAVE_UNISTD_H +int chdir (); +#endif +#ifndef STDC_HEADERS +# ifndef sun /* Sun has an incorrect decl in a header. */ +void exit (int) __attribute__ ((noreturn)); +# endif +double atof (); +#endif + +static void clean_jobserver (int status); +static void print_data_base (void); +static void print_version (void); +static void decode_switches (int argc, char **argv, int env); +static void decode_env_switches (char *envar, unsigned int len); +static const char *define_makeflags (int all, int makefile); +static char *quote_for_env (char *out, const char *in); +static void initialize_global_hash_tables (void); + + +/* The structure that describes an accepted command switch. */ + +struct command_switch + { + int c; /* The switch character. */ + + enum /* Type of the value. */ + { + flag, /* Turn int flag on. */ + flag_off, /* Turn int flag off. */ + string, /* One string per switch. */ + filename, /* A string containing a file name. */ + positive_int, /* A positive integer. */ + floating, /* A floating-point number (double). */ + ignore /* Ignored. */ + } type; + + void *value_ptr; /* Pointer to the value-holding variable. */ + + unsigned int env:1; /* Can come from MAKEFLAGS. */ + unsigned int toenv:1; /* Should be put in MAKEFLAGS. */ + unsigned int no_makefile:1; /* Don't propagate when remaking makefiles. */ + + const void *noarg_value; /* Pointer to value used if no arg given. */ + const void *default_value; /* Pointer to default value. */ + + char *long_name; /* Long option name. */ + }; + +/* True if C is a switch value that corresponds to a short option. */ + +#define short_option(c) ((c) <= CHAR_MAX) + +/* The structure used to hold the list of strings given + in command switches of a type that takes string arguments. */ + +struct stringlist + { + const char **list; /* Nil-terminated list of strings. */ + unsigned int idx; /* Index into above. */ + unsigned int max; /* Number of pointers allocated. */ + }; + + +/* The recognized command switches. */ + +/* Nonzero means do not print commands to be executed (-s). */ + +int silent_flag; + +/* Nonzero means just touch the files + that would appear to need remaking (-t) */ + +int touch_flag; + +/* Nonzero means just print what commands would need to be executed, + don't actually execute them (-n). */ + +int just_print_flag; + +/* Print debugging info (--debug). */ + +static struct stringlist *db_flags; +static int debug_flag = 0; + +int db_level = 0; + +/* Output level (--verbosity). */ + +static struct stringlist *verbosity_flags; + +#ifdef WINDOWS32 +/* Suspend make in main for a short time to allow debugger to attach */ + +int suspend_flag = 0; +#endif + +/* Environment variables override makefile definitions. */ + +int env_overrides = 0; + +/* Nonzero means ignore status codes returned by commands + executed to remake files. Just treat them all as successful (-i). */ + +int ignore_errors_flag = 0; + +/* Nonzero means don't remake anything, just print the data base + that results from reading the makefile (-p). */ + +int print_data_base_flag = 0; + +/* Nonzero means don't remake anything; just return a nonzero status + if the specified targets are not up to date (-q). */ + +int question_flag = 0; + +/* Nonzero means do not use any of the builtin rules (-r) / variables (-R). */ + +int no_builtin_rules_flag = 0; +int no_builtin_variables_flag = 0; + +/* Nonzero means keep going even if remaking some file fails (-k). */ + +int keep_going_flag; +int default_keep_going_flag = 0; + +/* Nonzero means check symlink mtimes. */ + +int check_symlink_flag = 0; + +/* Nonzero means print directory before starting and when done (-w). */ + +int print_directory_flag = 0; + +/* Nonzero means ignore print_directory_flag and never print the directory. + This is necessary because print_directory_flag is set implicitly. */ + +int inhibit_print_directory_flag = 0; + +/* Nonzero means print version information. */ + +int print_version_flag = 0; + +/* List of makefiles given with -f switches. */ + +static struct stringlist *makefiles = 0; + +/* Size of the stack when we started. */ + +#ifdef SET_STACK_SIZE +struct rlimit stack_limit; +#endif + + +/* Number of job slots (commands that can be run at once). */ + +unsigned int job_slots = 1; +unsigned int default_job_slots = 1; +static unsigned int master_job_slots = 0; + +/* Value of job_slots that means no limit. */ + +static unsigned int inf_jobs = 0; + +/* File descriptors for the jobs pipe. */ + +static struct stringlist *jobserver_fds = 0; + +int job_fds[2] = { -1, -1 }; +int job_rfd = -1; + +/* Maximum load average at which multiple jobs will be run. + Negative values mean unlimited, while zero means limit to + zero load (which could be useful to start infinite jobs remotely + but one at a time locally). */ +#ifndef NO_FLOAT +double max_load_average = -1.0; +double default_load_average = -1.0; +#else +int max_load_average = -1; +int default_load_average = -1; +#endif + +/* List of directories given with -C switches. */ + +static struct stringlist *directories = 0; + +/* List of include directories given with -I switches. */ + +static struct stringlist *include_directories = 0; + +/* List of files given with -o switches. */ + +static struct stringlist *old_files = 0; + +/* List of files given with -W switches. */ + +static struct stringlist *new_files = 0; + +/* List of strings to be eval'd. */ +static struct stringlist *eval_strings = 0; + +/* If nonzero, we should just print usage and exit. */ + +static int print_usage_flag = 0; + +/* If nonzero, we should print a warning message + for each reference to an undefined variable. */ + +int warn_undefined_variables_flag; + +/* If nonzero, always build all targets, regardless of whether + they appear out of date or not. */ + +static int always_make_set = 0; +int always_make_flag = 0; + +/* If nonzero, we're in the "try to rebuild makefiles" phase. */ + +int rebuilding_makefiles = 0; + +/* Remember the original value of the SHELL variable, from the environment. */ + +struct variable shell_var; + +/* This character introduces a command: it's the first char on the line. */ + +char cmd_prefix = '\t'; + + +/* The usage output. We write it this way to make life easier for the + translators, especially those trying to translate to right-to-left + languages like Hebrew. */ + +static const char *const usage[] = + { + N_("Options:\n"), + N_("\ + -b, -m Ignored for compatibility.\n"), + N_("\ + -B, --always-make Unconditionally make all targets.\n"), + N_("\ + -C DIRECTORY, --directory=DIRECTORY\n\ + Change to DIRECTORY before doing anything.\n"), + N_("\ + -d Print lots of debugging information.\n"), + N_("\ + --debug[=FLAGS] Print various types of debugging information.\n"), + N_("\ + -e, --environment-overrides\n\ + Environment variables override makefiles.\n"), + N_("\ + --eval=STRING Evaluate STRING as a makefile statement.\n"), + N_("\ + -f FILE, --file=FILE, --makefile=FILE\n\ + Read FILE as a makefile.\n"), + N_("\ + -h, --help Print this message and exit.\n"), + N_("\ + -i, --ignore-errors Ignore errors from recipes.\n"), + N_("\ + -I DIRECTORY, --include-dir=DIRECTORY\n\ + Search DIRECTORY for included makefiles.\n"), + N_("\ + -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no arg.\n"), + N_("\ + -k, --keep-going Keep going when some targets can't be made.\n"), + N_("\ + -l [N], --load-average[=N], --max-load[=N]\n\ + Don't start multiple jobs unless load is below N.\n"), + N_("\ + -L, --check-symlink-times Use the latest mtime between symlinks and target.\n"), + N_("\ + -n, --just-print, --dry-run, --recon\n\ + Don't actually run any recipe; just print them.\n"), + N_("\ + -o FILE, --old-file=FILE, --assume-old=FILE\n\ + Consider FILE to be very old and don't remake it.\n"), + N_("\ + -p, --print-data-base Print make's internal database.\n"), + N_("\ + -q, --question Run no recipe; exit status says if up to date.\n"), + N_("\ + -r, --no-builtin-rules Disable the built-in implicit rules.\n"), + N_("\ + -R, --no-builtin-variables Disable the built-in variable settings.\n"), + N_("\ + -s, --silent, --quiet Don't echo recipes.\n"), + N_("\ + -S, --no-keep-going, --stop\n\ + Turns off -k.\n"), + N_("\ + -t, --touch Touch targets instead of remaking them.\n"), + N_("\ + -v, --version Print the version number of make and exit.\n"), + N_("\ + -w, --print-directory Print the current directory.\n"), + N_("\ + --no-print-directory Turn off -w, even if it was turned on implicitly.\n"), + N_("\ + -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n\ + Consider FILE to be infinitely new.\n"), + N_("\ + --warn-undefined-variables Warn when an undefined variable is referenced.\n"), + NULL + }; + +/* The table of command switches. */ + +static const struct command_switch switches[] = + { + { 'b', ignore, 0, 0, 0, 0, 0, 0, 0 }, + { 'B', flag, &always_make_set, 1, 1, 0, 0, 0, "always-make" }, + { 'C', filename, &directories, 0, 0, 0, 0, 0, "directory" }, + { 'd', flag, &debug_flag, 1, 1, 0, 0, 0, 0 }, + { CHAR_MAX+1, string, &db_flags, 1, 1, 0, "basic", 0, "debug" }, +#ifdef WINDOWS32 + { 'D', flag, &suspend_flag, 1, 1, 0, 0, 0, "suspend-for-debug" }, +#endif + { 'e', flag, &env_overrides, 1, 1, 0, 0, 0, "environment-overrides", }, + { 'f', filename, &makefiles, 0, 0, 0, 0, 0, "file" }, + { 'h', flag, &print_usage_flag, 0, 0, 0, 0, 0, "help" }, + { 'i', flag, &ignore_errors_flag, 1, 1, 0, 0, 0, "ignore-errors" }, + { 'I', filename, &include_directories, 1, 1, 0, 0, 0, + "include-dir" }, + { 'j', positive_int, &job_slots, 1, 1, 0, &inf_jobs, &default_job_slots, + "jobs" }, + { CHAR_MAX+2, string, &jobserver_fds, 1, 1, 0, 0, 0, "jobserver-fds" }, + { 'k', flag, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag, + "keep-going" }, +#ifndef NO_FLOAT + { 'l', floating, &max_load_average, 1, 1, 0, &default_load_average, + &default_load_average, "load-average" }, +#else + { 'l', positive_int, &max_load_average, 1, 1, 0, &default_load_average, + &default_load_average, "load-average" }, +#endif + { 'L', flag, &check_symlink_flag, 1, 1, 0, 0, 0, "check-symlink-times" }, + { 'm', ignore, 0, 0, 0, 0, 0, 0, 0 }, + { 'n', flag, &just_print_flag, 1, 1, 1, 0, 0, "just-print" }, + { 'o', filename, &old_files, 0, 0, 0, 0, 0, "old-file" }, + { 'p', flag, &print_data_base_flag, 1, 1, 0, 0, 0, "print-data-base" }, + { 'q', flag, &question_flag, 1, 1, 1, 0, 0, "question" }, + { 'r', flag, &no_builtin_rules_flag, 1, 1, 0, 0, 0, "no-builtin-rules" }, + { 'R', flag, &no_builtin_variables_flag, 1, 1, 0, 0, 0, + "no-builtin-variables" }, + { 's', flag, &silent_flag, 1, 1, 0, 0, 0, "silent" }, + { 'S', flag_off, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag, + "no-keep-going" }, + { 't', flag, &touch_flag, 1, 1, 1, 0, 0, "touch" }, + { 'v', flag, &print_version_flag, 1, 1, 0, 0, 0, "version" }, + { CHAR_MAX+3, string, &verbosity_flags, 1, 1, 0, 0, 0, + "verbosity" }, + { 'w', flag, &print_directory_flag, 1, 1, 0, 0, 0, "print-directory" }, + { CHAR_MAX+4, flag, &inhibit_print_directory_flag, 1, 1, 0, 0, 0, + "no-print-directory" }, + { 'W', filename, &new_files, 0, 0, 0, 0, 0, "what-if" }, + { CHAR_MAX+5, flag, &warn_undefined_variables_flag, 1, 1, 0, 0, 0, + "warn-undefined-variables" }, + { CHAR_MAX+6, string, &eval_strings, 1, 0, 0, 0, 0, "eval" }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }; + +/* Secondary long names for options. */ + +static struct option long_option_aliases[] = + { + { "quiet", no_argument, 0, 's' }, + { "stop", no_argument, 0, 'S' }, + { "new-file", required_argument, 0, 'W' }, + { "assume-new", required_argument, 0, 'W' }, + { "assume-old", required_argument, 0, 'o' }, + { "max-load", optional_argument, 0, 'l' }, + { "dry-run", no_argument, 0, 'n' }, + { "recon", no_argument, 0, 'n' }, + { "makefile", required_argument, 0, 'f' }, + }; + +/* List of goal targets. */ + +static struct dep *goals, *lastgoal; + +/* List of variables which were defined on the command line + (or, equivalently, in MAKEFLAGS). */ + +struct command_variable + { + struct command_variable *next; + struct variable *variable; + }; +static struct command_variable *command_variables; + +/* The name we were invoked with. */ + +char *program; + +/* Our current directory before processing any -C options. */ + +char *directory_before_chdir; + +/* Our current directory after processing all -C options. */ + +char *starting_directory; + +/* Value of the MAKELEVEL variable at startup (or 0). */ + +unsigned int makelevel; + +/* Pointer to the value of the .DEFAULT_GOAL special variable. + The value will be the name of the goal to remake if the command line + does not override it. It can be set by the makefile, or else it's + the first target defined in the makefile whose name does not start + with '.'. */ + +struct variable * default_goal_var; + +/* Pointer to structure for the file .DEFAULT + whose commands are used for any file that has none of its own. + This is zero if the makefiles do not define .DEFAULT. */ + +struct file *default_file; + +/* Nonzero if we have seen the magic `.POSIX' target. + This turns on pedantic compliance with POSIX.2. */ + +int posix_pedantic; + +/* Nonzero if we have seen the '.SECONDEXPANSION' target. + This turns on secondary expansion of prerequisites. */ + +int second_expansion; + +/* Nonzero if we have seen the '.ONESHELL' target. + This causes the entire recipe to be handed to SHELL + as a single string, potentially containing newlines. */ + +int one_shell; + +/* Nonzero if we have seen the `.NOTPARALLEL' target. + This turns off parallel builds for this invocation of make. */ + +int not_parallel; + +/* Nonzero if some rule detected clock skew; we keep track so (a) we only + print one warning about it during the run, and (b) we can print a final + warning at the end of the run. */ + +int clock_skew_detected; + +/* Mask of signals that are being caught with fatal_error_signal. */ + +#ifdef POSIX +sigset_t fatal_signal_set; +#else +# ifdef HAVE_SIGSETMASK +int fatal_signal_mask; +# endif +#endif + +#if !HAVE_DECL_BSD_SIGNAL && !defined bsd_signal +# if !defined HAVE_SIGACTION +# define bsd_signal signal +# else +typedef RETSIGTYPE (*bsd_signal_ret_t) (int); + +static bsd_signal_ret_t +bsd_signal (int sig, bsd_signal_ret_t func) +{ + struct sigaction act, oact; + act.sa_handler = func; + act.sa_flags = SA_RESTART; + sigemptyset (&act.sa_mask); + sigaddset (&act.sa_mask, sig); + if (sigaction (sig, &act, &oact) != 0) + return SIG_ERR; + return oact.sa_handler; +} +# endif +#endif + +static void +initialize_global_hash_tables (void) +{ + init_hash_global_variable_set (); + strcache_init (); + init_hash_files (); + hash_init_directories (); + hash_init_function_table (); +} + +static const char * +expand_command_line_file (char *name) +{ + const char *cp; + char *expanded = 0; + + if (name[0] == '\0') + fatal (NILF, _("empty string invalid as file name")); + + if (name[0] == '~') + { + expanded = tilde_expand (name); + if (expanded != 0) + name = expanded; + } + + /* This is also done in parse_file_seq, so this is redundant + for names read from makefiles. It is here for names passed + on the command line. */ + while (name[0] == '.' && name[1] == '/' && name[2] != '\0') + { + name += 2; + while (*name == '/') + /* Skip following slashes: ".//foo" is "foo", not "/foo". */ + ++name; + } + + if (*name == '\0') + { + /* It was all slashes! Move back to the dot and truncate + it after the first slash, so it becomes just "./". */ + do + --name; + while (name[0] != '.'); + name[2] = '\0'; + } + + cp = strcache_add (name); + + if (expanded) + free (expanded); + + return cp; +} + +/* Toggle -d on receipt of SIGUSR1. */ + +#ifdef SIGUSR1 +static RETSIGTYPE +debug_signal_handler (int sig UNUSED) +{ + db_level = db_level ? DB_NONE : DB_BASIC; +} +#endif + +static void +decode_debug_flags (void) +{ + const char **pp; + + if (debug_flag) + db_level = DB_ALL; + + if (!db_flags) + return; + + for (pp=db_flags->list; *pp; ++pp) + { + const char *p = *pp; + + while (1) + { + switch (tolower (p[0])) + { + case 'a': + db_level |= DB_ALL; + break; + case 'b': + db_level |= DB_BASIC; + break; + case 'i': + db_level |= DB_BASIC | DB_IMPLICIT; + break; + case 'j': + db_level |= DB_JOBS; + break; + case 'm': + db_level |= DB_BASIC | DB_MAKEFILES; + break; + case 'v': + db_level |= DB_BASIC | DB_VERBOSE; + break; + default: + fatal (NILF, _("unknown debug level specification `%s'"), p); + } + + while (*(++p) != '\0') + if (*p == ',' || *p == ' ') + break; + + if (*p == '\0') + break; + + ++p; + } + } +} + +#ifdef WINDOWS32 +/* + * HANDLE runtime exceptions by avoiding a requestor on the GUI. Capture + * exception and print it to stderr instead. + * + * If ! DB_VERBOSE, just print a simple message and exit. + * If DB_VERBOSE, print a more verbose message. + * If compiled for DEBUG, let exception pass through to GUI so that + * debuggers can attach. + */ +LONG WINAPI +handle_runtime_exceptions( struct _EXCEPTION_POINTERS *exinfo ) +{ + PEXCEPTION_RECORD exrec = exinfo->ExceptionRecord; + LPSTR cmdline = GetCommandLine(); + LPSTR prg = strtok(cmdline, " "); + CHAR errmsg[1024]; +#ifdef USE_EVENT_LOG + HANDLE hEventSource; + LPTSTR lpszStrings[1]; +#endif + + if (! ISDB (DB_VERBOSE)) + { + sprintf(errmsg, + _("%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"), + prg, exrec->ExceptionCode, exrec->ExceptionAddress); + fprintf(stderr, errmsg); + exit(255); + } + + sprintf(errmsg, + _("\nUnhandled exception filter called from program %s\nExceptionCode = %lx\nExceptionFlags = %lx\nExceptionAddress = 0x%p\n"), + prg, exrec->ExceptionCode, exrec->ExceptionFlags, + exrec->ExceptionAddress); + + if (exrec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION + && exrec->NumberParameters >= 2) + sprintf(&errmsg[strlen(errmsg)], + (exrec->ExceptionInformation[0] + ? _("Access violation: write operation at address 0x%p\n") + : _("Access violation: read operation at address 0x%p\n")), + (PVOID)exrec->ExceptionInformation[1]); + + /* turn this on if we want to put stuff in the event log too */ +#ifdef USE_EVENT_LOG + hEventSource = RegisterEventSource(NULL, "GNU Make"); + lpszStrings[0] = errmsg; + + if (hEventSource != NULL) + { + ReportEvent(hEventSource, /* handle of event source */ + EVENTLOG_ERROR_TYPE, /* event type */ + 0, /* event category */ + 0, /* event ID */ + NULL, /* current user's SID */ + 1, /* strings in lpszStrings */ + 0, /* no bytes of raw data */ + lpszStrings, /* array of error strings */ + NULL); /* no raw data */ + + (VOID) DeregisterEventSource(hEventSource); + } +#endif + + /* Write the error to stderr too */ + fprintf(stderr, errmsg); + +#ifdef DEBUG + return EXCEPTION_CONTINUE_SEARCH; +#else + exit(255); + return (255); /* not reached */ +#endif +} + +/* + * On WIN32 systems we don't have the luxury of a /bin directory that + * is mapped globally to every drive mounted to the system. Since make could + * be invoked from any drive, and we don't want to propogate /bin/sh + * to every single drive. Allow ourselves a chance to search for + * a value for default shell here (if the default path does not exist). + */ + +int +find_and_set_default_shell (const char *token) +{ + int sh_found = 0; + char *atoken = 0; + char *search_token; + char *tokend; + PATH_VAR(sh_path); + extern char *default_shell; + + if (!token) + search_token = default_shell; + else + atoken = search_token = xstrdup (token); + + /* If the user explicitly requests the DOS cmd shell, obey that request. + However, make sure that's what they really want by requiring the value + of SHELL either equal, or have a final path element of, "cmd" or + "cmd.exe" case-insensitive. */ + tokend = search_token + strlen (search_token) - 3; + if (((tokend == search_token + || (tokend > search_token + && (tokend[-1] == '/' || tokend[-1] == '\\'))) + && !strcasecmp (tokend, "cmd")) + || ((tokend - 4 == search_token + || (tokend - 4 > search_token + && (tokend[-5] == '/' || tokend[-5] == '\\'))) + && !strcasecmp (tokend - 4, "cmd.exe"))) { + batch_mode_shell = 1; + unixy_shell = 0; + sprintf (sh_path, "%s", search_token); + default_shell = xstrdup (w32ify (sh_path, 0)); + DB (DB_VERBOSE, (_("find_and_set_shell() setting default_shell = %s\n"), + default_shell)); + sh_found = 1; + } else if (!no_default_sh_exe && + (token == NULL || !strcmp (search_token, default_shell))) { + /* no new information, path already set or known */ + sh_found = 1; + } else if (file_exists_p (search_token)) { + /* search token path was found */ + sprintf (sh_path, "%s", search_token); + default_shell = xstrdup (w32ify (sh_path, 0)); + DB (DB_VERBOSE, (_("find_and_set_shell() setting default_shell = %s\n"), + default_shell)); + sh_found = 1; + } else { + char *p; + struct variable *v = lookup_variable (STRING_SIZE_TUPLE ("PATH")); + + /* Search Path for shell */ + if (v && v->value) { + char *ep; + + p = v->value; + ep = strchr (p, PATH_SEPARATOR_CHAR); + + while (ep && *ep) { + *ep = '\0'; + + if (dir_file_exists_p (p, search_token)) { + sprintf (sh_path, "%s/%s", p, search_token); + default_shell = xstrdup (w32ify (sh_path, 0)); + sh_found = 1; + *ep = PATH_SEPARATOR_CHAR; + + /* terminate loop */ + p += strlen (p); + } else { + *ep = PATH_SEPARATOR_CHAR; + p = ++ep; + } + + ep = strchr (p, PATH_SEPARATOR_CHAR); + } + + /* be sure to check last element of Path */ + if (p && *p && dir_file_exists_p (p, search_token)) { + sprintf (sh_path, "%s/%s", p, search_token); + default_shell = xstrdup (w32ify (sh_path, 0)); + sh_found = 1; + } + + if (sh_found) + DB (DB_VERBOSE, + (_("find_and_set_shell() path search set default_shell = %s\n"), + default_shell)); + } + } + + /* naive test */ + if (!unixy_shell && sh_found && + (strstr (default_shell, "sh") || strstr (default_shell, "SH"))) { + unixy_shell = 1; + batch_mode_shell = 0; + } + +#ifdef BATCH_MODE_ONLY_SHELL + batch_mode_shell = 1; +#endif + + if (atoken) + free (atoken); + + return (sh_found); +} +#endif /* WINDOWS32 */ + +#ifdef __MSDOS__ +static void +msdos_return_to_initial_directory (void) +{ + if (directory_before_chdir) + chdir (directory_before_chdir); +} +#endif /* __MSDOS__ */ + +char *mktemp (char *template); +int mkstemp (char *template); + +FILE * +open_tmpfile(char **name, const char *template) +{ +#ifdef HAVE_FDOPEN + int fd; +#endif + +#if defined HAVE_MKSTEMP || defined HAVE_MKTEMP +# define TEMPLATE_LEN strlen (template) +#else +# define TEMPLATE_LEN L_tmpnam +#endif + *name = xmalloc (TEMPLATE_LEN + 1); + strcpy (*name, template); + +#if defined HAVE_MKSTEMP && defined HAVE_FDOPEN + /* It's safest to use mkstemp(), if we can. */ + fd = mkstemp (*name); + if (fd == -1) + return 0; + return fdopen (fd, "w"); +#else +# ifdef HAVE_MKTEMP + (void) mktemp (*name); +# else + (void) tmpnam (*name); +# endif + +# ifdef HAVE_FDOPEN + /* Can't use mkstemp(), but guard against a race condition. */ + fd = open (*name, O_CREAT|O_EXCL|O_WRONLY, 0600); + if (fd == -1) + return 0; + return fdopen (fd, "w"); +# else + /* Not secure, but what can we do? */ + return fopen (*name, "w"); +# endif +#endif +} + + +#ifdef _AMIGA +int +main (int argc, char **argv) +#else +int +main (int argc, char **argv, char **envp) +#endif +{ + static char *stdin_nm = 0; + int makefile_status = MAKE_SUCCESS; + struct dep *read_makefiles; + PATH_VAR (current_directory); + unsigned int restarts = 0; +#ifdef WINDOWS32 + char *unix_path = NULL; + char *windows32_path = NULL; + + SetUnhandledExceptionFilter(handle_runtime_exceptions); + + /* start off assuming we have no shell */ + unixy_shell = 0; + no_default_sh_exe = 1; +#endif + +#ifdef SET_STACK_SIZE + /* Get rid of any avoidable limit on stack size. */ + { + struct rlimit rlim; + + /* Set the stack limit huge so that alloca does not fail. */ + if (getrlimit (RLIMIT_STACK, &rlim) == 0 + && rlim.rlim_cur > 0 && rlim.rlim_cur < rlim.rlim_max) + { + stack_limit = rlim; + rlim.rlim_cur = rlim.rlim_max; + setrlimit (RLIMIT_STACK, &rlim); + } + else + stack_limit.rlim_cur = 0; + } +#endif + +#ifdef HAVE_ATEXIT + atexit (close_stdout); +#endif + + /* Needed for OS/2 */ + initialize_main(&argc, &argv); + + reading_file = 0; + +#if defined (__MSDOS__) && !defined (_POSIX_SOURCE) + /* Request the most powerful version of `system', to + make up for the dumb default shell. */ + __system_flags = (__system_redirect + | __system_use_shell + | __system_allow_multiple_cmds + | __system_allow_long_cmds + | __system_handle_null_commands + | __system_emulate_chdir); + +#endif + + /* Set up gettext/internationalization support. */ + setlocale (LC_ALL, ""); + /* The cast to void shuts up compiler warnings on systems that + disable NLS. */ + (void)bindtextdomain (PACKAGE, LOCALEDIR); + (void)textdomain (PACKAGE); + +#ifdef POSIX + sigemptyset (&fatal_signal_set); +#define ADD_SIG(sig) sigaddset (&fatal_signal_set, sig) +#else +#ifdef HAVE_SIGSETMASK + fatal_signal_mask = 0; +#define ADD_SIG(sig) fatal_signal_mask |= sigmask (sig) +#else +#define ADD_SIG(sig) (void)sig /* Needed to avoid warnings in MSVC. */ +#endif +#endif + +#define FATAL_SIG(sig) \ + if (bsd_signal (sig, fatal_error_signal) == SIG_IGN) \ + bsd_signal (sig, SIG_IGN); \ + else \ + ADD_SIG (sig); + +#ifdef SIGHUP + FATAL_SIG (SIGHUP); +#endif +#ifdef SIGQUIT + FATAL_SIG (SIGQUIT); +#endif + FATAL_SIG (SIGINT); + FATAL_SIG (SIGTERM); + +#ifdef __MSDOS__ + /* Windows 9X delivers FP exceptions in child programs to their + parent! We don't want Make to die when a child divides by zero, + so we work around that lossage by catching SIGFPE. */ + FATAL_SIG (SIGFPE); +#endif + +#ifdef SIGDANGER + FATAL_SIG (SIGDANGER); +#endif +#ifdef SIGXCPU + FATAL_SIG (SIGXCPU); +#endif +#ifdef SIGXFSZ + FATAL_SIG (SIGXFSZ); +#endif + +#undef FATAL_SIG + + /* Do not ignore the child-death signal. This must be done before + any children could possibly be created; otherwise, the wait + functions won't work on systems with the SVR4 ECHILD brain + damage, if our invoker is ignoring this signal. */ + +#ifdef HAVE_WAIT_NOHANG +# if defined SIGCHLD + (void) bsd_signal (SIGCHLD, SIG_DFL); +# endif +# if defined SIGCLD && SIGCLD != SIGCHLD + (void) bsd_signal (SIGCLD, SIG_DFL); +# endif +#endif + + /* Make sure stdout is line-buffered. */ + +#ifdef HAVE_SETVBUF +# ifdef SETVBUF_REVERSED + setvbuf (stdout, _IOLBF, xmalloc (BUFSIZ), BUFSIZ); +# else /* setvbuf not reversed. */ + /* Some buggy systems lose if we pass 0 instead of allocating ourselves. */ + setvbuf (stdout, 0, _IOLBF, BUFSIZ); +# endif /* setvbuf reversed. */ +#elif HAVE_SETLINEBUF + setlinebuf (stdout); +#endif /* setlinebuf missing. */ + + /* Figure out where this program lives. */ + + if (argv[0] == 0) + argv[0] = ""; + if (argv[0][0] == '\0') + program = "make"; + else + { +#ifdef VMS + program = strrchr (argv[0], ']'); +#else + program = strrchr (argv[0], '/'); +#endif +#if defined(__MSDOS__) || defined(__EMX__) + if (program == 0) + program = strrchr (argv[0], '\\'); + else + { + /* Some weird environments might pass us argv[0] with + both kinds of slashes; we must find the rightmost. */ + char *p = strrchr (argv[0], '\\'); + if (p && p > program) + program = p; + } + if (program == 0 && argv[0][1] == ':') + program = argv[0] + 1; +#endif +#ifdef WINDOWS32 + if (program == 0) + { + /* Extract program from full path */ + int argv0_len; + program = strrchr (argv[0], '\\'); + if (program) + { + argv0_len = strlen(program); + if (argv0_len > 4 && streq (&program[argv0_len - 4], ".exe")) + /* Remove .exe extension */ + program[argv0_len - 4] = '\0'; + } + } +#endif + if (program == 0) + program = argv[0]; + else + ++program; + } + + /* Set up to access user data (files). */ + user_access (); + + initialize_global_hash_tables (); + + /* Figure out where we are. */ + +#ifdef WINDOWS32 + if (getcwd_fs (current_directory, GET_PATH_MAX) == 0) +#else + if (getcwd (current_directory, GET_PATH_MAX) == 0) +#endif + { +#ifdef HAVE_GETCWD + perror_with_name ("getcwd", ""); +#else + error (NILF, "getwd: %s", current_directory); +#endif + current_directory[0] = '\0'; + directory_before_chdir = 0; + } + else + directory_before_chdir = xstrdup (current_directory); +#ifdef __MSDOS__ + /* Make sure we will return to the initial directory, come what may. */ + atexit (msdos_return_to_initial_directory); +#endif + + /* Initialize the special variables. */ + define_variable_cname (".VARIABLES", "", o_default, 0)->special = 1; + /* define_variable_cname (".TARGETS", "", o_default, 0)->special = 1; */ + define_variable_cname (".RECIPEPREFIX", "", o_default, 0)->special = 1; + define_variable_cname (".SHELLFLAGS", "-c", o_default, 0); + + /* Set up .FEATURES + We must do this in multiple calls because define_variable_cname() is + a macro and some compilers (MSVC) don't like conditionals in macros. */ + { + const char *features = "target-specific order-only second-expansion" + " else-if shortest-stem undefine" +#ifndef NO_ARCHIVES + " archives" +#endif +#ifdef MAKE_JOBSERVER + " jobserver" +#endif +#ifdef MAKE_SYMLINKS + " check-symlink" +#endif + ; + + define_variable_cname (".FEATURES", features, o_default, 0); + } + + /* Read in variables from the environment. It is important that this be + done before $(MAKE) is figured out so its definitions will not be + from the environment. */ + +#ifndef _AMIGA + { + unsigned int i; + + for (i = 0; envp[i] != 0; ++i) + { + int do_not_define = 0; + char *ep = envp[i]; + + while (*ep != '\0' && *ep != '=') + ++ep; +#ifdef WINDOWS32 + if (!unix_path && strneq(envp[i], "PATH=", 5)) + unix_path = ep+1; + else if (!strnicmp(envp[i], "Path=", 5)) { + do_not_define = 1; /* it gets defined after loop exits */ + if (!windows32_path) + windows32_path = ep+1; + } +#endif + /* The result of pointer arithmetic is cast to unsigned int for + machines where ptrdiff_t is a different size that doesn't widen + the same. */ + if (!do_not_define) + { + struct variable *v; + + v = define_variable (envp[i], (unsigned int) (ep - envp[i]), + ep + 1, o_env, 1); + /* Force exportation of every variable culled from the + environment. We used to rely on target_environment's + v_default code to do this. But that does not work for the + case where an environment variable is redefined in a makefile + with `override'; it should then still be exported, because it + was originally in the environment. */ + v->export = v_export; + + /* Another wrinkle is that POSIX says the value of SHELL set in + the makefile won't change the value of SHELL given to + subprocesses. */ + if (streq (v->name, "SHELL")) + { +#ifndef __MSDOS__ + v->export = v_noexport; +#endif + shell_var.name = "SHELL"; + shell_var.length = 5; + shell_var.value = xstrdup (ep + 1); + } + + /* If MAKE_RESTARTS is set, remember it but don't export it. */ + if (streq (v->name, "MAKE_RESTARTS")) + { + v->export = v_noexport; + restarts = (unsigned int) atoi (ep + 1); + } + } + } + } +#ifdef WINDOWS32 + /* If we didn't find a correctly spelled PATH we define PATH as + * either the first mispelled value or an empty string + */ + if (!unix_path) + define_variable_cname ("PATH", windows32_path ? windows32_path : "", + o_env, 1)->export = v_export; +#endif +#else /* For Amiga, read the ENV: device, ignoring all dirs */ + { + BPTR env, file, old; + char buffer[1024]; + int len; + __aligned struct FileInfoBlock fib; + + env = Lock ("ENV:", ACCESS_READ); + if (env) + { + old = CurrentDir (DupLock(env)); + Examine (env, &fib); + + while (ExNext (env, &fib)) + { + if (fib.fib_DirEntryType < 0) /* File */ + { + /* Define an empty variable. It will be filled in + variable_lookup(). Makes startup quite a bit + faster. */ + define_variable (fib.fib_FileName, + strlen (fib.fib_FileName), + "", o_env, 1)->export = v_export; + } + } + UnLock (env); + UnLock(CurrentDir(old)); + } + } +#endif + + /* Decode the switches. */ + + decode_env_switches (STRING_SIZE_TUPLE ("MAKEFLAGS")); +#if 0 + /* People write things like: + MFLAGS="CC=gcc -pipe" "CFLAGS=-g" + and we set the -p, -i and -e switches. Doesn't seem quite right. */ + decode_env_switches (STRING_SIZE_TUPLE ("MFLAGS")); +#endif + + decode_switches (argc, argv, 0); + +#ifdef WINDOWS32 + if (suspend_flag) { + fprintf(stderr, "%s (pid = %ld)\n", argv[0], GetCurrentProcessId()); + fprintf(stderr, _("%s is suspending for 30 seconds..."), argv[0]); + Sleep(30 * 1000); + fprintf(stderr, _("done sleep(30). Continuing.\n")); + } +#endif + + decode_debug_flags (); + + /* Set always_make_flag if -B was given and we've not restarted already. */ + always_make_flag = always_make_set && (restarts == 0); + + /* Print version information. */ + if (print_version_flag || print_data_base_flag || db_level) + { + print_version (); + + /* `make --version' is supposed to just print the version and exit. */ + if (print_version_flag) + die (0); + } + +#ifndef VMS + /* Set the "MAKE_COMMAND" variable to the name we were invoked with. + (If it is a relative pathname with a slash, prepend our directory name + so the result will run the same program regardless of the current dir. + If it is a name with no slash, we can only hope that PATH did not + find it in the current directory.) */ +#ifdef WINDOWS32 + /* + * Convert from backslashes to forward slashes for + * programs like sh which don't like them. Shouldn't + * matter if the path is one way or the other for + * CreateProcess(). + */ + if (strpbrk(argv[0], "/:\\") || + strstr(argv[0], "..") || + strneq(argv[0], "//", 2)) + argv[0] = xstrdup(w32ify(argv[0],1)); +#else /* WINDOWS32 */ +#if defined (__MSDOS__) || defined (__EMX__) + if (strchr (argv[0], '\\')) + { + char *p; + + argv[0] = xstrdup (argv[0]); + for (p = argv[0]; *p; p++) + if (*p == '\\') + *p = '/'; + } + /* If argv[0] is not in absolute form, prepend the current + directory. This can happen when Make is invoked by another DJGPP + program that uses a non-absolute name. */ + if (current_directory[0] != '\0' + && argv[0] != 0 + && (argv[0][0] != '/' && (argv[0][0] == '\0' || argv[0][1] != ':')) +# ifdef __EMX__ + /* do not prepend cwd if argv[0] contains no '/', e.g. "make" */ + && (strchr (argv[0], '/') != 0 || strchr (argv[0], '\\') != 0) +# endif + ) + argv[0] = xstrdup (concat (3, current_directory, "/", argv[0])); +#else /* !__MSDOS__ */ + if (current_directory[0] != '\0' + && argv[0] != 0 && argv[0][0] != '/' && strchr (argv[0], '/') != 0 +#ifdef HAVE_DOS_PATHS + && (argv[0][0] != '\\' && (!argv[0][0] || argv[0][1] != ':')) + && strchr (argv[0], '\\') != 0 +#endif + ) + argv[0] = xstrdup (concat (3, current_directory, "/", argv[0])); +#endif /* !__MSDOS__ */ +#endif /* WINDOWS32 */ +#endif + + /* The extra indirection through $(MAKE_COMMAND) is done + for hysterical raisins. */ + define_variable_cname ("MAKE_COMMAND", argv[0], o_default, 0); + define_variable_cname ("MAKE", "$(MAKE_COMMAND)", o_default, 1); + + if (command_variables != 0) + { + struct command_variable *cv; + struct variable *v; + unsigned int len = 0; + char *value, *p; + + /* Figure out how much space will be taken up by the command-line + variable definitions. */ + for (cv = command_variables; cv != 0; cv = cv->next) + { + v = cv->variable; + len += 2 * strlen (v->name); + if (! v->recursive) + ++len; + ++len; + len += 2 * strlen (v->value); + ++len; + } + + /* Now allocate a buffer big enough and fill it. */ + p = value = alloca (len); + for (cv = command_variables; cv != 0; cv = cv->next) + { + v = cv->variable; + p = quote_for_env (p, v->name); + if (! v->recursive) + *p++ = ':'; + *p++ = '='; + p = quote_for_env (p, v->value); + *p++ = ' '; + } + p[-1] = '\0'; /* Kill the final space and terminate. */ + + /* Define an unchangeable variable with a name that no POSIX.2 + makefile could validly use for its own variable. */ + define_variable_cname ("-*-command-variables-*-", value, o_automatic, 0); + + /* Define the variable; this will not override any user definition. + Normally a reference to this variable is written into the value of + MAKEFLAGS, allowing the user to override this value to affect the + exported value of MAKEFLAGS. In POSIX-pedantic mode, we cannot + allow the user's setting of MAKEOVERRIDES to affect MAKEFLAGS, so + a reference to this hidden variable is written instead. */ + define_variable_cname ("MAKEOVERRIDES", "${-*-command-variables-*-}", + o_env, 1); + } + + /* If there were -C flags, move ourselves about. */ + if (directories != 0) + { + unsigned int i; + for (i = 0; directories->list[i] != 0; ++i) + { + const char *dir = directories->list[i]; +#ifdef WINDOWS32 + /* WINDOWS32 chdir() doesn't work if the directory has a trailing '/' + But allow -C/ just in case someone wants that. */ + { + char *p = (char *)dir + strlen (dir) - 1; + while (p > dir && (p[0] == '/' || p[0] == '\\')) + --p; + p[1] = '\0'; + } +#endif + if (chdir (dir) < 0) + pfatal_with_name (dir); + } + } + +#ifdef WINDOWS32 + /* + * THIS BLOCK OF CODE MUST COME AFTER chdir() CALL ABOVE IN ORDER + * TO NOT CONFUSE THE DEPENDENCY CHECKING CODE IN implicit.c. + * + * The functions in dir.c can incorrectly cache information for "." + * before we have changed directory and this can cause file + * lookups to fail because the current directory (.) was pointing + * at the wrong place when it was first evaluated. + */ + no_default_sh_exe = !find_and_set_default_shell(NULL); + +#endif /* WINDOWS32 */ + /* Figure out the level of recursion. */ + { + struct variable *v = lookup_variable (STRING_SIZE_TUPLE (MAKELEVEL_NAME)); + if (v != 0 && v->value[0] != '\0' && v->value[0] != '-') + makelevel = (unsigned int) atoi (v->value); + else + makelevel = 0; + } + + /* Except under -s, always do -w in sub-makes and under -C. */ + if (!silent_flag && (directories != 0 || makelevel > 0)) + print_directory_flag = 1; + + /* Let the user disable that with --no-print-directory. */ + if (inhibit_print_directory_flag) + print_directory_flag = 0; + + /* If -R was given, set -r too (doesn't make sense otherwise!) */ + if (no_builtin_variables_flag) + no_builtin_rules_flag = 1; + + /* Construct the list of include directories to search. */ + + construct_include_path (include_directories == 0 + ? 0 : include_directories->list); + + /* Figure out where we are now, after chdir'ing. */ + if (directories == 0) + /* We didn't move, so we're still in the same place. */ + starting_directory = current_directory; + else + { +#ifdef WINDOWS32 + if (getcwd_fs (current_directory, GET_PATH_MAX) == 0) +#else + if (getcwd (current_directory, GET_PATH_MAX) == 0) +#endif + { +#ifdef HAVE_GETCWD + perror_with_name ("getcwd", ""); +#else + error (NILF, "getwd: %s", current_directory); +#endif + starting_directory = 0; + } + else + starting_directory = current_directory; + } + + define_variable_cname ("CURDIR", current_directory, o_file, 0); + + /* Read any stdin makefiles into temporary files. */ + + if (makefiles != 0) + { + unsigned int i; + for (i = 0; i < makefiles->idx; ++i) + if (makefiles->list[i][0] == '-' && makefiles->list[i][1] == '\0') + { + /* This makefile is standard input. Since we may re-exec + and thus re-read the makefiles, we read standard input + into a temporary file and read from that. */ + FILE *outfile; + char *template, *tmpdir; + + if (stdin_nm) + fatal (NILF, _("Makefile from standard input specified twice.")); + +#ifdef VMS +# define DEFAULT_TMPDIR "sys$scratch:" +#else +# ifdef P_tmpdir +# define DEFAULT_TMPDIR P_tmpdir +# else +# define DEFAULT_TMPDIR "/tmp" +# endif +#endif +#define DEFAULT_TMPFILE "GmXXXXXX" + + if (((tmpdir = getenv ("TMPDIR")) == NULL || *tmpdir == '\0') +#if defined (__MSDOS__) || defined (WINDOWS32) || defined (__EMX__) + /* These are also used commonly on these platforms. */ + && ((tmpdir = getenv ("TEMP")) == NULL || *tmpdir == '\0') + && ((tmpdir = getenv ("TMP")) == NULL || *tmpdir == '\0') +#endif + ) + tmpdir = DEFAULT_TMPDIR; + + template = alloca (strlen (tmpdir) + sizeof (DEFAULT_TMPFILE) + 1); + strcpy (template, tmpdir); + +#ifdef HAVE_DOS_PATHS + if (strchr ("/\\", template[strlen (template) - 1]) == NULL) + strcat (template, "/"); +#else +# ifndef VMS + if (template[strlen (template) - 1] != '/') + strcat (template, "/"); +# endif /* !VMS */ +#endif /* !HAVE_DOS_PATHS */ + + strcat (template, DEFAULT_TMPFILE); + outfile = open_tmpfile (&stdin_nm, template); + if (outfile == 0) + pfatal_with_name (_("fopen (temporary file)")); + while (!feof (stdin) && ! ferror (stdin)) + { + char buf[2048]; + unsigned int n = fread (buf, 1, sizeof (buf), stdin); + if (n > 0 && fwrite (buf, 1, n, outfile) != n) + pfatal_with_name (_("fwrite (temporary file)")); + } + fclose (outfile); + + /* Replace the name that read_all_makefiles will + see with the name of the temporary file. */ + makefiles->list[i] = strcache_add (stdin_nm); + + /* Make sure the temporary file will not be remade. */ + { + struct file *f = enter_file (strcache_add (stdin_nm)); + f->updated = 1; + f->update_status = 0; + f->command_state = cs_finished; + /* Can't be intermediate, or it'll be removed too early for + make re-exec. */ + f->intermediate = 0; + f->dontcare = 0; + } + } + } + +#ifndef __EMX__ /* Don't use a SIGCHLD handler for OS/2 */ +#if defined(MAKE_JOBSERVER) || !defined(HAVE_WAIT_NOHANG) + /* Set up to handle children dying. This must be done before + reading in the makefiles so that `shell' function calls will work. + + If we don't have a hanging wait we have to fall back to old, broken + functionality here and rely on the signal handler and counting + children. + + If we're using the jobs pipe we need a signal handler so that + SIGCHLD is not ignored; we need it to interrupt the read(2) of the + jobserver pipe in job.c if we're waiting for a token. + + If none of these are true, we don't need a signal handler at all. */ + { + RETSIGTYPE child_handler (int sig); +# if defined SIGCHLD + bsd_signal (SIGCHLD, child_handler); +# endif +# if defined SIGCLD && SIGCLD != SIGCHLD + bsd_signal (SIGCLD, child_handler); +# endif + } +#endif +#endif + + /* Let the user send us SIGUSR1 to toggle the -d flag during the run. */ +#ifdef SIGUSR1 + bsd_signal (SIGUSR1, debug_signal_handler); +#endif + + /* Define the initial list of suffixes for old-style rules. */ + + set_default_suffixes (); + + /* Define the file rules for the built-in suffix rules. These will later + be converted into pattern rules. We used to do this in + install_default_implicit_rules, but since that happens after reading + makefiles, it results in the built-in pattern rules taking precedence + over makefile-specified suffix rules, which is wrong. */ + + install_default_suffix_rules (); + + /* Define some internal and special variables. */ + + define_automatic_variables (); + + /* Set up the MAKEFLAGS and MFLAGS variables + so makefiles can look at them. */ + + define_makeflags (0, 0); + + /* Define the default variables. */ + define_default_variables (); + + default_file = enter_file (strcache_add (".DEFAULT")); + + default_goal_var = define_variable_cname (".DEFAULT_GOAL", "", o_file, 0); + + /* Evaluate all strings provided with --eval. + Also set up the $(-*-eval-flags-*-) variable. */ + + if (eval_strings) + { + char *p, *value; + unsigned int i; + unsigned int len = sizeof ("--eval=") * eval_strings->idx; + + for (i = 0; i < eval_strings->idx; ++i) + { + p = xstrdup (eval_strings->list[i]); + len += 2 * strlen (p); + eval_buffer (p); + free (p); + } + + p = value = alloca (len); + for (i = 0; i < eval_strings->idx; ++i) + { + strcpy (p, "--eval="); + p += strlen (p); + p = quote_for_env (p, eval_strings->list[i]); + *(p++) = ' '; + } + p[-1] = '\0'; + + define_variable_cname ("-*-eval-flags-*-", value, o_automatic, 0); + } + + /* Read all the makefiles. */ + + read_makefiles + = read_all_makefiles (makefiles == 0 ? 0 : makefiles->list); + +#ifdef WINDOWS32 + /* look one last time after reading all Makefiles */ + if (no_default_sh_exe) + no_default_sh_exe = !find_and_set_default_shell(NULL); +#endif /* WINDOWS32 */ + +#if defined (__MSDOS__) || defined (__EMX__) + /* We need to know what kind of shell we will be using. */ + { + extern int _is_unixy_shell (const char *_path); + struct variable *shv = lookup_variable (STRING_SIZE_TUPLE ("SHELL")); + extern int unixy_shell; + extern char *default_shell; + + if (shv && *shv->value) + { + char *shell_path = recursively_expand(shv); + + if (shell_path && _is_unixy_shell (shell_path)) + unixy_shell = 1; + else + unixy_shell = 0; + if (shell_path) + default_shell = shell_path; + } + } +#endif /* __MSDOS__ || __EMX__ */ + + /* Decode switches again, in case the variables were set by the makefile. */ + decode_env_switches (STRING_SIZE_TUPLE ("MAKEFLAGS")); +#if 0 + decode_env_switches (STRING_SIZE_TUPLE ("MFLAGS")); +#endif + +#if defined (__MSDOS__) || defined (__EMX__) + if (job_slots != 1 +# ifdef __EMX__ + && _osmode != OS2_MODE /* turn off -j if we are in DOS mode */ +# endif + ) + { + error (NILF, + _("Parallel jobs (-j) are not supported on this platform.")); + error (NILF, _("Resetting to single job (-j1) mode.")); + job_slots = 1; + } +#endif + +#ifdef MAKE_JOBSERVER + /* If the jobserver-fds option is seen, make sure that -j is reasonable. */ + + if (jobserver_fds) + { + const char *cp; + unsigned int ui; + + for (ui=1; ui < jobserver_fds->idx; ++ui) + if (!streq (jobserver_fds->list[0], jobserver_fds->list[ui])) + fatal (NILF, _("internal error: multiple --jobserver-fds options")); + + /* Now parse the fds string and make sure it has the proper format. */ + + cp = jobserver_fds->list[0]; + + if (sscanf (cp, "%d,%d", &job_fds[0], &job_fds[1]) != 2) + fatal (NILF, + _("internal error: invalid --jobserver-fds string `%s'"), cp); + + DB (DB_JOBS, + (_("Jobserver client (fds %d,%d)\n"), job_fds[0], job_fds[1])); + + /* The combination of a pipe + !job_slots means we're using the + jobserver. If !job_slots and we don't have a pipe, we can start + infinite jobs. If we see both a pipe and job_slots >0 that means the + user set -j explicitly. This is broken; in this case obey the user + (ignore the jobserver pipe for this make) but print a message. */ + + if (job_slots > 0) + error (NILF, + _("warning: -jN forced in submake: disabling jobserver mode.")); + + /* Create a duplicate pipe, that will be closed in the SIGCHLD + handler. If this fails with EBADF, the parent has closed the pipe + on us because it didn't think we were a submake. If so, print a + warning then default to -j1. */ + + else if ((job_rfd = dup (job_fds[0])) < 0) + { + if (errno != EBADF) + pfatal_with_name (_("dup jobserver")); + + error (NILF, + _("warning: jobserver unavailable: using -j1. Add `+' to parent make rule.")); + job_slots = 1; + } + + if (job_slots > 0) + { + close (job_fds[0]); + close (job_fds[1]); + job_fds[0] = job_fds[1] = -1; + free (jobserver_fds->list); + free (jobserver_fds); + jobserver_fds = 0; + } + } + + /* If we have >1 slot but no jobserver-fds, then we're a top-level make. + Set up the pipe and install the fds option for our children. */ + + if (job_slots > 1) + { + char *cp; + char c = '+'; + + if (pipe (job_fds) < 0 || (job_rfd = dup (job_fds[0])) < 0) + pfatal_with_name (_("creating jobs pipe")); + + /* Every make assumes that it always has one job it can run. For the + submakes it's the token they were given by their parent. For the + top make, we just subtract one from the number the user wants. We + want job_slots to be 0 to indicate we're using the jobserver. */ + + master_job_slots = job_slots; + + while (--job_slots) + { + int r; + + EINTRLOOP (r, write (job_fds[1], &c, 1)); + if (r != 1) + pfatal_with_name (_("init jobserver pipe")); + } + + /* Fill in the jobserver_fds struct for our children. */ + + cp = xmalloc ((sizeof ("1024")*2)+1); + sprintf (cp, "%d,%d", job_fds[0], job_fds[1]); + + jobserver_fds = (struct stringlist *) + xmalloc (sizeof (struct stringlist)); + jobserver_fds->list = xmalloc (sizeof (char *)); + jobserver_fds->list[0] = cp; + jobserver_fds->idx = 1; + jobserver_fds->max = 1; + } +#endif + +#ifndef MAKE_SYMLINKS + if (check_symlink_flag) + { + error (NILF, _("Symbolic links not supported: disabling -L.")); + check_symlink_flag = 0; + } +#endif + + /* Set up MAKEFLAGS and MFLAGS again, so they will be right. */ + + define_makeflags (1, 0); + + /* Make each `struct dep' point at the `struct file' for the file + depended on. Also do magic for special targets. */ + + snap_deps (); + + /* Convert old-style suffix rules to pattern rules. It is important to + do this before installing the built-in pattern rules below, so that + makefile-specified suffix rules take precedence over built-in pattern + rules. */ + + convert_to_pattern (); + + /* Install the default implicit pattern rules. + This used to be done before reading the makefiles. + But in that case, built-in pattern rules were in the chain + before user-defined ones, so they matched first. */ + + install_default_implicit_rules (); + + /* Compute implicit rule limits. */ + + count_implicit_rule_limits (); + + /* Construct the listings of directories in VPATH lists. */ + + build_vpath_lists (); + + /* Mark files given with -o flags as very old and as having been updated + already, and files given with -W flags as brand new (time-stamp as far + as possible into the future). If restarts is set we'll do -W later. */ + + if (old_files != 0) + { + const char **p; + for (p = old_files->list; *p != 0; ++p) + { + struct file *f = enter_file (*p); + f->last_mtime = f->mtime_before_update = OLD_MTIME; + f->updated = 1; + f->update_status = 0; + f->command_state = cs_finished; + } + } + + if (!restarts && new_files != 0) + { + const char **p; + for (p = new_files->list; *p != 0; ++p) + { + struct file *f = enter_file (*p); + f->last_mtime = f->mtime_before_update = NEW_MTIME; + } + } + + /* Initialize the remote job module. */ + remote_setup (); + + if (read_makefiles != 0) + { + /* Update any makefiles if necessary. */ + + FILE_TIMESTAMP *makefile_mtimes = 0; + unsigned int mm_idx = 0; + char **nargv; + int nargc; + int orig_db_level = db_level; + int status; + + if (! ISDB (DB_MAKEFILES)) + db_level = DB_NONE; + + DB (DB_BASIC, (_("Updating makefiles....\n"))); + + /* Remove any makefiles we don't want to try to update. + Also record the current modtimes so we can compare them later. */ + { + register struct dep *d, *last; + last = 0; + d = read_makefiles; + while (d != 0) + { + struct file *f = d->file; + if (f->double_colon) + for (f = f->double_colon; f != NULL; f = f->prev) + { + if (f->deps == 0 && f->cmds != 0) + { + /* This makefile is a :: target with commands, but + no dependencies. So, it will always be remade. + This might well cause an infinite loop, so don't + try to remake it. (This will only happen if + your makefiles are written exceptionally + stupidly; but if you work for Athena, that's how + you write your makefiles.) */ + + DB (DB_VERBOSE, + (_("Makefile `%s' might loop; not remaking it.\n"), + f->name)); + + if (last == 0) + read_makefiles = d->next; + else + last->next = d->next; + + /* Free the storage. */ + free_dep (d); + + d = last == 0 ? read_makefiles : last->next; + + break; + } + } + if (f == NULL || !f->double_colon) + { + makefile_mtimes = xrealloc (makefile_mtimes, + (mm_idx+1) + * sizeof (FILE_TIMESTAMP)); + makefile_mtimes[mm_idx++] = file_mtime_no_search (d->file); + last = d; + d = d->next; + } + } + } + + /* Set up `MAKEFLAGS' specially while remaking makefiles. */ + define_makeflags (1, 1); + + rebuilding_makefiles = 1; + status = update_goal_chain (read_makefiles); + rebuilding_makefiles = 0; + + switch (status) + { + case 1: + /* The only way this can happen is if the user specified -q and asked + * for one of the makefiles to be remade as a target on the command + * line. Since we're not actually updating anything with -q we can + * treat this as "did nothing". + */ + + case -1: + /* Did nothing. */ + break; + + case 2: + /* Failed to update. Figure out if we care. */ + { + /* Nonzero if any makefile was successfully remade. */ + int any_remade = 0; + /* Nonzero if any makefile we care about failed + in updating or could not be found at all. */ + int any_failed = 0; + unsigned int i; + struct dep *d; + + for (i = 0, d = read_makefiles; d != 0; ++i, d = d->next) + { + /* Reset the considered flag; we may need to look at the file + again to print an error. */ + d->file->considered = 0; + + if (d->file->updated) + { + /* This makefile was updated. */ + if (d->file->update_status == 0) + { + /* It was successfully updated. */ + any_remade |= (file_mtime_no_search (d->file) + != makefile_mtimes[i]); + } + else if (! (d->changed & RM_DONTCARE)) + { + FILE_TIMESTAMP mtime; + /* The update failed and this makefile was not + from the MAKEFILES variable, so we care. */ + error (NILF, _("Failed to remake makefile `%s'."), + d->file->name); + mtime = file_mtime_no_search (d->file); + any_remade |= (mtime != NONEXISTENT_MTIME + && mtime != makefile_mtimes[i]); + makefile_status = MAKE_FAILURE; + } + } + else + /* This makefile was not found at all. */ + if (! (d->changed & RM_DONTCARE)) + { + /* This is a makefile we care about. See how much. */ + if (d->changed & RM_INCLUDED) + /* An included makefile. We don't need + to die, but we do want to complain. */ + error (NILF, + _("Included makefile `%s' was not found."), + dep_name (d)); + else + { + /* A normal makefile. We must die later. */ + error (NILF, _("Makefile `%s' was not found"), + dep_name (d)); + any_failed = 1; + } + } + } + /* Reset this to empty so we get the right error message below. */ + read_makefiles = 0; + + if (any_remade) + goto re_exec; + if (any_failed) + die (2); + break; + } + + case 0: + re_exec: + /* Updated successfully. Re-exec ourselves. */ + + remove_intermediates (0); + + if (print_data_base_flag) + print_data_base (); + + log_working_directory (0); + + clean_jobserver (0); + + if (makefiles != 0) + { + /* These names might have changed. */ + int i, j = 0; + for (i = 1; i < argc; ++i) + if (strneq (argv[i], "-f", 2)) /* XXX */ + { + if (argv[i][2] == '\0') + /* This cast is OK since we never modify argv. */ + argv[++i] = (char *) makefiles->list[j]; + else + argv[i] = xstrdup (concat (2, "-f", makefiles->list[j])); + ++j; + } + } + + /* Add -o option for the stdin temporary file, if necessary. */ + nargc = argc; + if (stdin_nm) + { + nargv = xmalloc ((nargc + 2) * sizeof (char *)); + memcpy (nargv, argv, argc * sizeof (char *)); + nargv[nargc++] = xstrdup (concat (2, "-o", stdin_nm)); + nargv[nargc] = 0; + } + else + nargv = argv; + + if (directories != 0 && directories->idx > 0) + { + int bad = 1; + if (directory_before_chdir != 0) + { + if (chdir (directory_before_chdir) < 0) + perror_with_name ("chdir", ""); + else + bad = 0; + } + if (bad) + fatal (NILF, _("Couldn't change back to original directory.")); + } + + ++restarts; + + /* Reset makeflags in case they were changed. */ + { + const char *pv = define_makeflags (1, 1); + char *p = alloca (sizeof ("MAKEFLAGS=") + strlen (pv) + 1); + sprintf (p, "MAKEFLAGS=%s", pv); + putenv (p); + } + + if (ISDB (DB_BASIC)) + { + char **p; + printf (_("Re-executing[%u]:"), restarts); + for (p = nargv; *p != 0; ++p) + printf (" %s", *p); + putchar ('\n'); + } + +#ifndef _AMIGA + { + char **p; + for (p = environ; *p != 0; ++p) + { + if (strneq (*p, MAKELEVEL_NAME, MAKELEVEL_LENGTH) + && (*p)[MAKELEVEL_LENGTH] == '=') + { + *p = alloca (40); + sprintf (*p, "%s=%u", MAKELEVEL_NAME, makelevel); + } + if (strneq (*p, "MAKE_RESTARTS=", 14)) + { + *p = alloca (40); + sprintf (*p, "MAKE_RESTARTS=%u", restarts); + restarts = 0; + } + } + } +#else /* AMIGA */ + { + char buffer[256]; + + sprintf (buffer, "%u", makelevel); + SetVar (MAKELEVEL_NAME, buffer, -1, GVF_GLOBAL_ONLY); + + sprintf (buffer, "%u", restarts); + SetVar ("MAKE_RESTARTS", buffer, -1, GVF_GLOBAL_ONLY); + restarts = 0; + } +#endif + + /* If we didn't set the restarts variable yet, add it. */ + if (restarts) + { + char *b = alloca (40); + sprintf (b, "MAKE_RESTARTS=%u", restarts); + putenv (b); + } + + fflush (stdout); + fflush (stderr); + + /* Close the dup'd jobserver pipe if we opened one. */ + if (job_rfd >= 0) + close (job_rfd); + +#ifdef _AMIGA + exec_command (nargv); + exit (0); +#elif defined (__EMX__) + { + /* It is not possible to use execve() here because this + would cause the parent process to be terminated with + exit code 0 before the child process has been terminated. + Therefore it may be the best solution simply to spawn the + child process including all file handles and to wait for its + termination. */ + int pid; + int status; + pid = child_execute_job (0, 1, nargv, environ); + + /* is this loop really necessary? */ + do { + pid = wait (&status); + } while (pid <= 0); + /* use the exit code of the child process */ + exit (WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE); + } +#else + exec_command (nargv, environ); +#endif + /* NOTREACHED */ + + default: +#define BOGUS_UPDATE_STATUS 0 + assert (BOGUS_UPDATE_STATUS); + break; + } + + db_level = orig_db_level; + + /* Free the makefile mtimes (if we allocated any). */ + if (makefile_mtimes) + free (makefile_mtimes); + } + + /* Set up `MAKEFLAGS' again for the normal targets. */ + define_makeflags (1, 0); + + /* Set always_make_flag if -B was given. */ + always_make_flag = always_make_set; + + /* If restarts is set we haven't set up -W files yet, so do that now. */ + if (restarts && new_files != 0) + { + const char **p; + for (p = new_files->list; *p != 0; ++p) + { + struct file *f = enter_file (*p); + f->last_mtime = f->mtime_before_update = NEW_MTIME; + } + } + + /* If there is a temp file from reading a makefile from stdin, get rid of + it now. */ + if (stdin_nm && unlink (stdin_nm) < 0 && errno != ENOENT) + perror_with_name (_("unlink (temporary file): "), stdin_nm); + + /* If there were no command-line goals, use the default. */ + if (goals == 0) + { + char *p; + + if (default_goal_var->recursive) + p = variable_expand (default_goal_var->value); + else + { + p = variable_buffer_output (variable_buffer, default_goal_var->value, + strlen (default_goal_var->value)); + *p = '\0'; + p = variable_buffer; + } + + if (*p != '\0') + { + struct file *f = lookup_file (p); + + /* If .DEFAULT_GOAL is a non-existent target, enter it into the + table and let the standard logic sort it out. */ + if (f == 0) + { + struct nameseq *ns; + + ns = PARSE_FILE_SEQ (&p, struct nameseq, '\0', NULL, 0); + if (ns) + { + /* .DEFAULT_GOAL should contain one target. */ + if (ns->next != 0) + fatal (NILF, _(".DEFAULT_GOAL contains more than one target")); + + f = enter_file (strcache_add (ns->name)); + + ns->name = 0; /* It was reused by enter_file(). */ + free_ns_chain (ns); + } + } + + if (f) + { + goals = alloc_dep (); + goals->file = f; + } + } + } + else + lastgoal->next = 0; + + + if (!goals) + { + if (read_makefiles == 0) + fatal (NILF, _("No targets specified and no makefile found")); + + fatal (NILF, _("No targets")); + } + + /* Update the goals. */ + + DB (DB_BASIC, (_("Updating goal targets....\n"))); + + { + int status; + + switch (update_goal_chain (goals)) + { + case -1: + /* Nothing happened. */ + case 0: + /* Updated successfully. */ + status = makefile_status; + break; + case 1: + /* We are under -q and would run some commands. */ + status = MAKE_TROUBLE; + break; + case 2: + /* Updating failed. POSIX.2 specifies exit status >1 for this; + but in VMS, there is only success and failure. */ + status = MAKE_FAILURE; + break; + default: + abort (); + } + + /* If we detected some clock skew, generate one last warning */ + if (clock_skew_detected) + error (NILF, + _("warning: Clock skew detected. Your build may be incomplete.")); + + /* Exit. */ + die (status); + } + + /* NOTREACHED */ + return 0; +} + +/* Parsing of arguments, decoding of switches. */ + +static char options[1 + sizeof (switches) / sizeof (switches[0]) * 3]; +static struct option long_options[(sizeof (switches) / sizeof (switches[0])) + + (sizeof (long_option_aliases) / + sizeof (long_option_aliases[0]))]; + +/* Fill in the string and vector for getopt. */ +static void +init_switches (void) +{ + char *p; + unsigned int c; + unsigned int i; + + if (options[0] != '\0') + /* Already done. */ + return; + + p = options; + + /* Return switch and non-switch args in order, regardless of + POSIXLY_CORRECT. Non-switch args are returned as option 1. */ + *p++ = '-'; + + for (i = 0; switches[i].c != '\0'; ++i) + { + long_options[i].name = (switches[i].long_name == 0 ? "" : + switches[i].long_name); + long_options[i].flag = 0; + long_options[i].val = switches[i].c; + if (short_option (switches[i].c)) + *p++ = switches[i].c; + switch (switches[i].type) + { + case flag: + case flag_off: + case ignore: + long_options[i].has_arg = no_argument; + break; + + case string: + case filename: + case positive_int: + case floating: + if (short_option (switches[i].c)) + *p++ = ':'; + if (switches[i].noarg_value != 0) + { + if (short_option (switches[i].c)) + *p++ = ':'; + long_options[i].has_arg = optional_argument; + } + else + long_options[i].has_arg = required_argument; + break; + } + } + *p = '\0'; + for (c = 0; c < (sizeof (long_option_aliases) / + sizeof (long_option_aliases[0])); + ++c) + long_options[i++] = long_option_aliases[c]; + long_options[i].name = 0; +} + +static void +handle_non_switch_argument (char *arg, int env) +{ + /* Non-option argument. It might be a variable definition. */ + struct variable *v; + if (arg[0] == '-' && arg[1] == '\0') + /* Ignore plain `-' for compatibility. */ + return; + v = try_variable_definition (0, arg, o_command, 0); + if (v != 0) + { + /* It is indeed a variable definition. If we don't already have this + one, record a pointer to the variable for later use in + define_makeflags. */ + struct command_variable *cv; + + for (cv = command_variables; cv != 0; cv = cv->next) + if (cv->variable == v) + break; + + if (! cv) { + cv = xmalloc (sizeof (*cv)); + cv->variable = v; + cv->next = command_variables; + command_variables = cv; + } + } + else if (! env) + { + /* Not an option or variable definition; it must be a goal + target! Enter it as a file and add it to the dep chain of + goals. */ + struct file *f = enter_file (strcache_add (expand_command_line_file (arg))); + f->cmd_target = 1; + + if (goals == 0) + { + goals = alloc_dep (); + lastgoal = goals; + } + else + { + lastgoal->next = alloc_dep (); + lastgoal = lastgoal->next; + } + + lastgoal->file = f; + + { + /* Add this target name to the MAKECMDGOALS variable. */ + struct variable *gv; + const char *value; + + gv = lookup_variable (STRING_SIZE_TUPLE ("MAKECMDGOALS")); + if (gv == 0) + value = f->name; + else + { + /* Paste the old and new values together */ + unsigned int oldlen, newlen; + char *vp; + + oldlen = strlen (gv->value); + newlen = strlen (f->name); + vp = alloca (oldlen + 1 + newlen + 1); + memcpy (vp, gv->value, oldlen); + vp[oldlen] = ' '; + memcpy (&vp[oldlen + 1], f->name, newlen + 1); + value = vp; + } + define_variable_cname ("MAKECMDGOALS", value, o_default, 0); + } + } +} + +/* Print a nice usage method. */ + +static void +print_usage (int bad) +{ + const char *const *cpp; + FILE *usageto; + + if (print_version_flag) + print_version (); + + usageto = bad ? stderr : stdout; + + fprintf (usageto, _("Usage: %s [options] [target] ...\n"), program); + + for (cpp = usage; *cpp; ++cpp) + fputs (_(*cpp), usageto); + + if (!remote_description || *remote_description == '\0') + fprintf (usageto, _("\nThis program built for %s\n"), make_host); + else + fprintf (usageto, _("\nThis program built for %s (%s)\n"), + make_host, remote_description); + + fprintf (usageto, _("Report bugs to \n")); +} + +/* Decode switches from ARGC and ARGV. + They came from the environment if ENV is nonzero. */ + +static void +decode_switches (int argc, char **argv, int env) +{ + int bad = 0; + register const struct command_switch *cs; + register struct stringlist *sl; + register int c; + + /* getopt does most of the parsing for us. + First, get its vectors set up. */ + + init_switches (); + + /* Let getopt produce error messages for the command line, + but not for options from the environment. */ + opterr = !env; + /* Reset getopt's state. */ + optind = 0; + + while (optind < argc) + { + /* Parse the next argument. */ + c = getopt_long (argc, argv, options, long_options, (int *) 0); + if (c == EOF) + /* End of arguments, or "--" marker seen. */ + break; + else if (c == 1) + /* An argument not starting with a dash. */ + handle_non_switch_argument (optarg, env); + else if (c == '?') + /* Bad option. We will print a usage message and die later. + But continue to parse the other options so the user can + see all he did wrong. */ + bad = 1; + else + for (cs = switches; cs->c != '\0'; ++cs) + if (cs->c == c) + { + /* Whether or not we will actually do anything with + this switch. We test this individually inside the + switch below rather than just once outside it, so that + options which are to be ignored still consume args. */ + int doit = !env || cs->env; + + switch (cs->type) + { + default: + abort (); + + case ignore: + break; + + case flag: + case flag_off: + if (doit) + *(int *) cs->value_ptr = cs->type == flag; + break; + + case string: + case filename: + if (!doit) + break; + + if (optarg == 0) + optarg = xstrdup (cs->noarg_value); + else if (*optarg == '\0') + { + char opt[2] = "c"; + const char *op = opt; + + if (short_option (cs->c)) + opt[0] = cs->c; + else + op = cs->long_name; + + error (NILF, _("the `%s%s' option requires a non-empty string argument"), + short_option (cs->c) ? "-" : "--", op); + bad = 1; + } + + sl = *(struct stringlist **) cs->value_ptr; + if (sl == 0) + { + sl = (struct stringlist *) + xmalloc (sizeof (struct stringlist)); + sl->max = 5; + sl->idx = 0; + sl->list = xmalloc (5 * sizeof (char *)); + *(struct stringlist **) cs->value_ptr = sl; + } + else if (sl->idx == sl->max - 1) + { + sl->max += 5; + /* MSVC erroneously warns without a cast here. */ + sl->list = xrealloc ((void *)sl->list, + sl->max * sizeof (char *)); + } + if (cs->type == filename) + sl->list[sl->idx++] = expand_command_line_file (optarg); + else + sl->list[sl->idx++] = optarg; + sl->list[sl->idx] = 0; + break; + + case positive_int: + /* See if we have an option argument; if we do require that + it's all digits, not something like "10foo". */ + if (optarg == 0 && argc > optind) + { + const char *cp; + for (cp=argv[optind]; ISDIGIT (cp[0]); ++cp) + ; + if (cp[0] == '\0') + optarg = argv[optind++]; + } + + if (!doit) + break; + + if (optarg != 0) + { + int i = atoi (optarg); + const char *cp; + + /* Yes, I realize we're repeating this in some cases. */ + for (cp = optarg; ISDIGIT (cp[0]); ++cp) + ; + + if (i < 1 || cp[0] != '\0') + { + error (NILF, _("the `-%c' option requires a positive integral argument"), + cs->c); + bad = 1; + } + else + *(unsigned int *) cs->value_ptr = i; + } + else + *(unsigned int *) cs->value_ptr + = *(unsigned int *) cs->noarg_value; + break; + +#ifndef NO_FLOAT + case floating: + if (optarg == 0 && optind < argc + && (ISDIGIT (argv[optind][0]) || argv[optind][0] == '.')) + optarg = argv[optind++]; + + if (doit) + *(double *) cs->value_ptr + = (optarg != 0 ? atof (optarg) + : *(double *) cs->noarg_value); + + break; +#endif + } + + /* We've found the switch. Stop looking. */ + break; + } + } + + /* There are no more options according to getting getopt, but there may + be some arguments left. Since we have asked for non-option arguments + to be returned in order, this only happens when there is a "--" + argument to prevent later arguments from being options. */ + while (optind < argc) + handle_non_switch_argument (argv[optind++], env); + + + if (!env && (bad || print_usage_flag)) + { + print_usage (bad); + die (bad ? 2 : 0); + } +} + +/* Decode switches from environment variable ENVAR (which is LEN chars long). + We do this by chopping the value into a vector of words, prepending a + dash to the first word if it lacks one, and passing the vector to + decode_switches. */ + +static void +decode_env_switches (char *envar, unsigned int len) +{ + char *varref = alloca (2 + len + 2); + char *value, *p; + int argc; + char **argv; + + /* Get the variable's value. */ + varref[0] = '$'; + varref[1] = '('; + memcpy (&varref[2], envar, len); + varref[2 + len] = ')'; + varref[2 + len + 1] = '\0'; + value = variable_expand (varref); + + /* Skip whitespace, and check for an empty value. */ + value = next_token (value); + len = strlen (value); + if (len == 0) + return; + + /* Allocate a vector that is definitely big enough. */ + argv = alloca ((1 + len + 1) * sizeof (char *)); + + /* Allocate a buffer to copy the value into while we split it into words + and unquote it. We must use permanent storage for this because + decode_switches may store pointers into the passed argument words. */ + p = xmalloc (2 * len); + + /* getopt will look at the arguments starting at ARGV[1]. + Prepend a spacer word. */ + argv[0] = 0; + argc = 1; + argv[argc] = p; + while (*value != '\0') + { + if (*value == '\\' && value[1] != '\0') + ++value; /* Skip the backslash. */ + else if (isblank ((unsigned char)*value)) + { + /* End of the word. */ + *p++ = '\0'; + argv[++argc] = p; + do + ++value; + while (isblank ((unsigned char)*value)); + continue; + } + *p++ = *value++; + } + *p = '\0'; + argv[++argc] = 0; + + if (argv[1][0] != '-' && strchr (argv[1], '=') == 0) + /* The first word doesn't start with a dash and isn't a variable + definition. Add a dash and pass it along to decode_switches. We + need permanent storage for this in case decode_switches saves + pointers into the value. */ + argv[1] = xstrdup (concat (2, "-", argv[1])); + + /* Parse those words. */ + decode_switches (argc, argv, 1); +} + +/* Quote the string IN so that it will be interpreted as a single word with + no magic by decode_env_switches; also double dollar signs to avoid + variable expansion in make itself. Write the result into OUT, returning + the address of the next character to be written. + Allocating space for OUT twice the length of IN is always sufficient. */ + +static char * +quote_for_env (char *out, const char *in) +{ + while (*in != '\0') + { + if (*in == '$') + *out++ = '$'; + else if (isblank ((unsigned char)*in) || *in == '\\') + *out++ = '\\'; + *out++ = *in++; + } + + return out; +} + +/* Define the MAKEFLAGS and MFLAGS variables to reflect the settings of the + command switches. Include options with args if ALL is nonzero. + Don't include options with the `no_makefile' flag set if MAKEFILE. */ + +static const char * +define_makeflags (int all, int makefile) +{ + const char ref[] = "$(MAKEOVERRIDES)"; + const char posixref[] = "$(-*-command-variables-*-)"; + const char evalref[] = "$(-*-eval-flags-*-)"; + const struct command_switch *cs; + char *flagstring; + register char *p; + unsigned int words; + struct variable *v; + + /* We will construct a linked list of `struct flag's describing + all the flags which need to go in MAKEFLAGS. Then, once we + know how many there are and their lengths, we can put them all + together in a string. */ + + struct flag + { + struct flag *next; + const struct command_switch *cs; + const char *arg; + }; + struct flag *flags = 0; + unsigned int flagslen = 0; +#define ADD_FLAG(ARG, LEN) \ + do { \ + struct flag *new = alloca (sizeof (struct flag)); \ + new->cs = cs; \ + new->arg = (ARG); \ + new->next = flags; \ + flags = new; \ + if (new->arg == 0) \ + ++flagslen; /* Just a single flag letter. */ \ + else \ + /* " -x foo", plus space to expand "foo". */ \ + flagslen += 1 + 1 + 1 + 1 + (3 * (LEN)); \ + if (!short_option (cs->c)) \ + /* This switch has no single-letter version, so we use the long. */ \ + flagslen += 2 + strlen (cs->long_name); \ + } while (0) + + for (cs = switches; cs->c != '\0'; ++cs) + if (cs->toenv && (!makefile || !cs->no_makefile)) + switch (cs->type) + { + case ignore: + break; + + case flag: + case flag_off: + if (!*(int *) cs->value_ptr == (cs->type == flag_off) + && (cs->default_value == 0 + || *(int *) cs->value_ptr != *(int *) cs->default_value)) + ADD_FLAG (0, 0); + break; + + case positive_int: + if (all) + { + if ((cs->default_value != 0 + && (*(unsigned int *) cs->value_ptr + == *(unsigned int *) cs->default_value))) + break; + else if (cs->noarg_value != 0 + && (*(unsigned int *) cs->value_ptr == + *(unsigned int *) cs->noarg_value)) + ADD_FLAG ("", 0); /* Optional value omitted; see below. */ + else if (cs->c == 'j') + /* Special case for `-j'. */ + ADD_FLAG ("1", 1); + else + { + char *buf = alloca (30); + sprintf (buf, "%u", *(unsigned int *) cs->value_ptr); + ADD_FLAG (buf, strlen (buf)); + } + } + break; + +#ifndef NO_FLOAT + case floating: + if (all) + { + if (cs->default_value != 0 + && (*(double *) cs->value_ptr + == *(double *) cs->default_value)) + break; + else if (cs->noarg_value != 0 + && (*(double *) cs->value_ptr + == *(double *) cs->noarg_value)) + ADD_FLAG ("", 0); /* Optional value omitted; see below. */ + else + { + char *buf = alloca (100); + sprintf (buf, "%g", *(double *) cs->value_ptr); + ADD_FLAG (buf, strlen (buf)); + } + } + break; +#endif + + case filename: + case string: + if (all) + { + struct stringlist *sl = *(struct stringlist **) cs->value_ptr; + if (sl != 0) + { + /* Add the elements in reverse order, because all the flags + get reversed below; and the order matters for some + switches (like -I). */ + unsigned int i = sl->idx; + while (i-- > 0) + ADD_FLAG (sl->list[i], strlen (sl->list[i])); + } + } + break; + + default: + abort (); + } + + /* Four more for the possible " -- ". */ + flagslen += 4 + sizeof (posixref) + sizeof (evalref); + +#undef ADD_FLAG + + /* Construct the value in FLAGSTRING. + We allocate enough space for a preceding dash and trailing null. */ + flagstring = alloca (1 + flagslen + 1); + memset (flagstring, '\0', 1 + flagslen + 1); + p = flagstring; + words = 1; + *p++ = '-'; + while (flags != 0) + { + /* Add the flag letter or name to the string. */ + if (short_option (flags->cs->c)) + *p++ = flags->cs->c; + else + { + if (*p != '-') + { + *p++ = ' '; + *p++ = '-'; + } + *p++ = '-'; + strcpy (p, flags->cs->long_name); + p += strlen (p); + } + if (flags->arg != 0) + { + /* A flag that takes an optional argument which in this case is + omitted is specified by ARG being "". We must distinguish + because a following flag appended without an intervening " -" + is considered the arg for the first. */ + if (flags->arg[0] != '\0') + { + /* Add its argument too. */ + *p++ = !short_option (flags->cs->c) ? '=' : ' '; + p = quote_for_env (p, flags->arg); + } + ++words; + /* Write a following space and dash, for the next flag. */ + *p++ = ' '; + *p++ = '-'; + } + else if (!short_option (flags->cs->c)) + { + ++words; + /* Long options must each go in their own word, + so we write the following space and dash. */ + *p++ = ' '; + *p++ = '-'; + } + flags = flags->next; + } + + /* Define MFLAGS before appending variable definitions. */ + + if (p == &flagstring[1]) + /* No flags. */ + flagstring[0] = '\0'; + else if (p[-1] == '-') + { + /* Kill the final space and dash. */ + p -= 2; + *p = '\0'; + } + else + /* Terminate the string. */ + *p = '\0'; + + /* Since MFLAGS is not parsed for flags, there is no reason to + override any makefile redefinition. */ + define_variable_cname ("MFLAGS", flagstring, o_env, 1); + + /* Write a reference to -*-eval-flags-*-, which contains all the --eval + flag options. */ + if (eval_strings) + { + if (p == &flagstring[1]) + /* No flags written, so elide the leading dash already written. */ + p = flagstring; + else + *p++ = ' '; + memcpy (p, evalref, sizeof (evalref) - 1); + p += sizeof (evalref) - 1; + } + + if (all && command_variables != 0) + { + /* Now write a reference to $(MAKEOVERRIDES), which contains all the + command-line variable definitions. */ + + if (p == &flagstring[1]) + /* No flags written, so elide the leading dash already written. */ + p = flagstring; + else + { + /* Separate the variables from the switches with a "--" arg. */ + if (p[-1] != '-') + { + /* We did not already write a trailing " -". */ + *p++ = ' '; + *p++ = '-'; + } + /* There is a trailing " -"; fill it out to " -- ". */ + *p++ = '-'; + *p++ = ' '; + } + + /* Copy in the string. */ + if (posix_pedantic) + { + memcpy (p, posixref, sizeof (posixref) - 1); + p += sizeof (posixref) - 1; + } + else + { + memcpy (p, ref, sizeof (ref) - 1); + p += sizeof (ref) - 1; + } + } + else if (p == &flagstring[1]) + { + words = 0; + --p; + } + else if (p[-1] == '-') + /* Kill the final space and dash. */ + p -= 2; + /* Terminate the string. */ + *p = '\0'; + + /* If there are switches, omit the leading dash unless it is a single long + option with two leading dashes. */ + if (flagstring[0] == '-' && flagstring[1] != '-') + ++flagstring; + + v = define_variable_cname ("MAKEFLAGS", flagstring, + /* This used to use o_env, but that lost when a + makefile defined MAKEFLAGS. Makefiles set + MAKEFLAGS to add switches, but we still want + to redefine its value with the full set of + switches. Of course, an override or command + definition will still take precedence. */ + o_file, 1); + + if (! all) + /* The first time we are called, set MAKEFLAGS to always be exported. + We should not do this again on the second call, because that is + after reading makefiles which might have done `unexport MAKEFLAGS'. */ + v->export = v_export; + + return v->value; +} + +/* Print version information. */ + +static void +print_version (void) +{ + static int printed_version = 0; + + char *precede = print_data_base_flag ? "# " : ""; + + if (printed_version) + /* Do it only once. */ + return; + + printf ("%sGNU Make %s\n", precede, version_string); + + if (!remote_description || *remote_description == '\0') + printf (_("%sBuilt for %s\n"), precede, make_host); + else + printf (_("%sBuilt for %s (%s)\n"), + precede, make_host, remote_description); + + /* Print this untranslated. The coding standards recommend translating the + (C) to the copyright symbol, but this string is going to change every + year, and none of the rest of it should be translated (including the + word "Copyright", so it hardly seems worth it. */ + + printf ("%sCopyright (C) 2010 Free Software Foundation, Inc.\n", precede); + + printf (_("%sLicense GPLv3+: GNU GPL version 3 or later \n\ +%sThis is free software: you are free to change and redistribute it.\n\ +%sThere is NO WARRANTY, to the extent permitted by law.\n"), + precede, precede, precede); + + printed_version = 1; + + /* Flush stdout so the user doesn't have to wait to see the + version information while things are thought about. */ + fflush (stdout); +} + +/* Print a bunch of information about this and that. */ + +static void +print_data_base () +{ + time_t when; + + when = time ((time_t *) 0); + printf (_("\n# Make data base, printed on %s"), ctime (&when)); + + print_variable_data_base (); + print_dir_data_base (); + print_rule_data_base (); + print_file_data_base (); + print_vpath_data_base (); + strcache_print_stats ("#"); + + when = time ((time_t *) 0); + printf (_("\n# Finished Make data base on %s\n"), ctime (&when)); +} + +static void +clean_jobserver (int status) +{ + char token = '+'; + + /* Sanity: have we written all our jobserver tokens back? If our + exit status is 2 that means some kind of syntax error; we might not + have written all our tokens so do that now. If tokens are left + after any other error code, that's bad. */ + + if (job_fds[0] != -1 && jobserver_tokens) + { + if (status != 2) + error (NILF, + "INTERNAL: Exiting with %u jobserver tokens (should be 0)!", + jobserver_tokens); + else + while (jobserver_tokens--) + { + int r; + + EINTRLOOP (r, write (job_fds[1], &token, 1)); + if (r != 1) + perror_with_name ("write", ""); + } + } + + + /* Sanity: If we're the master, were all the tokens written back? */ + + if (master_job_slots) + { + /* We didn't write one for ourself, so start at 1. */ + unsigned int tcnt = 1; + + /* Close the write side, so the read() won't hang. */ + close (job_fds[1]); + + while (read (job_fds[0], &token, 1) == 1) + ++tcnt; + + if (tcnt != master_job_slots) + error (NILF, + "INTERNAL: Exiting with %u jobserver tokens available; should be %u!", + tcnt, master_job_slots); + + close (job_fds[0]); + + /* Clean out jobserver_fds so we don't pass this information to any + sub-makes. Also reset job_slots since it will be put on the command + line, not in MAKEFLAGS. */ + job_slots = default_job_slots; + if (jobserver_fds) + { + /* MSVC erroneously warns without a cast here. */ + free ((void *)jobserver_fds->list); + free (jobserver_fds); + jobserver_fds = 0; + } + } +} + +/* Exit with STATUS, cleaning up as necessary. */ + +void +die (int status) +{ + static char dying = 0; + + if (!dying) + { + int err; + + dying = 1; + + if (print_version_flag) + print_version (); + + /* Wait for children to die. */ + err = (status != 0); + while (job_slots_used > 0) + reap_children (1, err); + + /* Let the remote job module clean up its state. */ + remote_cleanup (); + + /* Remove the intermediate files. */ + remove_intermediates (0); + + if (print_data_base_flag) + print_data_base (); + + verify_file_data_base (); + + clean_jobserver (status); + + /* Try to move back to the original directory. This is essential on + MS-DOS (where there is really only one process), and on Unix it + puts core files in the original directory instead of the -C + directory. Must wait until after remove_intermediates(), or unlinks + of relative pathnames fail. */ + if (directory_before_chdir != 0) + { + /* If it fails we don't care: shut up GCC. */ + int _x; + _x = chdir (directory_before_chdir); + } + + log_working_directory (0); + } + + exit (status); +} + +/* Write a message indicating that we've just entered or + left (according to ENTERING) the current directory. */ + +void +log_working_directory (int entering) +{ + static int entered = 0; + + /* Print nothing without the flag. Don't print the entering message + again if we already have. Don't print the leaving message if we + haven't printed the entering message. */ + if (! print_directory_flag || entering == entered) + return; + + entered = entering; + + if (print_data_base_flag) + fputs ("# ", stdout); + + /* Use entire sentences to give the translators a fighting chance. */ + + if (makelevel == 0) + if (starting_directory == 0) + if (entering) + printf (_("%s: Entering an unknown directory\n"), program); + else + printf (_("%s: Leaving an unknown directory\n"), program); + else + if (entering) + printf (_("%s: Entering directory `%s'\n"), + program, starting_directory); + else + printf (_("%s: Leaving directory `%s'\n"), + program, starting_directory); + else + if (starting_directory == 0) + if (entering) + printf (_("%s[%u]: Entering an unknown directory\n"), + program, makelevel); + else + printf (_("%s[%u]: Leaving an unknown directory\n"), + program, makelevel); + else + if (entering) + printf (_("%s[%u]: Entering directory `%s'\n"), + program, makelevel, starting_directory); + else + printf (_("%s[%u]: Leaving directory `%s'\n"), + program, makelevel, starting_directory); + + /* Flush stdout to be sure this comes before any stderr output. */ + fflush (stdout); +} diff --git a/make.1 b/make.1 new file mode 100644 index 0000000..c76ce25 --- /dev/null +++ b/make.1 @@ -0,0 +1,359 @@ +.TH MAKE 1 "22 August 1989" "GNU" "LOCAL USER COMMANDS" +.SH NAME +make \- GNU make utility to maintain groups of programs +.SH SYNOPSIS +.B "make " +[ +.B \-f +.I makefile +] [ options ] ... [ targets ] ... +.SH WARNING +This man page is an extract of the documentation of GNU +.IR make . +It is updated only occasionally, because the GNU project does not use nroff. +For complete, current documentation, refer to the Info file +.B make.info +which is made from the Texinfo source file +.BR make.texi . +.SH DESCRIPTION +.LP +The purpose of the +.I make +utility is to determine automatically which +pieces of a large program need to be recompiled, and issue the commands to +recompile them. +The manual describes the GNU implementation of +.IR make , +which was written by Richard Stallman and Roland McGrath, and is +currently maintained by Paul Smith. +Our examples show C programs, since they are most common, but you can use +.I make +with any programming language whose compiler can be run with a +shell command. +In fact, +.I make +is not limited to programs. +You can use it to describe any task where some files must be +updated automatically from others whenever the others change. +.LP +To prepare to use +.IR make , +you must write a file called the +.I makefile +that describes the relationships among files in your program, and the +states the commands for updating each file. +In a program, typically the executable file is updated from object +files, which are in turn made by compiling source files. +.LP +Once a suitable makefile exists, each time you change some source files, +this simple shell command: +.sp 1 +.RS +.B make +.RE +.sp 1 +suffices to perform all necessary recompilations. +The +.I make +program uses the makefile data base and the last-modification times +of the files to decide which of the files need to be updated. +For each of those files, it issues the commands recorded in the data base. +.LP +.I make +executes commands in the +.I makefile +to update +one or more target +.IR names , +where +.I name +is typically a program. +If no +.B \-f +option is present, +.I make +will look for the makefiles +.IR GNUmakefile , +.IR makefile , +and +.IR Makefile , +in that order. +.LP +Normally you should call your makefile either +.I makefile +or +.IR Makefile . +(We recommend +.I Makefile +because it appears prominently near the beginning of a directory +listing, right near other important files such as +.IR README .) +The first name checked, +.IR GNUmakefile , +is not recommended for most makefiles. +You should use this name if you have a makefile that is specific to GNU +.IR make , +and will not be understood by other versions of +.IR make . +If +.I makefile +is `\-', the standard input is read. +.LP +.I make +updates a target if it depends on prerequisite files +that have been modified since the target was last modified, +or if the target does not exist. +.SH OPTIONS +.sp 1 +.TP 0.5i +.BR \-b , " \-m" +These options are ignored for compatibility with other versions of +.IR make . +.TP 0.5i +.BR \-B , " \-\-always\-make" +Unconditionally make all targets. +.TP 0.5i +\fB\-C\fR \fIdir\fR, \fB\-\-directory\fR=\fIdir\fR +Change to directory +.I dir +before reading the makefiles or doing anything else. +If multiple +.B \-C +options are specified, each is interpreted relative to the +previous one: +.BR "\-C " / +.BR "\-C " etc +is equivalent to +.BR "\-C " /etc. +This is typically used with recursive invocations of +.IR make . +.TP 0.5i +.B \-d +Print debugging information in addition to normal processing. +The debugging information says which files are being considered for +remaking, which file-times are being compared and with what results, +which files actually need to be remade, which implicit rules are +considered and which are applied---everything interesting about how +.I make +decides what to do. +.TP 0.5i +.BI \-\-debug "[=FLAGS]" +Print debugging information in addition to normal processing. +If the +.I FLAGS +are omitted, then the behavior is the same as if +.B \-d +was specified. +.I FLAGS +may be +.I a +for all debugging output (same as using +.BR \-d ), +.I b +for basic debugging, +.I v +for more verbose basic debugging, +.I i +for showing implicit rules, +.I j +for details on invocation of commands, and +.I m +for debugging while remaking makefiles. +.TP 0.5i +.BR \-e , " \-\-environment\-overrides" +Give variables taken from the environment precedence +over variables from makefiles. +.TP 0.5i +\fB\-f\fR \fIfile\fR, \fB\-\-file\fR=\fIfile\fR, \fB\-\-makefile\fR=\fIFILE\fR +Use +.I file +as a makefile. +.TP 0.5i +.BR \-i , " \-\-ignore\-errors" +Ignore all errors in commands executed to remake files. +.TP 0.5i +\fB\-I\fR \fIdir\fR, \fB\-\-include\-dir\fR=\fIdir\fR +Specifies a directory +.I dir +to search for included makefiles. +If several +.B \-I +options are used to specify several directories, the directories are +searched in the order specified. +Unlike the arguments to other flags of +.IR make , +directories given with +.B \-I +flags may come directly after the flag: +.BI \-I dir +is allowed, as well as +.BI "\-I " dir. +This syntax is allowed for compatibility with the C +preprocessor's +.B \-I +flag. +.TP 0.5i +\fB\-j\fR [\fIjobs\fR], \fB\-\-jobs\fR[=\fIjobs\fR] +Specifies the number of +.I jobs +(commands) to run simultaneously. +If there is more than one +.B \-j +option, the last one is effective. +If the +.B \-j +option is given without an argument, +.IR make +will not limit the number of jobs that can run simultaneously. +.TP 0.5i +.BR \-k , " \-\-keep\-going" +Continue as much as possible after an error. +While the target that failed, and those that depend on it, cannot +be remade, the other dependencies of these targets can be processed +all the same. +.TP 0.5i +\fB\-l\fR [\fIload\fR], \fB\-\-load\-average\fR[=\fIload\fR] +Specifies that no new jobs (commands) should be started if there are +others jobs running and the load average is at least +.I load +(a floating-point number). +With no argument, removes a previous load limit. +.TP 0.5i +.BR \-L , " \-\-check\-symlink\-times" +Use the latest mtime between symlinks and target. +.TP 0.5i +.BR \-n , " \-\-just\-print" , " \-\-dry\-run" , " \-\-recon" +Print the commands that would be executed, but do not execute them (except in +certain circumstances). +.TP 0.5i +\fB\-o\fR \fIfile\fR, \fB\-\-old\-file\fR=\fIfile\fR, \fB\-\-assume\-old\fR=\fIfile\fR +Do not remake the file +.I file +even if it is older than its dependencies, and do not remake anything +on account of changes in +.IR file . +Essentially the file is treated as very old and its rules are ignored. +.TP 0.5i +.BR \-p , " \-\-print\-data\-base" +Print the data base (rules and variable values) that results from +reading the makefiles; then execute as usual or as otherwise +specified. +This also prints the version information given by the +.B \-v +switch (see below). +To print the data base without trying to remake any files, use +.B make +.B \-p +.BI \-f /dev/null. +.TP 0.5i +.BR \-q , " \-\-question" +``Question mode''. +Do not run any commands, or print anything; just return an exit status +that is zero if the specified targets are already up to date, nonzero +otherwise. +.TP 0.5i +.BR \-r , " \-\-no\-builtin\-rules" +Eliminate use of the built\-in implicit rules. +Also clear out the default list of suffixes for suffix rules. +.TP 0.5i +.BR \-R , " \-\-no\-builtin\-variables" +Don't define any built\-in variables. +.TP 0.5i +.BR \-s , " \-\-silent" , " \-\-quiet" +Silent operation; do not print the commands as they are executed. +.TP 0.5i +.BR \-S , " \-\-no\-keep\-going" , " \-\-stop" +Cancel the effect of the +.B \-k +option. +This is never necessary except in a recursive +.I make +where +.B \-k +might be inherited from the top-level +.I make +via MAKEFLAGS or if you set +.B \-k +in MAKEFLAGS in your environment. +.TP 0.5i +.BR \-t , " \-\-touch" +Touch files (mark them up to date without really changing them) +instead of running their commands. +This is used to pretend that the commands were done, in order to fool +future invocations of +.IR make . +.TP 0.5i +.BR \-v , " \-\-version" +Print the version of the +.I make +program plus a copyright, a list of authors and a notice that there +is no warranty. +.TP 0.5i +.BR \-w , " \-\-print\-directory" +Print a message containing the working directory +before and after other processing. +This may be useful for tracking down errors from complicated nests of +recursive +.I make +commands. +.TP 0.5i +.B \-\-no\-print\-directory +Turn off +.BR \-w , +even if it was turned on implicitly. +.TP 0.5i +\fB\-W\fR \fIfile\fR, \fB\-\-what\-if\fR=\fIfile\fR, \fB\-\-new\-file\fR=\fIfile\fR, \fB\-\-assume\-new\fR=\fIfile\fR +Pretend that the target +.I file +has just been modified. +When used with the +.B \-n +flag, this shows you what would happen if you were to modify that file. +Without +.BR \-n , +it is almost the same as running a +.I touch +command on the given file before running +.IR make , +except that the modification time is changed only in the imagination of +.IR make . +.TP 0.5i +.B \-\-warn\-undefined\-variables +Warn when an undefined variable is referenced. +.SH "EXIT STATUS" +GNU +.I make +exits with a status of zero if all makefiles were successfully parsed +and no targets that were built failed. A status of one will be returned +if the +.B \-q +flag was used and +.I make +determines that a target needs to be rebuilt. A status of two will be +returned if any errors were encountered. +.SH "SEE ALSO" +.I "The GNU Make Manual" +.SH BUGS +See the chapter `Problems and Bugs' in +.IR "The GNU Make Manual" . +.SH AUTHOR +This manual page contributed by Dennis Morse of Stanford University. +It has been reworked by Roland McGrath. Further updates contributed by +Mike Frysinger. +.SH "COPYRIGHT" +Copyright (C) 1992, 1993, 1996, 1999, 2007 Free Software Foundation, Inc. +This file is part of GNU +.IR make . +.LP +GNU Make 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. +.LP +GNU Make 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. +.LP +You should have received a copy of the GNU General Public License along with +this program. If not, see +.IR http://www.gnu.org/licenses/ . diff --git a/make.h b/make.h new file mode 100644 index 0000000..60ade4c --- /dev/null +++ b/make.h @@ -0,0 +1,617 @@ +/* Miscellaneous global declarations and portability cruft for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +/* We use instead of "config.h" so that a compilation + using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h + (which it would do because make.h was found in $srcdir). */ +#include +#undef HAVE_CONFIG_H +#define HAVE_CONFIG_H 1 + +/* Specify we want GNU source code. This must be defined before any + system headers are included. */ + +#define _GNU_SOURCE 1 + +/* AIX requires this to be the first thing in the file. */ +#if HAVE_ALLOCA_H +# include +#else +# ifdef _AIX + #pragma alloca +# else +# if !defined(__GNUC__) && !defined(WINDOWS32) +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +#endif + + +#ifdef CRAY +/* This must happen before #include so + that the declaration therein is changed. */ +# define signal bsdsignal +#endif + +/* If we're compiling for the dmalloc debugger, turn off string inlining. */ +#if defined(HAVE_DMALLOC_H) && defined(__GNUC__) +# define __NO_STRING_INLINES +#endif + +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_TIMEB_H +/* SCO 3.2 "devsys 4.2" has a prototype for `ftime' in that bombs + unless has been included first. Does every system have a + ? If any does not, configure should check for it. */ +# include +#endif + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include + +#ifndef errno +extern int errno; +#endif + +#ifndef isblank +# define isblank(c) ((c) == ' ' || (c) == '\t') +#endif + +#ifdef HAVE_UNISTD_H +# include +/* Ultrix's unistd.h always defines _POSIX_VERSION, but you only get + POSIX.1 behavior with `cc -YPOSIX', which predefines POSIX itself! */ +# if defined (_POSIX_VERSION) && !defined (ultrix) && !defined (VMS) +# define POSIX 1 +# endif +#endif + +/* Some systems define _POSIX_VERSION but are not really POSIX.1. */ +#if (defined (butterfly) || defined (__arm) || (defined (__mips) && defined (_SYSTYPE_SVR3)) || (defined (sequent) && defined (i386))) +# undef POSIX +#endif + +#if !defined (POSIX) && defined (_AIX) && defined (_POSIX_SOURCE) +# define POSIX 1 +#endif + +#ifndef RETSIGTYPE +# define RETSIGTYPE void +#endif + +#ifndef sigmask +# define sigmask(sig) (1 << ((sig) - 1)) +#endif + +#ifndef HAVE_SA_RESTART +# define SA_RESTART 0 +#endif + +#ifdef HAVE_LIMITS_H +# include +#endif +#ifdef HAVE_SYS_PARAM_H +# include +#endif + +#ifndef PATH_MAX +# ifndef POSIX +# define PATH_MAX MAXPATHLEN +# endif +#endif +#ifndef MAXPATHLEN +# define MAXPATHLEN 1024 +#endif + +#ifdef PATH_MAX +# define GET_PATH_MAX PATH_MAX +# define PATH_VAR(var) char var[PATH_MAX] +#else +# define NEED_GET_PATH_MAX 1 +# define GET_PATH_MAX (get_path_max ()) +# define PATH_VAR(var) char *var = alloca (GET_PATH_MAX) +unsigned int get_path_max (void); +#endif + +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif + +/* Nonzero if the integer type T is signed. */ +#define INTEGER_TYPE_SIGNED(t) ((t) -1 < 0) + +/* The minimum and maximum values for the integer type T. + Use ~ (t) 0, not -1, for portability to 1's complement hosts. */ +#define INTEGER_TYPE_MINIMUM(t) \ + (! INTEGER_TYPE_SIGNED (t) ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)) +#define INTEGER_TYPE_MAXIMUM(t) (~ (t) 0 - INTEGER_TYPE_MINIMUM (t)) + +#ifndef CHAR_MAX +# define CHAR_MAX INTEGER_TYPE_MAXIMUM (char) +#endif + +#ifdef STAT_MACROS_BROKEN +# ifdef S_ISREG +# undef S_ISREG +# endif +# ifdef S_ISDIR +# undef S_ISDIR +# endif +#endif /* STAT_MACROS_BROKEN. */ + +#ifndef S_ISREG +# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) +#endif +#ifndef S_ISDIR +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +#endif + +#ifdef VMS +# include +# include +# include +# include +/* Needed to use alloca on VMS. */ +# include +#endif + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(x) +# endif +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +# endif +#endif +#define UNUSED __attribute__ ((unused)) + +#if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__) +# include +# include +# define ANSI_STRING 1 +#else /* No standard headers. */ +# ifdef HAVE_STRING_H +# include +# define ANSI_STRING 1 +# else +# include +# endif +# ifdef HAVE_MEMORY_H +# include +# endif +# ifdef HAVE_STDLIB_H +# include +# else +void *malloc (int); +void *realloc (void *, int); +void free (void *); + +void abort (void) __attribute__ ((noreturn)); +void exit (int) __attribute__ ((noreturn)); +# endif /* HAVE_STDLIB_H. */ + +#endif /* Standard headers. */ + +/* These should be in stdlib.h. Make sure we have them. */ +#ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +#endif +#ifndef EXIT_FAILURE +# define EXIT_FAILURE 1 +#endif + +#ifndef ANSI_STRING + +/* SCO Xenix has a buggy macro definition in . */ +#undef strerror +#if !defined(__DECC) +char *strerror (int errnum); +#endif + +#endif /* !ANSI_STRING. */ +#undef ANSI_STRING + +#if HAVE_INTTYPES_H +# include +#endif +#define FILE_TIMESTAMP uintmax_t + +#if !defined(HAVE_STRSIGNAL) +char *strsignal (int signum); +#endif + +/* ISDIGIT offers the following features: + - Its arg may be any int or unsigned int; it need not be an unsigned char. + - It's guaranteed to evaluate its argument exactly once. + NOTE! Make relies on this behavior, don't change it! + - It's typically faster. + POSIX 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that + only '0' through '9' are digits. Prefer ISDIGIT to isdigit() unless + it's important to use the locale's definition of `digit' even when the + host does not conform to POSIX. */ +#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) + +/* Test if two strings are equal. Is this worthwhile? Should be profiled. */ +#define streq(a, b) \ + ((a) == (b) || \ + (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1)))) + +/* Test if two strings are equal, but match case-insensitively on systems + which have case-insensitive filesystems. Should only be used for + filenames! */ +#ifdef HAVE_CASE_INSENSITIVE_FS +# define patheq(a, b) \ + ((a) == (b) \ + || (tolower((unsigned char)*(a)) == tolower((unsigned char)*(b)) \ + && (*(a) == '\0' || !strcasecmp ((a) + 1, (b) + 1)))) +#else +# define patheq(a, b) streq(a, b) +#endif + +#define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0) + +#if defined(__GNUC__) || defined(ENUM_BITFIELDS) +# define ENUM_BITFIELD(bits) :bits +#else +# define ENUM_BITFIELD(bits) +#endif + +/* Handle gettext and locales. */ + +#if HAVE_LOCALE_H +# include +#else +# define setlocale(category, locale) +#endif + +#include + +#define _(msgid) gettext (msgid) +#define N_(msgid) gettext_noop (msgid) +#define S_(msg1,msg2,num) ngettext (msg1,msg2,num) + +/* Handle other OSs. */ +#ifndef PATH_SEPARATOR_CHAR +# if defined(HAVE_DOS_PATHS) +# define PATH_SEPARATOR_CHAR ';' +# elif defined(VMS) +# define PATH_SEPARATOR_CHAR ',' +# else +# define PATH_SEPARATOR_CHAR ':' +# endif +#endif + +/* This is needed for getcwd() and chdir(), on some W32 systems. */ +#if defined(HAVE_DIRECT_H) +# include +#endif + +#ifdef WINDOWS32 +# include +# include +# define pipe(_p) _pipe((_p), 512, O_BINARY) +# define kill(_pid,_sig) w32_kill((_pid),(_sig)) + +void sync_Path_environment (void); +int w32_kill (pid_t pid, int sig); +char *end_of_token_w32 (const char *s, char stopchar); +int find_and_set_default_shell (const char *token); + +/* indicates whether or not we have Bourne shell */ +extern int no_default_sh_exe; + +/* is default_shell unixy? */ +extern int unixy_shell; +#endif /* WINDOWS32 */ + +#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) +# define SET_STACK_SIZE +#endif +#ifdef SET_STACK_SIZE +# include +struct rlimit stack_limit; +#endif + +struct floc + { + const char *filenm; + unsigned long lineno; + }; +#define NILF ((struct floc *)0) + +#define STRING_SIZE_TUPLE(_s) (_s), (sizeof (_s)-1) + + +/* We have to have stdarg.h or varargs.h AND v*printf or doprnt to use + variadic versions of these functions. */ + +#if HAVE_STDARG_H || HAVE_VARARGS_H +# if HAVE_VPRINTF || HAVE_DOPRNT +# define USE_VARIADIC 1 +# endif +#endif + +#if HAVE_ANSI_COMPILER && USE_VARIADIC && HAVE_STDARG_H +const char *concat (unsigned int, ...); +void message (int prefix, const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); +void error (const struct floc *flocp, const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); +void fatal (const struct floc *flocp, const char *fmt, ...) + __attribute__ ((noreturn, __format__ (__printf__, 2, 3))); +#else +const char *concat (); +void message (); +void error (); +void fatal (); +#endif + +void die (int) __attribute__ ((noreturn)); +void log_working_directory (int); +void pfatal_with_name (const char *) __attribute__ ((noreturn)); +void perror_with_name (const char *, const char *); +void *xmalloc (unsigned int); +void *xcalloc (unsigned int); +void *xrealloc (void *, unsigned int); +char *xstrdup (const char *); +char *xstrndup (const char *, unsigned int); +char *find_next_token (const char **, unsigned int *); +char *next_token (const char *); +char *end_of_token (const char *); +void collapse_continuations (char *); +char *lindex (const char *, const char *, int); +int alpha_compare (const void *, const void *); +void print_spaces (unsigned int); +char *find_percent (char *); +const char *find_percent_cached (const char **); +FILE *open_tmpfile (char **, const char *); + +#ifndef NO_ARCHIVES +int ar_name (const char *); +void ar_parse_name (const char *, char **, char **); +int ar_touch (const char *); +time_t ar_member_date (const char *); + +typedef long int (*ar_member_func_t) (int desc, const char *mem, int truncated, + long int hdrpos, long int datapos, + long int size, long int date, int uid, + int gid, int mode, const void *arg); + +long int ar_scan (const char *archive, ar_member_func_t function, const void *arg); +int ar_name_equal (const char *name, const char *mem, int truncated); +#ifndef VMS +int ar_member_touch (const char *arname, const char *memname); +#endif +#endif + +int dir_file_exists_p (const char *, const char *); +int file_exists_p (const char *); +int file_impossible_p (const char *); +void file_impossible (const char *); +const char *dir_name (const char *); +void hash_init_directories (void); + +void define_default_variables (void); +void set_default_suffixes (void); +void install_default_suffix_rules (void); +void install_default_implicit_rules (void); + +void build_vpath_lists (void); +void construct_vpath_list (char *pattern, char *dirpath); +const char *vpath_search (const char *file, FILE_TIMESTAMP *mtime_ptr, + unsigned int* vpath_index, unsigned int* path_index); +int gpath_search (const char *file, unsigned int len); + +void construct_include_path (const char **arg_dirs); + +void user_access (void); +void make_access (void); +void child_access (void); + +void close_stdout (void); + +char *strip_whitespace (const char **begpp, const char **endpp); + +/* String caching */ +void strcache_init (void); +void strcache_print_stats (const char *prefix); +int strcache_iscached (const char *str); +const char *strcache_add (const char *str); +const char *strcache_add_len (const char *str, int len); +int strcache_setbufsize (int size); + +#ifdef HAVE_VFORK_H +# include +#endif + +/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION, + because such systems often declare them in header files anyway. */ + +#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32) + +long int atol (); +# ifndef VMS +long int lseek (); +# endif + +#endif /* Not GNU C library or POSIX. */ + +#ifdef HAVE_GETCWD +# if !defined(VMS) && !defined(__DECC) +char *getcwd (); +# endif +#else +char *getwd (); +# define getcwd(buf, len) getwd (buf) +#endif + +#if !HAVE_STRCASECMP +# if HAVE_STRICMP +# define strcasecmp stricmp +# elif HAVE_STRCMPI +# define strcasecmp strcmpi +# else +/* Create our own, in misc.c */ +int strcasecmp (const char *s1, const char *s2); +# endif +#endif + +#if !HAVE_STRNCASECMP +# if HAVE_STRNICMP +# define strncasecmp strnicmp +# elif HAVE_STRNCMPI +# define strncasecmp strncmpi +# else +/* Create our own, in misc.c */ +int strncasecmp (const char *s1, const char *s2, int n); +# endif +#endif + +extern const struct floc *reading_file; +extern const struct floc **expanding_var; + +extern char **environ; + +extern int just_print_flag, silent_flag, ignore_errors_flag, keep_going_flag; +extern int print_data_base_flag, question_flag, touch_flag, always_make_flag; +extern int env_overrides, no_builtin_rules_flag, no_builtin_variables_flag; +extern int print_version_flag, print_directory_flag, check_symlink_flag; +extern int warn_undefined_variables_flag, posix_pedantic, not_parallel; +extern int second_expansion, clock_skew_detected, rebuilding_makefiles; +extern int one_shell; + +/* can we run commands via 'sh -c xxx' or must we use batch files? */ +extern int batch_mode_shell; + +/* Resetting the command script introduction prefix character. */ +#define RECIPEPREFIX_NAME ".RECIPEPREFIX" +#define RECIPEPREFIX_DEFAULT '\t' +extern char cmd_prefix; + +extern unsigned int job_slots; +extern int job_fds[2]; +extern int job_rfd; +#ifndef NO_FLOAT +extern double max_load_average; +#else +extern int max_load_average; +#endif + +extern char *program; +extern char *starting_directory; +extern unsigned int makelevel; +extern char *version_string, *remote_description, *make_host; + +extern unsigned int commands_started; + +extern int handling_fatal_signal; + + +#ifndef MIN +#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b)) +#endif +#ifndef MAX +#define MAX(_a,_b) ((_a)>(_b)?(_a):(_b)) +#endif + +#ifdef VMS +# define MAKE_SUCCESS 1 +# define MAKE_TROUBLE 2 +# define MAKE_FAILURE 3 +#else +# define MAKE_SUCCESS 0 +# define MAKE_TROUBLE 1 +# define MAKE_FAILURE 2 +#endif + +/* Set up heap debugging library dmalloc. */ + +#ifdef HAVE_DMALLOC_H +#include +#endif + +#ifndef initialize_main +# ifdef __EMX__ +# define initialize_main(pargc, pargv) \ + { _wildcard(pargc, pargv); _response(pargc, pargv); } +# else +# define initialize_main(pargc, pargv) +# endif +#endif + +#ifdef __EMX__ +# if !defined chdir +# define chdir _chdir2 +# endif +# if !defined getcwd +# define getcwd _getcwd2 +# endif + +/* NO_CHDIR2 causes make not to use _chdir2() and _getcwd2() instead of + chdir() and getcwd(). This avoids some error messages for the + make testsuite but restricts the drive letter support. */ +# ifdef NO_CHDIR2 +# warning NO_CHDIR2: usage of drive letters restricted +# undef chdir +# undef getcwd +# endif +#endif + +#ifndef initialize_main +# define initialize_main(pargc, pargv) +#endif + + +/* Some systems (like Solaris, PTX, etc.) do not support the SA_RESTART flag + properly according to POSIX. So, we try to wrap common system calls with + checks for EINTR. Note that there are still plenty of system calls that + can fail with EINTR but this, reportedly, gets the vast majority of + failure cases. If you still experience failures you'll need to either get + a system where SA_RESTART works, or you need to avoid -j. */ + +#define EINTRLOOP(_v,_c) while (((_v)=_c)==-1 && errno==EINTR) + +/* While system calls that return integers are pretty consistent about + returning -1 on failure and setting errno in that case, functions that + return pointers are not always so well behaved. Sometimes they return + NULL for expected behavior: one good example is readdir() which returns + NULL at the end of the directory--and _doesn't_ reset errno. So, we have + to do it ourselves here. */ + +#define ENULLLOOP(_v,_c) do { errno = 0; (_v) = _c; } \ + while((_v)==0 && errno==EINTR) diff --git a/make.lnk b/make.lnk new file mode 100644 index 0000000..b4080a7 --- /dev/null +++ b/make.lnk @@ -0,0 +1,5 @@ +FROM LIB:cres.o "commands.o"+"job.o"+"dir.o"+"file.o"+"misc.o"+"main.o"+"read.o"+"remake.o"+"rule.o"+"implicit.o"+"default.o"+"variable.o"+"expand.o"+"function.o"+"vpath.o"+"version.o"+"ar.o"+"arscan.o"+"signame.o"+"remote-stub.o"+"getopt.o"+"getopt1.o"+"alloca.o"+"amiga.o"+"hash.o"+"strcache.o" +TO "make.new" +LIB glob/glob.lib LIB:sc.lib LIB:amiga.lib +QUIET + diff --git a/make_msvc_net2003.sln b/make_msvc_net2003.sln new file mode 100644 index 0000000..e993896 --- /dev/null +++ b/make_msvc_net2003.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_msvc.net2003", "make_msvc_net2003.vcproj", "{E96B5060-3240-4723-91C9-E64F1C877A04}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {E96B5060-3240-4723-91C9-E64F1C877A04}.Debug.ActiveCfg = Debug|Win32 + {E96B5060-3240-4723-91C9-E64F1C877A04}.Debug.Build.0 = Debug|Win32 + {E96B5060-3240-4723-91C9-E64F1C877A04}.Release.ActiveCfg = Release|Win32 + {E96B5060-3240-4723-91C9-E64F1C877A04}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/make_msvc_net2003.vcproj b/make_msvc_net2003.vcproj new file mode 100644 index 0000000..357dfba --- /dev/null +++ b/make_msvc_net2003.vcproj @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/makefile.com b/makefile.com new file mode 100644 index 0000000..d2d05d1 --- /dev/null +++ b/makefile.com @@ -0,0 +1,156 @@ +$! +$! Makefile.com - builds GNU Make for VMS +$! +$! P1 is non-empty if you want to link with the VAXCRTL library instead +$! of the shareable executable +$! P2 = DEBUG will build an image with debug information +$! P3 = WALL will enable all warning messages (some are suppressed since +$! one macro intentionally causes an error condition) +$! +$! In case of problems with the install you might contact me at +$! zinser@decus.de (preferred) or zinser@sysdev.deutsche-boerse.com +$ +$! hb +$! But don't ask Martin Zinser about the lines, I added/changed. +$! In case of an error do some cleanup +$ on error then $ goto cleanup +$! in case somebody set up her/his own symbol for cc +$ set symbol/scope=(nolocal,noglobal) +$! +$! Just some general constants... +$! +$ true = 1 +$ false = 0 +$ tmpnam = "temp_" + f$getjpi("","pid") +$ tt = tmpnam + ".txt" +$ tc = tmpnam + ".c" +$! +$! Look for the compiler used +$! +$ lval = "" +$ if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").eqs."" +$ then +$ if f$trnlnm("SYS").eqs."" then def/nolog sys sys$library: +$ ccopt = "" +$ else +$ ccopt = "/decc/prefix=(all,except=(globfree,glob))" +$ if f$trnlnm("SYS").eqs."" +$ then +$ if f$trnlnm("DECC$LIBRARY_INCLUDE").nes."" +$ then +$ define sys decc$library_include: +$ else +$ if f$search("SYS$COMMON:[DECC$LIB.REFERENCE]DECC$RTLDEF.DIR").nes."" - + then lval = "SYS$COMMON:[DECC$LIB.REFERENCE.DECC$RTLDEF]," +$ if f$search("SYS$COMMON:[DECC$LIB.REFERENCE]SYS$STARLET_C.DIR").nes."" - + then lval = lval+"SYS$COMMON:[DECC$LIB.REFERENCE.SYS$STARLET_C]," +$ lval=lval+"SYS$LIBRARY:" +$ define sys 'lval +$ endif +$ endif +$ endif +$! +$! Should we build a debug image +$! +$ if (p2.eqs."DEBUG") +$ then +$ ccopt = ccopt + "/noopt/debug" +$ lopt = "/debug" +$ else +$ lopt = "" +$ endif +$! +$! Do we want to see all warnings +$! +$ if (p3.nes."WALL") +$ then +$ gosub check_cc_qual +$ endif +$ filelist = "alloca ar arscan commands default dir expand file function " + - + "hash implicit job main misc read remake remote-stub rule " + - + "signame variable version vmsfunctions vmsify vpath " + - + "[.glob]glob [.glob]fnmatch getopt1 getopt strcache" +$ copy config.h-vms config.h +$ n=0 +$ open/write optf make.opt +$ loop: +$ cfile = f$elem(n," ",filelist) +$ if cfile .eqs. " " then goto linkit +$ write sys$output "Compiling ''cfile'..." +$ call compileit 'cfile' 'p1' +$ n = n + 1 +$ goto loop +$ linkit: +$ close optf +$ if p1 .nes. "" then goto link_using_library +$ link/exe=make make.opt/opt'lopt +$ goto cleanup +$ +$ link_using_library: +$ link/exe=make make.opt/opt,sys$library:vaxcrtl/lib'lopt +$ +$ cleanup: +$ if f$trnlnm("SYS").nes."" then $ deassign sys +$ if f$trnlnm("OPTF").nes."" then $ close optf +$ if f$search("make.opt").nes."" then $ del make.opt;* +$ exit +$! +$!----------------------------------------------------------------------------- +$! +$! Check if this is a define relating to the properties of the C/C++ +$! compiler +$! +$CHECK_CC_QUAL: +$ open/write tmpc 'tc +$ ccqual = "/warn=(disable=questcompare)" +$ write tmpc "#include " +$ write tmpc "unsigned int i = 1;" +$ write tmpc "int main(){" +$ write tmpc "if (i < 0){printf(""Mission impossible\n"");}}" +$ close tmpc +$ gosub cc_qual_check +$ return +$! +$!----------------------------------------------------------------------------- +$! +$! Check for properties of C/C++ compiler +$! +$CC_QUAL_CHECK: +$ cc_qual = false +$ set message/nofac/noident/nosever/notext +$ cc 'ccqual' 'tmpnam' +$ if $status then cc_qual = true +$ set message/fac/ident/sever/text +$ delete/nolog 'tmpnam'.*;* +$ if cc_qual then ccopt = ccopt + ccqual +$ return +$!----------------------------------------------------------------------------- +$! +$ compileit : subroutine +$ ploc = f$locate("]",p1) +$ filnam = p1 +$ if ploc .lt. f$length(p1) then filnam=f$extract(ploc+1,100,p1) +$ write optf "''filnam'" +$ cc'ccopt'/include=([],[.glob]) - + /define=("allocated_variable_expand_for_file=alloc_var_expand_for_file","unlink=remove","HAVE_CONFIG_H","VMS") - + 'p1' +$ exit +$ endsubroutine : compileit +$! +$!----------------------------------------------------------------------------- +$!Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +$!2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +$!This file is part of GNU Make. +$! +$!GNU Make 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. +$! +$!GNU Make 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 . diff --git a/makefile.vms b/makefile.vms new file mode 100644 index 0000000..1e6a88e --- /dev/null +++ b/makefile.vms @@ -0,0 +1,149 @@ +# -*-Makefile-*- to build GNU make on VMS +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +# VMS extensions from GNU Make 3.60 imported by +# Klaus Kämpf (kkaempf@rmi.de) +# Modified for version 3.78.1 by Hartmut.Becker@compaq.com. +# Modified for version 3.80 by zinser@decus.de +# Modified for version 3.81 by Hartmut Becker + +CC = cc +CP = copy + +%.obj: %.c + $(CC) $(CFLAGS)/obj=$@ $< +# +# Makefile for GNU Make +# + +ifeq ($(CC),cc) +CFLAGS = $(defines) /include=([],[.glob])/prefix=(all,except=(glob,globfree))/standard=relaxed/warn=(disable=questcompare) +else +CFLAGS = $(defines) /include=([],[.glob]) +endif +#LDFLAGS = /deb +LDFLAGS = + +ifeq ($(CC),cc) +defines = /define=("unlink=remove","HAVE_CONFIG_H","VMS","allocated_variable_expand_for_file=alloc_var_expand_for_file") +else +ifeq ($(ARCH),VAX) +defines = /define=("HAVE_CONFIG_H","GCC_IS_NATIVE","VAX") +else +defines = /define=("HAVE_CONFIG_H","GCC_IS_NATIVE") +endif +endif + +LOAD_AVG = /define="NO_LDAV" + +# If you don't want archive support, comment these out. +ARCHIVES = ,ar.obj,arscan.obj +ARCHIVES_SRC = ar.c arscan.c + +# If your system needs extra libraries loaded in, define them here. +# System V probably need -lPW for alloca. +# if on vax, uncomment the following line +#LOADLIBES = ,c.opt/opt +ifeq ($(CC),cc) +#LOADLIBES =,sys$$library:vaxcrtl.olb/lib +CRT0 = +else +LOADLIBES =,gnu_cc_library:libgcc.olb/lib +endif + +# If your system doesn't have alloca, or the one provided is bad, +# get it from the Emacs distribution and define these. +#ALLOCA = ,alloca.obj +#ALLOCASRC = alloca.c + +# If there are remote execution facilities defined, +# enable them with switches here (see remote-*.c). +REMOTE = + +# Any extra object files your system needs. +extras = ,signame.obj,remote-stub.obj,vmsfunctions.obj,vmsify.obj +#,directory.obj +# as an alternative: +glob = ,[.glob]glob.obj,[.glob]fnmatch.obj +getopt = ,getopt.obj,getopt1.obj +# Directory to install `make' in. +bindir = [] +# Directory to install the man page in. +mandir = [] +# Number to put on the man page filename. +manext = 1 + +objs = commands.obj,job.obj,dir.obj,file.obj,misc.obj,hash.obj,\ + main.obj,read.obj,remake.obj,rule.obj,implicit.obj,\ + default.obj,variable.obj,expand.obj,function.obj,strcache.obj,\ + vpath.obj,version.obj$(ARCHIVES)$(ALLOCA)$(extras)$(getopt)$(glob) +srcs = commands.c job.c dir.c file.c misc.c hash.c \ + main.c read.c remake.c rule.c implicit.c \ + default.c variable.c expand.c function.c strcache.c \ + vpath.c version.c vmsfunctions.c vmsify.c $(ARCHIVES_SRC) $(ALLOCASRC) \ + commands.h dep.h filedef.h job.h make.h rule.h variable.h + + +.PHONY: all doc +all: config.h make.exe + +doc: make.info make.dvi + + +make.exe: $(objs) + $(LD)$(LDFLAGS)/exe=$@ $^$(LOADLIBES)$(CRT0) + +.PHONY: clean realclean +clean: + $$ purge [...] + -$(RM) make.exe;,*.obj; + -$(RM) [.glob]*.obj; + +# Automatically generated dependencies. +commands.obj: commands.c make.h dep.h commands.h filedef.h variable.h job.h +job.obj: job.c vmsjobs.c make.h commands.h job.h filedef.h variable.h +dir.obj: dir.c make.h +file.obj: file.c make.h commands.h dep.h filedef.h variable.h +misc.obj: misc.c make.h dep.h +hash.obj: hash.c make.h hash.h +strcache.obj: strcache.c make.h hash.h +main.obj: main.c make.h commands.h dep.h filedef.h variable.h job.h +read.obj: read.c make.h commands.h dep.h filedef.h variable.h +remake.obj: remake.c make.h commands.h job.h dep.h filedef.h +rule.obj: rule.c make.h commands.h dep.h filedef.h variable.h rule.h +implicit.obj: implicit.c make.h rule.h dep.h filedef.h +default.obj: default.c make.h rule.h dep.h filedef.h commands.h variable.h +variable.obj: variable.c make.h commands.h variable.h dep.h filedef.h +expand.obj: expand.c make.h commands.h filedef.h variable.h +function.obj: function.c make.h variable.h dep.h commands.h job.h +vpath.obj: vpath.c make.h filedef.h variable.h +version.obj: version.c config.h +arscan.obj: arscan.c +ar.obj: ar.c make.h filedef.h +signame.obj: signame.c +remote-stub.obj: remote-stub.c +[.glob]glob.obj: [.glob]glob.c +[.glob]fnmatch.obj: [.glob]fnmatch.c +getopt.obj: getopt.c +getopt1.obj: getopt1.c +vmsfunctions.obj: vmsfunctions.c make.h vmsdir.h +vmsify.obj: vmsify.c make.h + +config.h: config.h-vms + $(CP) $< $@ diff --git a/misc.c b/misc.c new file mode 100644 index 0000000..7a6f773 --- /dev/null +++ b/misc.c @@ -0,0 +1,959 @@ +/* Miscellaneous generic support functions for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "dep.h" +#include "debug.h" + +/* Variadic functions. We go through contortions to allow proper function + prototypes for both ANSI and pre-ANSI C compilers, and also for those + which support stdarg.h vs. varargs.h, and finally those which have + vfprintf(), etc. and those who have _doprnt... or nothing. + + This fancy stuff all came from GNU fileutils, except for the VA_PRINTF and + VA_END macros used here since we have multiple print functions. */ + +#if USE_VARIADIC +# if HAVE_STDARG_H +# include +# define VA_START(args, lastarg) va_start(args, lastarg) +# else +# include +# define VA_START(args, lastarg) va_start(args) +# endif +# if HAVE_VPRINTF +# define VA_PRINTF(fp, lastarg, args) vfprintf((fp), (lastarg), (args)) +# else +# define VA_PRINTF(fp, lastarg, args) _doprnt((lastarg), (args), (fp)) +# endif +# define VA_END(args) va_end(args) +#else +/* We can't use any variadic interface! */ +# define va_alist a1, a2, a3, a4, a5, a6, a7, a8 +# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8; +# define VA_START(args, lastarg) +# define VA_PRINTF(fp, lastarg, args) fprintf((fp), (lastarg), va_alist) +# define VA_END(args) +#endif + + +/* Compare strings *S1 and *S2. + Return negative if the first is less, positive if it is greater, + zero if they are equal. */ + +int +alpha_compare (const void *v1, const void *v2) +{ + const char *s1 = *((char **)v1); + const char *s2 = *((char **)v2); + + if (*s1 != *s2) + return *s1 - *s2; + return strcmp (s1, s2); +} + +/* Discard each backslash-newline combination from LINE. + Backslash-backslash-newline combinations become backslash-newlines. + This is done by copying the text at LINE into itself. */ + +void +collapse_continuations (char *line) +{ + register char *in, *out, *p; + register int backslash; + register unsigned int bs_write; + + in = strchr (line, '\n'); + if (in == 0) + return; + + out = in; + while (out > line && out[-1] == '\\') + --out; + + while (*in != '\0') + { + /* BS_WRITE gets the number of quoted backslashes at + the end just before IN, and BACKSLASH gets nonzero + if the next character is quoted. */ + backslash = 0; + bs_write = 0; + for (p = in - 1; p >= line && *p == '\\'; --p) + { + if (backslash) + ++bs_write; + backslash = !backslash; + + /* It should be impossible to go back this far without exiting, + but if we do, we can't get the right answer. */ + if (in == out - 1) + abort (); + } + + /* Output the appropriate number of backslashes. */ + while (bs_write-- > 0) + *out++ = '\\'; + + /* Skip the newline. */ + ++in; + + /* If the newline is escaped, discard following whitespace leaving just + one space. POSIX requires that each backslash/newline/following + whitespace sequence be reduced to a single space. */ + if (backslash) + { + in = next_token (in); + /* Removing this loop will fix Savannah bug #16670: do we want to? */ + while (out > line && isblank ((unsigned char)out[-1])) + --out; + *out++ = ' '; + } + else + /* If the newline isn't quoted, put it in the output. */ + *out++ = '\n'; + + /* Now copy the following line to the output. + Stop when we find backslashes followed by a newline. */ + while (*in != '\0') + if (*in == '\\') + { + p = in + 1; + while (*p == '\\') + ++p; + if (*p == '\n') + { + in = p; + break; + } + while (in < p) + *out++ = *in++; + } + else + *out++ = *in++; + } + + *out = '\0'; +} + +/* Print N spaces (used in debug for target-depth). */ + +void +print_spaces (unsigned int n) +{ + while (n-- > 0) + putchar (' '); +} + + +/* Return a string whose contents concatenate the NUM strings provided + This string lives in static, re-used memory. */ + +const char * +#if HAVE_ANSI_COMPILER && USE_VARIADIC && HAVE_STDARG_H +concat (unsigned int num, ...) +#else +concat (num, va_alist) + unsigned int num; + va_dcl +#endif +{ + static unsigned int rlen = 0; + static char *result = NULL; + int ri = 0; + +#if USE_VARIADIC + va_list args; +#endif + + VA_START (args, num); + + while (num-- > 0) + { + const char *s = va_arg (args, const char *); + unsigned int l = s ? strlen (s) : 0; + + if (l == 0) + continue; + + if (ri + l > rlen) + { + rlen = ((rlen ? rlen : 60) + l) * 2; + result = xrealloc (result, rlen); + } + + memcpy (result + ri, s, l); + ri += l; + } + + VA_END (args); + + /* Get some more memory if we don't have enough space for the + terminating '\0'. */ + if (ri == rlen) + { + rlen = (rlen ? rlen : 60) * 2; + result = xrealloc (result, rlen); + } + + result[ri] = '\0'; + + return result; +} + +/* Print a message on stdout. */ + +void +#if HAVE_ANSI_COMPILER && USE_VARIADIC && HAVE_STDARG_H +message (int prefix, const char *fmt, ...) +#else +message (prefix, fmt, va_alist) + int prefix; + const char *fmt; + va_dcl +#endif +{ +#if USE_VARIADIC + va_list args; +#endif + + log_working_directory (1); + + if (fmt != 0) + { + if (prefix) + { + if (makelevel == 0) + printf ("%s: ", program); + else + printf ("%s[%u]: ", program, makelevel); + } + VA_START (args, fmt); + VA_PRINTF (stdout, fmt, args); + VA_END (args); + putchar ('\n'); + } + + fflush (stdout); +} + +/* Print an error message. */ + +void +#if HAVE_ANSI_COMPILER && USE_VARIADIC && HAVE_STDARG_H +error (const struct floc *flocp, const char *fmt, ...) +#else +error (flocp, fmt, va_alist) + const struct floc *flocp; + const char *fmt; + va_dcl +#endif +{ +#if USE_VARIADIC + va_list args; +#endif + + log_working_directory (1); + + if (flocp && flocp->filenm) + fprintf (stderr, "%s:%lu: ", flocp->filenm, flocp->lineno); + else if (makelevel == 0) + fprintf (stderr, "%s: ", program); + else + fprintf (stderr, "%s[%u]: ", program, makelevel); + + VA_START(args, fmt); + VA_PRINTF (stderr, fmt, args); + VA_END (args); + + putc ('\n', stderr); + fflush (stderr); +} + +/* Print an error message and exit. */ + +void +#if HAVE_ANSI_COMPILER && USE_VARIADIC && HAVE_STDARG_H +fatal (const struct floc *flocp, const char *fmt, ...) +#else +fatal (flocp, fmt, va_alist) + const struct floc *flocp; + const char *fmt; + va_dcl +#endif +{ +#if USE_VARIADIC + va_list args; +#endif + + log_working_directory (1); + + if (flocp && flocp->filenm) + fprintf (stderr, "%s:%lu: *** ", flocp->filenm, flocp->lineno); + else if (makelevel == 0) + fprintf (stderr, "%s: *** ", program); + else + fprintf (stderr, "%s[%u]: *** ", program, makelevel); + + VA_START(args, fmt); + VA_PRINTF (stderr, fmt, args); + VA_END (args); + + fputs (_(". Stop.\n"), stderr); + + die (2); +} + +#ifndef HAVE_STRERROR + +#undef strerror + +char * +strerror (int errnum) +{ + extern int errno, sys_nerr; +#ifndef __DECC + extern char *sys_errlist[]; +#endif + static char buf[] = "Unknown error 12345678901234567890"; + + if (errno < sys_nerr) + return sys_errlist[errnum]; + + sprintf (buf, _("Unknown error %d"), errnum); + return buf; +} +#endif + +/* Print an error message from errno. */ + +void +perror_with_name (const char *str, const char *name) +{ + error (NILF, _("%s%s: %s"), str, name, strerror (errno)); +} + +/* Print an error message from errno and exit. */ + +void +pfatal_with_name (const char *name) +{ + fatal (NILF, _("%s: %s"), name, strerror (errno)); + + /* NOTREACHED */ +} + +/* Like malloc but get fatal error if memory is exhausted. */ +/* Don't bother if we're using dmalloc; it provides these for us. */ + +#ifndef HAVE_DMALLOC_H + +#undef xmalloc +#undef xcalloc +#undef xrealloc +#undef xstrdup + +void * +xmalloc (unsigned int size) +{ + /* Make sure we don't allocate 0, for pre-ISO implementations. */ + void *result = malloc (size ? size : 1); + if (result == 0) + fatal (NILF, _("virtual memory exhausted")); + return result; +} + + +void * +xcalloc (unsigned int size) +{ + /* Make sure we don't allocate 0, for pre-ISO implementations. */ + void *result = calloc (size ? size : 1, 1); + if (result == 0) + fatal (NILF, _("virtual memory exhausted")); + return result; +} + + +void * +xrealloc (void *ptr, unsigned int size) +{ + void *result; + + /* Some older implementations of realloc() don't conform to ISO. */ + if (! size) + size = 1; + result = ptr ? realloc (ptr, size) : malloc (size); + if (result == 0) + fatal (NILF, _("virtual memory exhausted")); + return result; +} + + +char * +xstrdup (const char *ptr) +{ + char *result; + +#ifdef HAVE_STRDUP + result = strdup (ptr); +#else + result = malloc (strlen (ptr) + 1); +#endif + + if (result == 0) + fatal (NILF, _("virtual memory exhausted")); + +#ifdef HAVE_STRDUP + return result; +#else + return strcpy (result, ptr); +#endif +} + +#endif /* HAVE_DMALLOC_H */ + +char * +xstrndup (const char *str, unsigned int length) +{ + char *result; + +#ifdef HAVE_STRNDUP + result = strndup (str, length); + if (result == 0) + fatal (NILF, _("virtual memory exhausted")); +#else + result = xmalloc (length + 1); + if (length > 0) + strncpy (result, str, length); + result[length] = '\0'; +#endif + + return result; +} + + +/* Limited INDEX: + Search through the string STRING, which ends at LIMIT, for the character C. + Returns a pointer to the first occurrence, or nil if none is found. + Like INDEX except that the string searched ends where specified + instead of at the first null. */ + +char * +lindex (const char *s, const char *limit, int c) +{ + while (s < limit) + if (*s++ == c) + return (char *)(s - 1); + + return 0; +} + +/* Return the address of the first whitespace or null in the string S. */ + +char * +end_of_token (const char *s) +{ + while (*s != '\0' && !isblank ((unsigned char)*s)) + ++s; + return (char *)s; +} + +#ifdef WINDOWS32 +/* + * Same as end_of_token, but take into account a stop character + */ +char * +end_of_token_w32 (const char *s, char stopchar) +{ + const char *p = s; + int backslash = 0; + + while (*p != '\0' && *p != stopchar + && (backslash || !isblank ((unsigned char)*p))) + { + if (*p++ == '\\') + { + backslash = !backslash; + while (*p == '\\') + { + backslash = !backslash; + ++p; + } + } + else + backslash = 0; + } + + return (char *)p; +} +#endif + +/* Return the address of the first nonwhitespace or null in the string S. */ + +char * +next_token (const char *s) +{ + while (isblank ((unsigned char)*s)) + ++s; + return (char *)s; +} + +/* Find the next token in PTR; return the address of it, and store the length + of the token into *LENGTHPTR if LENGTHPTR is not nil. Set *PTR to the end + of the token, so this function can be called repeatedly in a loop. */ + +char * +find_next_token (const char **ptr, unsigned int *lengthptr) +{ + const char *p = next_token (*ptr); + + if (*p == '\0') + return 0; + + *ptr = end_of_token (p); + if (lengthptr != 0) + *lengthptr = *ptr - p; + + return (char *)p; +} + + +/* Copy a chain of `struct dep'. For 2nd expansion deps, dup the name. */ + +struct dep * +copy_dep_chain (const struct dep *d) +{ + struct dep *firstnew = 0; + struct dep *lastnew = 0; + + while (d != 0) + { + struct dep *c = xmalloc (sizeof (struct dep)); + memcpy (c, d, sizeof (struct dep)); + + if (c->need_2nd_expansion) + c->name = xstrdup (c->name); + + c->next = 0; + if (firstnew == 0) + firstnew = lastnew = c; + else + lastnew = lastnew->next = c; + + d = d->next; + } + + return firstnew; +} + +/* Free a chain of 'struct dep'. */ + +void +free_dep_chain (struct dep *d) +{ + while (d != 0) + { + struct dep *df = d; + d = d->next; + free_dep (df); + } +} + +/* Free a chain of struct nameseq. + For struct dep chains use free_dep_chain. */ + +void +free_ns_chain (struct nameseq *ns) +{ + while (ns != 0) + { + struct nameseq *t = ns; + ns = ns->next; + free (t); + } +} + + +#if !HAVE_STRCASECMP && !HAVE_STRICMP && !HAVE_STRCMPI + +/* If we don't have strcasecmp() (from POSIX), or anything that can substitute + for it, define our own version. */ + +int +strcasecmp (const char *s1, const char *s2) +{ + while (1) + { + int c1 = (int) *(s1++); + int c2 = (int) *(s2++); + + if (isalpha (c1)) + c1 = tolower (c1); + if (isalpha (c2)) + c2 = tolower (c2); + + if (c1 != '\0' && c1 == c2) + continue; + + return (c1 - c2); + } +} +#endif + +#if !HAVE_STRNCASECMP && !HAVE_STRNICMP && !HAVE_STRNCMPI + +/* If we don't have strncasecmp() (from POSIX), or anything that can + substitute for it, define our own version. */ + +int +strncasecmp (const char *s1, const char *s2, int n) +{ + while (n-- > 0) + { + int c1 = (int) *(s1++); + int c2 = (int) *(s2++); + + if (isalpha (c1)) + c1 = tolower (c1); + if (isalpha (c2)) + c2 = tolower (c2); + + if (c1 != '\0' && c1 == c2) + continue; + + return (c1 - c2); + } + + return 0; +} +#endif + +#ifdef GETLOADAVG_PRIVILEGED + +#ifdef POSIX + +/* Hopefully if a system says it's POSIX.1 and has the setuid and setgid + functions, they work as POSIX.1 says. Some systems (Alpha OSF/1 1.2, + for example) which claim to be POSIX.1 also have the BSD setreuid and + setregid functions, but they don't work as in BSD and only the POSIX.1 + way works. */ + +#undef HAVE_SETREUID +#undef HAVE_SETREGID + +#else /* Not POSIX. */ + +/* Some POSIX.1 systems have the seteuid and setegid functions. In a + POSIX-like system, they are the best thing to use. However, some + non-POSIX systems have them too but they do not work in the POSIX style + and we must use setreuid and setregid instead. */ + +#undef HAVE_SETEUID +#undef HAVE_SETEGID + +#endif /* POSIX. */ + +#ifndef HAVE_UNISTD_H +extern int getuid (), getgid (), geteuid (), getegid (); +extern int setuid (), setgid (); +#ifdef HAVE_SETEUID +extern int seteuid (); +#else +#ifdef HAVE_SETREUID +extern int setreuid (); +#endif /* Have setreuid. */ +#endif /* Have seteuid. */ +#ifdef HAVE_SETEGID +extern int setegid (); +#else +#ifdef HAVE_SETREGID +extern int setregid (); +#endif /* Have setregid. */ +#endif /* Have setegid. */ +#endif /* No . */ + +/* Keep track of the user and group IDs for user- and make- access. */ +static int user_uid = -1, user_gid = -1, make_uid = -1, make_gid = -1; +#define access_inited (user_uid != -1) +static enum { make, user } current_access; + + +/* Under -d, write a message describing the current IDs. */ + +static void +log_access (const char *flavor) +{ + if (! ISDB (DB_JOBS)) + return; + + /* All the other debugging messages go to stdout, + but we write this one to stderr because it might be + run in a child fork whose stdout is piped. */ + + fprintf (stderr, _("%s: user %lu (real %lu), group %lu (real %lu)\n"), + flavor, (unsigned long) geteuid (), (unsigned long) getuid (), + (unsigned long) getegid (), (unsigned long) getgid ()); + fflush (stderr); +} + + +static void +init_access (void) +{ +#ifndef VMS + user_uid = getuid (); + user_gid = getgid (); + + make_uid = geteuid (); + make_gid = getegid (); + + /* Do these ever fail? */ + if (user_uid == -1 || user_gid == -1 || make_uid == -1 || make_gid == -1) + pfatal_with_name ("get{e}[gu]id"); + + log_access (_("Initialized access")); + + current_access = make; +#endif +} + +#endif /* GETLOADAVG_PRIVILEGED */ + +/* Give the process appropriate permissions for access to + user data (i.e., to stat files, or to spawn a child process). */ +void +user_access (void) +{ +#ifdef GETLOADAVG_PRIVILEGED + + if (!access_inited) + init_access (); + + if (current_access == user) + return; + + /* We are in "make access" mode. This means that the effective user and + group IDs are those of make (if it was installed setuid or setgid). + We now want to set the effective user and group IDs to the real IDs, + which are the IDs of the process that exec'd make. */ + +#ifdef HAVE_SETEUID + + /* Modern systems have the seteuid/setegid calls which set only the + effective IDs, which is ideal. */ + + if (seteuid (user_uid) < 0) + pfatal_with_name ("user_access: seteuid"); + +#else /* Not HAVE_SETEUID. */ + +#ifndef HAVE_SETREUID + + /* System V has only the setuid/setgid calls to set user/group IDs. + There is an effective ID, which can be set by setuid/setgid. + It can be set (unless you are root) only to either what it already is + (returned by geteuid/getegid, now in make_uid/make_gid), + the real ID (return by getuid/getgid, now in user_uid/user_gid), + or the saved set ID (what the effective ID was before this set-ID + executable (make) was exec'd). */ + + if (setuid (user_uid) < 0) + pfatal_with_name ("user_access: setuid"); + +#else /* HAVE_SETREUID. */ + + /* In 4BSD, the setreuid/setregid calls set both the real and effective IDs. + They may be set to themselves or each other. So you have two alternatives + at any one time. If you use setuid/setgid, the effective will be set to + the real, leaving only one alternative. Using setreuid/setregid, however, + you can toggle between your two alternatives by swapping the values in a + single setreuid or setregid call. */ + + if (setreuid (make_uid, user_uid) < 0) + pfatal_with_name ("user_access: setreuid"); + +#endif /* Not HAVE_SETREUID. */ +#endif /* HAVE_SETEUID. */ + +#ifdef HAVE_SETEGID + if (setegid (user_gid) < 0) + pfatal_with_name ("user_access: setegid"); +#else +#ifndef HAVE_SETREGID + if (setgid (user_gid) < 0) + pfatal_with_name ("user_access: setgid"); +#else + if (setregid (make_gid, user_gid) < 0) + pfatal_with_name ("user_access: setregid"); +#endif +#endif + + current_access = user; + + log_access (_("User access")); + +#endif /* GETLOADAVG_PRIVILEGED */ +} + +/* Give the process appropriate permissions for access to + make data (i.e., the load average). */ +void +make_access (void) +{ +#ifdef GETLOADAVG_PRIVILEGED + + if (!access_inited) + init_access (); + + if (current_access == make) + return; + + /* See comments in user_access, above. */ + +#ifdef HAVE_SETEUID + if (seteuid (make_uid) < 0) + pfatal_with_name ("make_access: seteuid"); +#else +#ifndef HAVE_SETREUID + if (setuid (make_uid) < 0) + pfatal_with_name ("make_access: setuid"); +#else + if (setreuid (user_uid, make_uid) < 0) + pfatal_with_name ("make_access: setreuid"); +#endif +#endif + +#ifdef HAVE_SETEGID + if (setegid (make_gid) < 0) + pfatal_with_name ("make_access: setegid"); +#else +#ifndef HAVE_SETREGID + if (setgid (make_gid) < 0) + pfatal_with_name ("make_access: setgid"); +#else + if (setregid (user_gid, make_gid) < 0) + pfatal_with_name ("make_access: setregid"); +#endif +#endif + + current_access = make; + + log_access (_("Make access")); + +#endif /* GETLOADAVG_PRIVILEGED */ +} + +/* Give the process appropriate permissions for a child process. + This is like user_access, but you can't get back to make_access. */ +void +child_access (void) +{ +#ifdef GETLOADAVG_PRIVILEGED + + if (!access_inited) + abort (); + + /* Set both the real and effective UID and GID to the user's. + They cannot be changed back to make's. */ + +#ifndef HAVE_SETREUID + if (setuid (user_uid) < 0) + pfatal_with_name ("child_access: setuid"); +#else + if (setreuid (user_uid, user_uid) < 0) + pfatal_with_name ("child_access: setreuid"); +#endif + +#ifndef HAVE_SETREGID + if (setgid (user_gid) < 0) + pfatal_with_name ("child_access: setgid"); +#else + if (setregid (user_gid, user_gid) < 0) + pfatal_with_name ("child_access: setregid"); +#endif + + log_access (_("Child access")); + +#endif /* GETLOADAVG_PRIVILEGED */ +} + +#ifdef NEED_GET_PATH_MAX +unsigned int +get_path_max (void) +{ + static unsigned int value; + + if (value == 0) + { + long int x = pathconf ("/", _PC_PATH_MAX); + if (x > 0) + value = x; + else + return MAXPATHLEN; + } + + return value; +} +#endif + + +/* This code is stolen from gnulib. + If/when we abandon the requirement to work with K&R compilers, we can + remove this (and perhaps other parts of GNU make!) and migrate to using + gnulib directly. + + This is called only through atexit(), which means die() has already been + invoked. So, call exit() here directly. Apparently that works...? +*/ + +/* Close standard output, exiting with status 'exit_failure' on failure. + If a program writes *anything* to stdout, that program should close + stdout and make sure that it succeeds before exiting. Otherwise, + suppose that you go to the extreme of checking the return status + of every function that does an explicit write to stdout. The last + printf can succeed in writing to the internal stream buffer, and yet + the fclose(stdout) could still fail (due e.g., to a disk full error) + when it tries to write out that buffered data. Thus, you would be + left with an incomplete output file and the offending program would + exit successfully. Even calling fflush is not always sufficient, + since some file systems (NFS and CODA) buffer written/flushed data + until an actual close call. + + Besides, it's wasteful to check the return value from every call + that writes to stdout -- just let the internal stream state record + the failure. That's what the ferror test is checking below. + + It's important to detect such failures and exit nonzero because many + tools (most notably `make' and other build-management systems) depend + on being able to detect failure in other tools via their exit status. */ + +void +close_stdout (void) +{ + int prev_fail = ferror (stdout); + int fclose_fail = fclose (stdout); + + if (prev_fail || fclose_fail) + { + if (fclose_fail) + error (NILF, _("write error: %s"), strerror (errno)); + else + error (NILF, _("write error")); + exit (EXIT_FAILURE); + } +} diff --git a/po/ChangeLog b/po/ChangeLog new file mode 100644 index 0000000..dbc21b4 --- /dev/null +++ b/po/ChangeLog @@ -0,0 +1,82 @@ +2009-09-16 Paul Smith + + * LINGUAS: Added new translation for Italian (it). + +2008-05-17 Paul Smith + + * LINGUAS: Added new translation for Lithuanian (lt). + +2007-08-15 Paul Smith + + * LINGUAS: The Kinyarwanda (rw) translation has disappeared from + the translation site, so remove it. + +2006-01-28 Paul D. Smith + + * LINGUAS: Added new translation for Vietnamese (vi). + +2005-07-14 Paul D. Smith + + * LINGUAS: Added new translation for Indonesian (id). + +2005-05-09 Paul D. Smith + + * POTFILES.in: Add new file vmsjobs.c. + +2005-04-06 Paul D. Smith + + * LINGUAS: Added a new translation for Kinywarwanda (rw). + +2005-02-09 Paul D. Smith + + * LINGUAS: Added a new translation for Irish (ga). + +2005-02-01 Paul D. Smith + + * LINGUAS: Added a new translation for Finnish (fi). + +2003-10-18 Paul D. Smith + + * LINGUAS: Added a new translation for Belarusian (be). + +2002-12-19 Paul D. Smith + + * LINGUAS: Added a new translation for Ukrainian (uk). + +2002-10-05 Paul D. Smith + + * POTFILES.in: Add variable.h as it has a translatable string. + +2002-08-08 Paul D. Smith + + * LINGUAS: Add a new translation for Chinese (simplified) (zh_CN). + +2002-08-02 Paul D. Smith + + * LINGUAS: Add a new translation for Swedish (sv). + +2002-04-21 Paul D. Smith + + * LINGUAS, hr.po: Added new translation: Croatian. + + * da.po, de.po, es.po, fr.po, gl.po, he.po, ja.po, ko.po, nl.po, + pl.po, pt_BR.po, ru.po, tr.po: Moved from i18n to here. + * .cvsignore: Moved from i18n to here. + + * POTFILES.in, LINGUAS, Makevars: Created. + +Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software +Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..6774713 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,5 @@ +# Set of available languages: 24 languages + +be da de es fi fr ga gl he hr id it ja ko lt nl pl pt_BR ru sv tr uk vi zh_CN + +# Can't seem to get en@quot and en@boldquot to build properly? diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..53efc5e --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,366 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2004 by Ulrich Drepper +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. +# +# Origin: gettext-0.14 + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) + +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +MSGMERGE = msgmerge +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) Makevars POTFILES.in $(DOMAIN).pot stamp-po \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: all-@USE_NLS@ + +all-yes: stamp-po +all-no: + +# stamp-po is a timestamp denoting the last time at which the CATALOGS have +# been loosely updated. Its purpose is that when a developer or translator +# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, +# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent +# invocations of "make" will do nothing. This timestamp would not be necessary +# if updating the $(CATALOGS) would always touch them; however, the rule for +# $(POFILES) has been designed to not touch files that don't need to be +# changed. +stamp-po: $(srcdir)/$(DOMAIN).pot + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @echo "touch stamp-po" + @echo timestamp > stamp-poT + @mv stamp-poT stamp-po + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)' + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common) Makevars.template; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + for file in Makevars; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in $(DISTFILES.common) Makevars.template; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +info dvi ps pdf html tags TAGS ctags CTAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f stamp-poT + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f stamp-po $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: $(DISTFILES) + dists="$(DISTFILES)"; \ + if test "$(PACKAGE)" = "gettext-tools"; then \ + dists="$$dists Makevars.template"; \ + fi; \ + if test -f $(srcdir)/ChangeLog; then \ + dists="$$dists ChangeLog"; \ + fi; \ + for i in 0 1 2 3 4 5 6 7 8 9; do \ + if test -f $(srcdir)/ChangeLog.$$i; then \ + dists="$$dists ChangeLog.$$i"; \ + fi; \ + done; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir); \ + else \ + cp -p $(srcdir)/$$file $(distdir); \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +Makefile: Makefile.in.in $(top_builddir)/config.status @POMAKEFILEDEPS@ + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/Makevars b/po/Makevars new file mode 100644 index 0000000..2103ce8 --- /dev/null +++ b/po/Makevars @@ -0,0 +1,60 @@ +# This is a -*-Makefile-*- +# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +# Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + + +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Free Software Foundation, Inc. + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = bug-make@gnu.org + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..05208bb --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,42 @@ +# List of source files containing translatable strings. +# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +# 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +ar.c +arscan.c +commands.c +dir.c +expand.c +file.c +function.c +getopt.c +hash.c +implicit.c +job.c +main.c +misc.c +read.c +remake.c +remote-cstms.c +rule.c +signame.c +strcache.c +variable.c +variable.h +vmsfunctions.c +vmsjobs.c +vpath.c diff --git a/po/Rules-quot b/po/Rules-quot new file mode 100644 index 0000000..9c2a995 --- /dev/null +++ b/po/Rules-quot @@ -0,0 +1,47 @@ +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-create: + $(MAKE) en@quot.po-update +en@boldquot.po-create: + $(MAKE) en@boldquot.po-update + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/po/be.gmo b/po/be.gmo new file mode 100644 index 0000000..f5a4512 Binary files /dev/null and b/po/be.gmo differ diff --git a/po/be.po b/po/be.po new file mode 100644 index 0000000..3b94b02 --- /dev/null +++ b/po/be.po @@ -0,0 +1,1983 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Ales Nyakhaychyk , 2002, 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.80\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2003-10-21 11:50+0300\n" +"Last-Translator: Ales Nyakhaychyk \n" +"Language-Team: Belarusian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 0.9.6\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "спроба выкарыстаць непадтрымліваемую мажлівасьць: \"%s\"" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "дакрананьне да ўдзельніку архіва недаступна на VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: архіў \"%s\" ня йснуе" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: \"%s\" - гэта не рэчаісны архіў" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: удзельнік \"%s\" ня йснуе ў \"%s\"" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "" + +#: arscan.c:69 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: arscan.c:175 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (назва мусіла быць абрэзана)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Дата %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, рэжым = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Выдаляецца файл \"%s\"" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Выдаляецца файл \"%s\"" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# загады для выкананьня" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (убудаваны):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (з\"%s\", радок %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Тэчкі\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "" + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "" + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "" + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Не" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " файлаў, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "не" + +#: dir.c:1071 +msgid " impossibilities" +msgstr "" + +#: dir.c:1075 +msgid " so far." +msgstr " так далёка." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr "" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "" + +#: file.c:267 +#, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "" + +#: file.c:272 +#, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "" + +#: file.c:278 +#, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "" + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Выдаляюцца прамежкавыя файлы...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: адбітак часу па-за дапушчальнымі межамі, падстаўляецца %s" + +#: file.c:804 +msgid "Current time" +msgstr "Бягучы час" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Ня мэта:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "" + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "" + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "загадны радок" + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "" + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "" + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "" + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Так сама робяцца:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Час зьмяненьня ніколі не правяраўся." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Файл ня йснуе." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Файл вельмі стары." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Апошняе зьмяненьне %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Файл быў абноўлены." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Файл ня быў абноўлены." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Загады, што выконваюцца зараз (ГЭТА - ПАМЫЛКА)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Загады, што выконваюцца зараз (ГЭТА - ПАМЫЛКА)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Пасьпяхова абноўлены." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "" + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "" + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Файлы" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe (): памылка ў process_init_fd()\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe (): памылка ў process_init_fd()\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "памылка ў CreatePipe() (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): памылка ў process_init_fd()\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "Ня зроблена для гэтае плятформы: функцыя \"%s\"" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: выбар \"%s\" - неадназначы.\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: выбар \"--%s\" не дазваляе довад.\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: выбар \"%c%s\" не дазваляе довад.\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: выбар \"%s\" патрабуе довад.\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: нераспазнаны выбар \"--%s\".\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: нераспазнаны выбар \"%c%s\".\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: недапушчальны выбар -- %c.\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: нерэчаісны выбар -- %c.\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: выбар патрабуе довад -- %c.\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: выбар \"-W %s\" - неадназначын.\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: выбар \"-W %s\" не дазваляе довад.\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "" + +#: job.c:335 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (часовы файл)" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Памылка 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Памылка %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr "" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Чакаюцца незавершаныя працы...." + +#: job.c:579 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr "" + +#: job.c:758 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: job.c:759 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "" + +#: job.c:861 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" + +#: job.c:920 +msgid "write jobserver" +msgstr "" + +#: job.c:922 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: job.c:1525 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" + +#: job.c:1778 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "" + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: загад не адшуканы" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, fuzzy, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL зьменена (раней \"%s\", зараз \"%s\")" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" + +#: main.c:303 +msgid "Options:\n" +msgstr "Выбары:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr "" +" -h, --help Друкуе гэтае паведамленьне й выходзіць.\n" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Друкуе нутраную базу даньняў make.\n" + +#: main.c:347 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Не адлюстроўваць загады.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Выключае -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Друкуе бягучую тэчку.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "пусты радок нерэчаісны ў якасьці назвы файла" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "" + +#: main.c:690 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: main.c:697 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" + +#: main.c:705 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: main.c:706 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: main.c:781 main.c:792 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: main.c:834 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s спынена на 30 сэкундаў..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile са стандартнага ўводу зададзены двойчы." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (часовы файл)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (часовы файл)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Паралельня працы (-j) не падтрымліваюцца на гэтае плятхорме." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "" + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" + +#: main.c:1750 +msgid "dup jobserver" +msgstr "" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "ствараецца трубаправод прац" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Абнаўляюцца make-файлы....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "" + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "" + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Makefile \"%s\" ня знойдзен" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "" + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (часовы файл): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "" + +#: main.c:2272 +msgid "No targets" +msgstr "Няма мэт" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Выкарыстаньне: %s [выбары] [мэта] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Гэта праграма пабудавана для %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Гэта праграма падубавана для %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Паведамляйце пра памылкі на .\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "выбар \"-%c\" патрабуе станоўчы цэлы довад" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "выбар \"-%c\" патрабуе станоўчы цэлы довад" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"Гэта праграма пабудавана для %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"Гэта праграма падубавана для %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: уваход у невядомую тэчку" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: выхад зь невядомае тэчкі" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: уваход у тэчку \"%s\"\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: выхад з тэчкі \"%s\"\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: уваход у невядомую тэчку" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: выхад зь невядомае тэчкі" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: уваход у тэчку \"%s\"\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: выхад з тэчкі \"%s\"\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr "" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Невядомая памылка %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "віртуальная памяць вычарпана" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: карыстальнік %lu (насамрэч %lu), група %lu (насамрэч %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "" + +#: misc.c:808 +msgid "User access" +msgstr "" + +#: misc.c:856 +msgid "Make access" +msgstr "" + +#: misc.c:890 +msgid "Child access" +msgstr "" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "" + +#: misc.c:956 +#, fuzzy +msgid "write error" +msgstr "Памылка шыны" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Чытаюцца make-файлы...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Чытаецца make-файл \"%s\"" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (няма дапомнае мэты)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (пошук шляху)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr "" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr "" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "" + +#: read.c:891 +msgid "recipe commences before first target" +msgstr "" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "прапушчана правіла перад загадамі" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "прапушчан падзяляльнік %s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (вы маеце на ўвазе TAB замест 8 прагалаў?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "прапушчаны \"endif\"" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "" + +#: read.c:1367 +msgid "extraneous text after `define' directive" +msgstr "" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "прапушчаны \"endef\", незавершаны \"define\"" + +#: read.c:1420 +msgid "extraneous text after `endef' directive" +msgstr "" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "зьнешні \"%s\"" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "" + +#: read.c:2006 +#, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "" + +#: read.c:2009 +#, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Нічога ня было зроблена для \"%s\"." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "\"%s\" - састарэл(а)." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sНяма правіла каб зрабіць мэту \"%s\"%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%s Няма правіла каб зрабіць мэту \"%s\", патрэбную для \"%s\"%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Файл \"%s\" ужо быў разгледжаны.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Усё яшэ абнаўляецца файл \"%s\".\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Скончана абнаўленьне файла \"%s\".\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Файл \"%s\" ня йснуе.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Нічога ня было зроблена для \"%s\"." + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "" + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "" + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: remake.c:765 +#, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr "" + +#: remake.c:815 +#, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Увага! Файл \"%s\" мае час зьмяненьня, які шчэ не надышоў." + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Увага! Файл \"%s\" мае час зьмяненьня %.2g с, які шчэ не надышоў." + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" + +#: rule.c:526 +msgid " terminal." +msgstr " тэрмінал." + +#: rule.c:534 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "" + +#: signame.c:86 +msgid "unknown signal" +msgstr "невядомы сыгнал" + +#: signame.c:94 +msgid "Hangup" +msgstr "" + +#: signame.c:97 +msgid "Interrupt" +msgstr "" + +#: signame.c:100 +msgid "Quit" +msgstr "" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Недапушчальная інструкцыя" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "" + +#: signame.c:111 +msgid "Aborted" +msgstr "" + +#: signame.c:114 +msgid "IOT trap" +msgstr "" + +#: signame.c:117 +msgid "EMT trap" +msgstr "" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "" + +#: signame.c:123 +msgid "Killed" +msgstr "Забіты" + +#: signame.c:126 +msgid "Bus error" +msgstr "Памылка шыны" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Дрэнны сыстэмны выклік" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Зламаны трубаправод" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "" + +#: signame.c:141 +msgid "Terminated" +msgstr "Завершаны" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "" + +#: signame.c:158 +msgid "Power failure" +msgstr "" + +#: signame.c:161 +msgid "Stopped" +msgstr "Спынен" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Спынен (tty увод)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Спынен (вывад на tty)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Спынена (сыгнал)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "" + +#: signame.c:188 +msgid "Window changed" +msgstr "Акно зьменена" + +#: signame.c:191 +msgid "Continued" +msgstr "" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "магчым У/В" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "" + +#: signame.c:213 +msgid "Resource lost" +msgstr "" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Сыгнал пагрозы" + +#: signame.c:219 +msgid "Information request" +msgstr "Запыт аб зьвестках" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" + +#: variable.c:1541 +msgid "default" +msgstr "дапомны" + +#: variable.c:1544 +msgid "environment" +msgstr "асяродзьдзе" + +#: variable.c:1547 +msgid "makefile" +msgstr "make-файл" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "" + +#: variable.c:1553 +msgid "command line" +msgstr "загадны радок" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "дырэктыва \"override\"" + +#: variable.c:1559 +msgid "automatic" +msgstr "аўтаматычна" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (з \"%s\", радок %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Пераменныя\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "Увага! Нявызначаная пераменная \"%.*s\"" + +#: vmsfunctions.c:92 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Невядомы ўбудаваны загад \"%s\".\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Памылка! Парожні загад.\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Перанакіраваны ўвод з %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Перанакіраваны вывад у %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Перанакіраваны вывад у %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Не задавайце -j ці --jobs, калі sh.exe недаступны." + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%s Гэта вольнае праграмнае забесьпячэньне; глядзіце зыходны код для\n" +#~ "%sпагадненьня аб распаўсюджваньні. Ня йснуе НІЯКАЕ гарантыі, нават аб\n" +#~ "%sмагчымасьці выкарыстньня зь якой небудзь мэтай.\n" + +#~ msgid "invalid `override' directive" +#~ msgstr "нерэчаісная дырэктыва \"override\"" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "няма назвы файла для \"%sinclude\"" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Няма файлаў." + +#~ msgid "DIRECTORY" +#~ msgstr "ТЭЧКА" + +#~ msgid "FILE" +#~ msgstr "ФАЙЛ" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Чытае ФАЙЛ як make-файл" + +#~ msgid "Entering" +#~ msgstr "Уваход у" + +#~ msgid "Leaving" +#~ msgstr "выхад з" + +#~ msgid "# No variables." +#~ msgstr "# Няма пераменных." diff --git a/po/boldquot.sed b/po/boldquot.sed new file mode 100644 index 0000000..4b937aa --- /dev/null +++ b/po/boldquot.sed @@ -0,0 +1,10 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g +s/“/“/g +s/”/”/g +s/‘/‘/g +s/’/’/g diff --git a/po/da.gmo b/po/da.gmo new file mode 100644 index 0000000..7a5badb Binary files /dev/null and b/po/da.gmo differ diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..de34eb7 --- /dev/null +++ b/po/da.po @@ -0,0 +1,2098 @@ +# Danish messages for make +# Copyright (C) 2001 Free Software Foundation, Inc. +# Byrial Ole Jensen , 2001 +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.80\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2002-10-05 22:56+0200\n" +"Last-Translator: Byrial Ole Jensen \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "forsøg på at bruge en ikke understøttet facilitet: '%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "'berør arkivmedlem' er ikke tilgængelig på VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "berør: Arkivet '%s' findes ikke" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "berør: '%s' er ikke et gyldigt arkiv" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "berør: Medlemmet '%s' findes ikke i '%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "berør: Forkert returkode fra ar_member_touch på '%s'" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module kunne ikke udtrække modulinformation, status = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control fejlede med status = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "kan ikke åbne biblioteket '%s' for at søge medlemmet '%s'" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Medlem '%s'%s: %ld byte ved %ld (/%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (navnet kan være forkortet)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Tidsstempel %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modus = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Afbrydelse.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Arkivmedlemmet '%s' er måske falsk; ikke slettet" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Arkivmedlemmet '%s' er måske falsk; ikke slettet" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Sletter filen '%s'" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Sletter filen '%s'" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# kommandoer at udføre" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (indbyggede):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (fra '%s', linje %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Filkataloger\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: kunne ikke undersøges med stat.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (nøgle %s, mtime %d): kunne ikke åbnes.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (enhed %d, inode [%d,%d,%d]): kunne ikke åbnes.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (enhed %ld, inode %ld): kunne ikke åbnes.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (nøgle %s, mtime %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (enhed %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (enhed %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Ingen" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " filer, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "ingen" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " umuligheder" + +#: dir.c:1075 +msgid " so far." +msgstr " indtil videre." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " umuligheder i %lu kataloger.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Rekursiv variabel '%s' refererer (i sidste ende) til sig selv" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "uafsluttet variabelreference" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Kommandoer var angivet for fil '%s' i %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "Kommandoer for fil '%s' blev fundet ved implicit regel-søgning," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "men '%s' bliver nu anset som samme fil som '%s'." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "Kommandoer for '%s' vil blive ignoreret til fordel for dem til '%s'." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "kan ikke ændre enkelt-kolon '%s' til dobbelt-kolon '%s'" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "kan ikke ændre dobbelt-kolon '%s' til enkelt-kolon '%s'" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Sletter mellemfil '%s'" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Sletter mellemfiler ...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tidsstempel i forkert område; bruger %s" + +#: file.c:804 +msgid "Current time" +msgstr "Aktuel tid" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Ikke et mål:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Værdifuld fil (forudsætning for .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Falsk mål (forudsætning for .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Kommandolinjemål." + +#: file.c:935 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# En uangivet makefil, evt. en fra MAKEFILES." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Der er udført implicit regelsøgning." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Der er ikke udført implicit regelsøgning." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Implicit/statisk mønsterstamme: '%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Filen er en mellemfil." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Skaber også:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Ændringstid ikke tjekket." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Filen findes ikke." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Filen er meget gammel." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Sidst ændret %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Filen er blevet opdateret." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Filen er ikke blevet opdateret." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Kommandoer udføres nu (DETTE ER EN FEJL)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Kommandoer for afhængigheder udføres nu (DETTE ER EN FEJL)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Opdateret med godt resultat." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Behøver opdatering (-q er sat)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Opdatering mislykkedes." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Ugyldig værdi i 'update_status'-felt!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Ugyldig værdi i 'command_state'-felt!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Filer" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# Statistik for fil-hash-spande:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "ikke-numerisk første argument til 'word'-funktionen" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "første argument til 'word'-functionen skal være større end 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "ikke-numerisk første argument til 'wordlist'-funktionen" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "ikke-numerisk andet argument til 'wordlist'-funktionen" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) mislykkedes (e=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) mislykkedes (e=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() mislykkedes (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() mislykkedes\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Afrydder midlertidig batchfil %s\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "Utilstrækkeligt antal argumenter (%d) til funktionen '%s'" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "Uimplementeret på denne platform: funktion '%s'" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "Uafsluttet kald til funktionen '%s'; manglende '%c'" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: tilvalg '%s' er flertydigt\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: tilvalg '--%s' tillader ikke et argument\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: tilvalg '%c%s' tillader ikke et argument\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s tilvalg '%s' kræver et argument\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ikke genkendt tilvalg '--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ikke genkendt tilvalg '%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ulovligt tilvalg -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ugyldigt tilvalg -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: tilvalg kræver et argument -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: tilvalg '-W %s' er flertydigt\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: tilvalg '-W %s' tillader ikke et argument\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "kan ikke tildele %ld byte til hash-spande: hukommelsen opbrugt" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Fyldning=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Omgrupperinger=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Sammenstød=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Kigger efter en implicit regel for '%s'.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Kigger efter en implicit arkivmedlemsregel for '%s'.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Undgår rekursion i implicitte regler.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Prøver mønsterregel med stammen '%.*s'.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Afviser umulig regelforudsætning '%s'.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Afviser umulig implicit forudsætning '%s'.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Prøver regelforudsætning '%s'.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Prøver implicit forudsætning '%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Fandt forudsætning '%s' som VPATH '%s'\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Kigger efter en regel med mellemfil '%s'.\n" + +#: job.c:335 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (midlertidig fil)" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Fejl 0x%x (ignoreret)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Fejl 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Fejl %d (ignoreret)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Fejl %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (core-fil efterladt)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Venter på uafsluttede job...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Levende barn 0x%08lx (%s), PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (eksternt)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Høster taberbarn 0x%08lx, PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Høster vinderbarn 0x%08lx, PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Afrydder midlertidig jobfil %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Fjerner barn 0x%08lx, PID %ld%s fra kæde.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "write jobserver" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Frigav symbol for barn 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() fejlede ved igangsætning af proces (e=%d)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Talte %d argumenter i fejlet igangsætning\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Sætter barn 0x%08lx (%s), PID %ld%s i kæden.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Fik symbol for barn 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "read jobs pipe" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Ingen grund til at genskabe målet '%s'" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "kan ikke gennemtvinge belastningsgrænser på dette styrestystem" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "kan ikke gennemtvinge belastningsgrænse: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make høstede børne-pid %d, venter endnu på pid %d\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Kommando ikke fundet" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s; Skalprogram ikke fundet" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, fuzzy, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL ændret (var '%s', nu '%s')" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Opretter midlertidig jobfil %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (linje %d) Forkert skal-kontekst (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Tilvalg:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoreret af hensyn til kompabilitet.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Skab alle mål betingelsesløst.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C KATALOG, --directory=KATALOG\n" +" Skift allerførst til KATALOG.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Udskriv en masse fejlsøgningsinformation.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAG] Udskriv forskellige slags " +"fejlsøgningsinformation.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Miljøvariable har forrang for makefiler.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FIL, --file=FIL, --makefile=FIL\n" +" Læs FIL som en makefil.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Udskriv denne besked og afslut.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignorér fejl fra kommandoer.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I KATALOG, --include-dir=KATALOG\n" +" Søg i KATALOG efter inkluderede makefiler.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Tillad N samtidige job; uendelig mange job " +"uden argument.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Fortsæt selvom nogen mål ikke kan skabes.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Start ikke flere job medmindre belastningen er " +"under N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Udfør ikke nogen kommandoer; udskriv dem " +"bare.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o FIL, --old-file=FIL, --assume-old=FIL\n" +" Anse FIL som værende meget gammel og genskab " +"den ikke.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Udskriv makes interne database.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Udfør ingen kommandoer; afslutningskoden " +"fortæller status.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Slå de indbyggede implicitte regler fra.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables Slå de indbyggede variabelværdier fra.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Udskriv ikke kommander.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Slår -k fra.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Berør mål i stedet for at genskabe dem.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Udskriv makes versionnummer og afslut.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Udskriv det aktuelle katalog.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Slå -w fra, selv hvis det var slået til " +"automatisk.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W FIL, --what-if=FIL, --new-file=FIL, --assume-new=FIL\n" +" Anse FIL som værende nyskabt.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Advar når en udefineret variabel bruges.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "en tom streng er ugyldig som filnavn" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "ukendt fejlsøgningsniveau-specifikation '%s'" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Interrupt/undtagelse fanget (kode = 0x%x, addr = 0x%x)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Uhåndteret undtagelsesfilter kaldt fra program %s\n" +"ExceptionCode = %x\n" +"ExceptionFlags = %x\n" +"ExceptionAddress = %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Adgangskrænkelse: skriveoperation på adresse %x\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Adgangskrænkelse: læseoperation på adresse %x\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell sætter default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell stisøgning sætter default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s er standset i 30 sekunder..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "udført sleep(30). Fortsætter.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefil fra standard-ind er angivet to gange." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (midlertidig fil)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (midlertidig fil)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Parallelle job (-j) er ikke understøttet på denne platform." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Sætter tilbage til enkelt job-tilstand (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "intern fejl: flere '--jobserver-fds'-tilvalg" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "intern fejl: ugyldig '--jobserver-fds'-streng '%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "advarsel: tvunget -jN i undermake: slår jobserver tilstand fra." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"advarsel: jobserver ikke tilgængelig: bruger -j1. Tilføj '+' til " +"ophavsmakeregel." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "oprettelse af jobledning" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "klargøring af jobserver-ledning" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Opdaterer makefiler....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Makefilen '%s' får måske make til at gå i ring; genskaber den ikke.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Genskabelse af makefilen '%s' mislykkedes." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Inkluderet makefil '%s' blev ikke fundet." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Makefil '%s' blev ikke fundet." + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Kunne ikke skifte tilbage til det originale katalog." + +#: main.c:2102 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "Udfører igen:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (midlertidig fil): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Ingen angivne mål og ingen makefil fundet" + +#: main.c:2272 +msgid "No targets" +msgstr "Ingen mål" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Opdaterer endemål....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "advarsel: Fejl i urets tid opdaget. Din bygning kan være ukomplet." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Brug: %s [tilvalg] [mål] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Dette program er bygget til %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Dette program er bygget til %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Send fejlmeldinger (på engelsk) til .\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "'-%c'-tilvalget kræver et positivt heltalligt argument" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "'-%c'-tilvalget kræver et positivt heltalligt argument" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"Dette program er bygget til %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"Dette program er bygget til %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +# %s giver dato og klokkeslæt +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Makedatabase, udskrevet %s" + +# %s giver dato og klokkeslæt +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Afsluttet makedatabase %s\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Går til et ukendt katalog" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Forlader et ukendt katalog" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Går til katalog '%s'\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Forlader katalog '%s'\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Går til et ukendt katalog" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Forlader et ukendt katalog" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Går til katalog '%s'\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Forlader katalog '%s'\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Stop.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Ukendt fejl %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "virtuel hukommelse opbrugt" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: bruger %lu (reelt %lu), gruppe %lu (reelt %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Indledende adgang" + +#: misc.c:808 +msgid "User access" +msgstr "Brugeradgang" + +#: misc.c:856 +msgid "Make access" +msgstr "Make-adgang" + +#: misc.c:890 +msgid "Child access" +msgstr "Barneadgang" + +#: misc.c:954 +#, fuzzy, c-format +msgid "write error: %s" +msgstr "Omdirigeret fejl to %s\n" + +#: misc.c:956 +#, fuzzy +msgid "write error" +msgstr "write jobserver" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Læser makefiler...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Læser makefil '%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (ingen standard-endemål)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (søgesti)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (ikke nødvendig)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ingen ~-udfoldning)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "Ugyldig syntaks i betingelse" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "kommandoer begynder før det første mål" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "manglende regel før kommandoer" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "manglende adskiller%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (mente du TAB i stedet for 8 mellemrum?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "manglende målmønster" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "flere målmønstre" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "målmønster indeholder ingen '%%'" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "manglende 'endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "tomt variabelnavn" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Fremmed tekst efter 'endef'-direktiv" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "manglende 'endef', uafsluttet 'define'" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Fremmed tekst efter 'endef'-direktiv" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Fremmed tekst efter '%s'-direktiv" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "fremmed '%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "kun én 'else' per betingelse" + +#: read.c:1797 +#, fuzzy +msgid "Malformed target-specific variable definition" +msgstr "Misdannet per-mål variabeldefinition" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "blandede implicitte og statiske mønsterregler" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "blandede implicitte og normale regler" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "mål '%s' passer ikke til målmønstret" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "målfil '%s' har både :- og ::-angivelser" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "target '%s' optræder mere end én gang i samme regel." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "advarsel: tilsidesætter kommandoer for mål '%s'" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "advarsel: ignorerer gamle kommadoer for mål '%s'" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "advarsel: NUL-tegn set; resten af linjen ignoreres" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Ingenting at gøre for '%s'." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "'%s' er tidssvarende." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Beskærer fil '%s'.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sIngen regel til at skabe mål '%s'%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sIngen regel til at skabe mål '%s' som behøves af '%s'%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Overvejer målfil '%s'.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Opdatering af fil '%s' er forgæves prøvet for nylig.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Fil '%s' er allerede overvejet.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Opdaterer stadig fil '%s'.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Opdatering af fil '%s' afsluttet.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Filen '%s' findes ikke.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Advarsel: .LOW_RESOLUTION_TIME-fil '%s' har et tidsstempel med høj " +"opløsning" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Fandt en implicit regel for '%s'.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Ingen implicit regel for '%s' fundet.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Bruger standardkommandoer for '%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Cirkulær %s <- %s afhængighed opgivet." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Afsluttet forudsætningerne for målfil '%s'.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Forudsætningerne for '%s' er ved at blive skabt.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Opgiver målfil '%s'.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Målet '%s' ikke genskabt på grund af fejl." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Forudsætningen '%s' angiver kun rækkefølgen ift. målet '%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Forudsætningen '%s' for målet '%s' findes ikke.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Forudsætningen '%s' er nyere end målet '%s'.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Forudsætningen '%s' er ældre end målet '%s'.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Målet '%s' er med dobbelt-kolon og har ingen forudsætninger.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Ingen kommandoer til '%s' og ingen forudsætninger er ændrede.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Skaber '%s' pga. \"always-make\"-flag.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Ingen grund til at genskabe målet '%s'" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; bruger VPATH-navnet '%s'" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Skal genskabe målet '%s'.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Ignorerer VPATH-navnet '%s'.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Kommandoer til '%s' er ved at blive udført.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Genskabelse af målfil '%s' mislykkedes.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Målfil '%s' genskabt.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Med -q trænger målfilen '%s' til at blive genskabt.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Bruger standardkommandoer for '%s'.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Advarsel: Ændringstiden for filen '%s' er i fremtiden" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Advarsel: Ændringstiden for filen '%s' er %.2g s i fremtiden" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNS-element '%s' er ikke et mønster" + +# "remote job exportation interface to the Customs daemon": jeg aner ikke +# hvad der er tale om. I øvrigt ser remote-cstms.c forældet/ubrugt ud, og +# koden er ikke understøttet af GNU... +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs kan ikke eksporteres: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Implicitte regler." + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Ingen implicitte regler." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implicitte regler, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminale." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FEJL: num_pattern_rules forkert! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "ukendt signal" + +# De fleste af signalnavnene fra signame.c er kopieret fra libc.da.po, +# kun ganske enkelte findes ikke der. +#: signame.c:94 +msgid "Hangup" +msgstr "Læg på" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Afbrudt" + +#: signame.c:100 +msgid "Quit" +msgstr "Afslut" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Ulovlig instruktion" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Sporings-/stoppunkts-fælde" + +#: signame.c:111 +msgid "Aborted" +msgstr "Afbrudt" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT_fælde" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Emulatorfælde" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Undtagelsestilfælde ved flydendetals-operation" + +#: signame.c:123 +msgid "Killed" +msgstr "Dræbt" + +#: signame.c:126 +msgid "Bus error" +msgstr "Busfejl" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Lagersegmentfejl" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Ugyldigt systemkald" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Røret blev brudt" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Alarmen gik" + +#: signame.c:141 +msgid "Terminated" +msgstr "Termineret" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Brugerdefineret signal 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Brugerdefineret signal 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Barnet afsluttet" + +#: signame.c:158 +msgid "Power failure" +msgstr "Strømmen gik" + +#: signame.c:161 +msgid "Stopped" +msgstr "Stoppet" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Stoppet (ville læse fra tty)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Stoppet (ville skrive til tty)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Stoppet (signal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Begrænsning af CPU-tid overskredet" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Grænse for filstørrelse overskredet" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Virtuel tidsgrænse overskredet" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Profileringstiden udløb" + +#: signame.c:188 +msgid "Window changed" +msgstr "Vinduet blev ændret" + +#: signame.c:191 +msgid "Continued" +msgstr "Fortsættes" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Kritisk I/O-tilstand" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O mulig" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Resurse tabt" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Faresignal" + +#: signame.c:219 +msgid "Information request" +msgstr "Informationsforespørgsel" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Flydendetalshjælpeprocessor ikke tilgængelig" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# Statistik for fil-hash-spande:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "forvalgt" + +#: variable.c:1544 +msgid "environment" +msgstr "miljø" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefil" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "miljø med -e" + +#: variable.c:1553 +msgid "command line" +msgstr "kommandolinje" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "'override'-direktiv" + +#: variable.c:1559 +msgid "automatic" +msgstr "automatisk" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (fra '%s', linje %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# Statistik for variabelsæt-hash-spande:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabler\n" + +#: variable.c:1627 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Mønsterspecifikke variabelværdier" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Ingen mønsterspecifikke variabelværdier." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u mønsterspecifikke variabelværdier" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "advarsel: udefineret vaiabel '%.*s'" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search mislykkedes med %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Advarsel: Tom omdirigering\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "intern fejl: '%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-advarsel, du kan blive nødt til at genetablere CTRL-Y-behandling fra DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "BUILTIN RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Ukendt indbygget kommando '%s'\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Fejl, tom kommando\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Omdirigeret inddata from %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Omdirigeret fejl to %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Omdirigeret uddata til %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Omdirigeret uddata til %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Udfører i stedet %s\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Fejl ved spawn, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-søgestier\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Ingen 'vpath'-søgestier" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u 'vpath'-søgestier.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Ingen generel ('VPATH'-variabel) søgesti." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Generel ('VPATH'-variabel) søgesti:\n" +"# " + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Syntaksfejl, stadig inden i '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Fik et SIGCHLD; %u uhøstede børn.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-advarsel, CTRL-Y vil efterlade underproces(ser).\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Angiv ikke -j eller --jobs hvis sh.exe ikke er tilgængelig." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Sætter make tilbage til enkelt job-tilstand." + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sDette er frit programmel; se kildeteksten for kopieringsbetingelser.\n" +#~ "%sDer er INGEN garanti; end ikke for SALGBARHED eller EGNETHED TIL NOGET\n" +#~ "%sBESTEMT FORMÅL.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "fremmed 'endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "tomt 'override'-direktiv" + +#~ msgid "invalid `override' directive" +#~ msgstr "ugyldigt 'override'-direktiv" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "intet filnavn for '%sinclude'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "mål '%s' efterlader forudsætningsmønstret tomt" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Ingen filer." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u filer i %u hash-spande .\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# %.3f filer per spand i gennemsnit, maks. %u filer i en spand.\n" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Stands proces for at tillade et fejlsøgningsprogram at hænge sig på" + +#~ msgid "# No variables." +#~ msgstr "# Ingen variabler." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# %.1f variabler per spand i gennemsnit, maks. %u i en spand.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# %d.%d variabler per spand i gennemsnit, maks. %u i en spand.\n" diff --git a/po/de.gmo b/po/de.gmo new file mode 100644 index 0000000..ef209cf Binary files /dev/null and b/po/de.gmo differ diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..4e9c506 --- /dev/null +++ b/po/de.po @@ -0,0 +1,2192 @@ +# German message translation file for GNU make +# Copyright (C) 1996, 1997, 2002 Free Software Foundation, Inc. +# Karl Eichwalder , 2002, 2005. +# Alexander Mader , 2000. +# Alexander Mader , 1997. +# Jochen Hein , 1996. +# +# Vereinheitlichen: +# ================= +# command(s) -> Befehl(e)? (nicht: Kommando(s)) +# target(s) -> Ziel(e) (nicht: Target(s)) +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81-b3\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2005-10-20 20:55+0200\n" +"Last-Translator: Karl Eichwalder \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "Versuch, eine nicht unterstützte Funktionalität zu verwenden: »%s«" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "" +"VMS stellt nicht die Möglichkeit einer Änderung \n" +"der Zeitmarken von Archiveinträgen zur Verfügung" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: Archiv »%s« existiert nicht" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: »%s« ist kein gültiges Archiv" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: Eintrag »%s« existiert nicht in »%s«" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "" +"touch: Ungünstiger Rückgabewert beim Zugriff \n" +"von ar_member_touch auf »%s«" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "»lbr$set_module« konnte keine Modulinformation auslesen; Status = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "»lbr$ini_control« schlug mit Status = %d fehl" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "" +"Konnte die Bibliothek »%s« auf der Suche \n" +"nach dem Eintrag »%s« nicht öffnen" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "" +"Eintrag »%s« %s: \n" +"%ld Byte an Position %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (der Name ist möglicherweise gekürzt)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " Nutzer-ID = %d, Gruppen-ID = %d, Modus = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Abbruch.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Archiveintrag »%s« ist wohl falsch; nicht gelöscht" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Archiveintrag »%s« ist wohl falsch; nicht gelöscht" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Datei »%s« wird gelöscht" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Datei »%s« wird gelöscht" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# Auszuführende Kommandos" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (eingebaut):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (aus »%s«, Zeile %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Verzeichnisse\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: Konnte den Status nicht feststellen.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "" +"# %s ( Schlüssel (key) %s, letzte Änderung (mtime) %d): \n" +"Konnte nicht geöffnet werden.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" +"# %s (Gerät %d, I-Knoten (inode) [%d,%d,%d]): \n" +"Konnte nicht geöffnet werden.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" +"# %s (Gerät %ld, I-Knoten (inode) %ld): \n" +"Konnte nicht geöffnet werden.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (Schlüssel (key) %s, letzte Änderung (mtime) %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (Gerät %d, I-Knoten (inode) [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (Gerät %ld, I-Knoten (inode) %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Keine" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " Dateien, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "keine" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " Unmöglichkeiten" + +#: dir.c:1075 +msgid " so far." +msgstr " bisher." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " Unmöglichkeiten in %lu Verzeichnissen.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Rekursive Variable »%s« referenziert sich (schließlich) selbst" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "Nicht abgeschlossene Variablenreferenz" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "" +"Die Kommandos wurden für die Datei »%s« angegeben \n" +"an der Stelle %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" +"Die Kommandos für die Datei »%s« wurden aufgrund \n" +"der Suche nach impliziten Regeln gefunden," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "" +"aber »%s« wird jetzt als dieselbe Datei \n" +"wie »%s« betrachtet." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "" +"Die Kommandos für »%s« werden ignoriert, \n" +"die für »%s« werden bevorzugt." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" +"»%s« mit einfachem Doppelpunkt kann nicht in \n" +"»%s« mit doppeltem Doppelpunkt geändert werden" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" +"»%s« mit doppeltem Doppelpunkt kann nicht in \n" +"»%s« mit einfachem Doppelpunkt geändert werden" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Löschen der Zwischendatei »%s«" + +#: file.c:396 +#, fuzzy +msgid "Removing intermediate files...\n" +msgstr "*** Löschen der Zwischendatei »%s«" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Zeitstempel außerhalb der Reihenfolge; %s wird ersetzt" + +#: file.c:804 +msgid "Current time" +msgstr "Aktuelle Zeit" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Dies ist kein Ziel:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Wertvolle Datei (Voraussetzung von .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Vorgetäuschtes Ziel (Voraussetzung von .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Kommandozeilen-Ziel (target)." + +#: file.c:935 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Ein Standardwert oder MAKEFILES »make«-Steuerdatei." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Suche nach impliziten Regeln wurde durchgeführt." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Suche nach impliziten Regeln wurde nicht durchgeführt." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Ersetzung für implizites/statisches Muster: »%s«\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Datei ist ein Zwischenschritt in den Abhängigkeiten." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Erzeugt außerdem:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Zeit der letzten Änderung wurde nicht überprüft." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Die Datei existiert nicht." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Datei ist sehr alt." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Zuletzt geändert %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Datei wurde aktualisiert." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Datei wurde nicht aktualisiert." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Derzeit laufende Befehle (DAS IST EIN BUG)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Derzeit laufende Befehle für Abhängigkeiten (DAS IST EIN BUG)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Erfolgreich aktualisiert." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Eine Aktualisierung ist notwendig (-q ist angegeben)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Aktualisierung fehlgeschlagen." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Ungültiger Wert in »update_status«-Eintrag!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Ungültiger Wert im »command_state«-Eintrag!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Dateien" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "Nicht-numerisches erstes Argument zur »word«-Funktion" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "Erstes Argument zur »word«-Funktion muss größer als 0 sein" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "Nicht-numerisches erstes Argument für die »wordlist«-Funktion" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "Nicht-numerisches zweites Argument zur »wordlist«-Funktion" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "»create_child_process«: »DuplicateHandle(In)« schlug fehl (e=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "»create_child_process«: »DuplicateHandle(Err)« schlug fehl (e=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "»CreatePipe()« schlug fehl (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() schlug fehl\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Lösche temporäre Stapelverarbeitungsdatei %s\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "Zuwenig Argumente (%d) für die Funktion »%s«" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "Auf dieser Rechnerkonfiguration nicht implementiert: Funktion »%s«" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "Nicht beendeter Aufruf der Funktion »%s«: »%c« fehlt" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: Option »%s« ist mehrdeutig\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: Option »--%s« erlaubt kein Argument\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: Option »%c%s« erlaubt kein Argument\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: Option »%s« erfordert ein Argument\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: unerkannte Option »--%s«\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: unerkannte Option »%c%s«\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: unerlaubte Option -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ungültige Option -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: Option erfordert ein Argument -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: Option »-W %s« ist mehrdeutig\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: Option »-W %s« erlaubt kein Argument\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Suche nach einer impliziten Regel für »%s«.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Suche nach einer impliziten Regel für Archiveinträge für »%s«.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Vermeide Rekursion in den impliziten Regeln.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Versuche Muster-Regel mit Ersetzung »%.*s«.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Unmögliche Voraussetzung »%s« abgelehnt.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Unmögliche implizite Voraussetzung »%s« abgelehnt.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Versuche Voraussetzung »%s«.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Versuche implizite Voraussetzung »%s«.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Fand die Voraussetzung »%s« als VPATH »%s«\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Suche nach einer Regel mit der Zwischendatei »%s«.\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "temporäre Datei kann nicht erzeugt werden\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Fehler 0x%x (ignoriert)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Fehler 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Fehler %d (ignoriert)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Fehler %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (Speicherauszug erstellt)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Warte auf noch nicht beendete Prozesse..." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Aktiver Kindprozess 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (entfernt)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Sammle erfolglosen Kindprozess 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Sammle erfolgreichen Kindprozess 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Lösche temporäre Stapelverarbeitungsdatei »%s«\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Entferne Kindprozess 0x%08lx PID %ld %s aus der Kette.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "Schreibe Job-Server" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Marke des Kindprozesses 0x%08lx PID (%s) freigegeben.\n" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "»process_easy()« konnte den Prozess nicht starten (e=%d)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"%d Argumente gehörten zum fehlgeschlagenen Prozessstart\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Nehme Kindprozess 0x%08lx (%s) PID %ld%s in die Kette auf.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Marke für den Kindprozess 0x%08lx (%s) erhalten.\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "Lese Pipe für die Jobs" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Es ist nicht notwendig, das Target »%s« neu zu erzeugen" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "" +"Auf diesem Betriebssystem kann die Einhaltung\n" +"der Lastbeschränkung nicht erzwungen werden" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "Lasteinschränkung kann nicht erzwungen werden: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"»make« registrierte die Beendigung des Kindprozesses mit ID %d,\n" +"wartet jedoch noch auf den Prozess mit ID %d.\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Kommando nicht gefunden" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Shell-Programm wurde nicht gefunden" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL gewechselt (war »%s«, ist »%s«)\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Erstelle temporäre Stapelverarbeitungsdatei %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (Zeile %d) Falscher Shell-Kontext (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Optionen:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Aus Kompatibilitätsgründen ignoriert\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Alle Ziele ohne Bedingungen erstellen\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C VERZEICHNIS, --directory=VERZEICHNIS\n" +" In VERZEICHNIS wechseln, bevor etwas getan " +"wird\n" + +#: main.c:311 +#, fuzzy +msgid " -d Print lots of debugging information.\n" +msgstr "Viele Informationen zur Fehlersuche ausgeben" + +#: main.c:313 +#, fuzzy +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "Verschiedene Arten von Debug-Information ausgeben" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Umgebungsvariablen überschreiben »make«-" +"Steuerdateien\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f DATEI, --file=DATEI, --makefile=DATEI\n" +" DATEI als »make«-Steuerdatei lesen\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Diese Meldung ausgeben und beenden\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "Fehler in den Befehlen irgnorieren" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I VERZEICHNIS, --include-dir=VERZEICHNIS\n" +" VERZEICHNIS nach inkludierten\n" +" »make«-Steuerdateien durchsuchen\n" + +#: main.c:330 +#, fuzzy +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +"N Jobs gleichzeitig erlauben; unbegrenzte Anzahl \n" +"von Jobs ohne Argument" + +#: main.c:332 +#, fuzzy +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "Weiterlaufen, auch wenn einige Targets nicht erzeugt werden konnten" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:345 +#, fuzzy +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "Die interne Datenbank von »make« ausgeben" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +"Keine Befehle ausführen; der Exit-Status gibt an, ob die Dateien\n" +"aktuell sind" + +#: main.c:349 +#, fuzzy +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "Die eingebauten impliziten Regeln deaktivieren" + +#: main.c:351 +#, fuzzy +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "Die eingebauten Variablenbelegungen deaktivieren" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Befehle nicht ausgeben.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" -k abschalten.\n" + +#: main.c:358 +#, fuzzy +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +"Die Targets werden nur als aktualisiert markiert,\n" +"nicht tatsächlich erneuert" + +#: main.c:360 +#, fuzzy +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "Die Versionsnummer von »make« ausgeben und beenden" + +#: main.c:362 +#, fuzzy +msgid " -w, --print-directory Print the current directory.\n" +msgstr "Das aktuelle Verzeichnis ausgeben" + +#: main.c:364 +#, fuzzy +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "-w abschalten, selbst wenn es implizit eingeschaltet wurde" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:369 +#, fuzzy +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +"Eine Warnung ausgeben, wenn eine undefinierte Variable referenziert wird" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "Eine leere Zeichenkette ist als Dateiname ungültig" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "Unbekanntes Debug-Level angegeben »%s«" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: bekam Unterbrechung/Ausnahme signalisiert (Kode = 0x%x, Adr = 0x%x)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Das Programm %s rief einen Ausnahmefilter auf, \n" +"der nicht bearbeitet wurde\n" +"ExceptionCode = %x\n" +"ExceptionFlags = %x\n" +"ExceptionAddress = %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Zugriffsverletzung: Schreiboperation an Adresse %x\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Zugriffsverletzung: Leseoperation an Adresse %x\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell setzt default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell Suchpfad gesetzt; default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s setzt für 30 Sekunden aus..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "»sleep(30)« ist abgeschlossen. Es geht weiter.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Das Makefile wurde zweimal über die Standardeingabe angegeben." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (temporäre Datei)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (temporäre Datei)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" +"Parallele Abarbeitung (-j) \n" +"wird auf dieser Plattform nicht unterstützt." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Umstellung auf Einzel-Job-Verarbeitung (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "Interner Fehler: mehrfache --jobserver-fds Optionen" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "Interner Fehler: Falsche --jobserver-fds Angabe »%s«" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"Warnung: -jN in »make«-Verarbeitungszweig erzwungen: \n" +"Jobserver-Modus nicht verfügbar." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "Jobserver verdoppelt" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"Warnung: Kein Jobserver verfügbar: -j1 wird gesetzt. »+« zur Ursprungsregel\n" +"hinzufügen." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "Öffnen der Pipe für die Jobs" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "Initialisierung der Pipe für den jobserver" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "Symbolische Links sind nicht unterstützt: -L wird abgeschaltet." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Aktualisiere »make«-Steuerdateien...\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "" +"»make«-Steuerdatei »%s« könnte eine Schleife enthalten; \n" +"es wird nicht neu erzeugt.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Konnte die »make«-Steuerdatei »%s« nicht neu erstellen." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Die eingebundene »make«-Steuerdatei »%s« wurde nicht gefunden." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Die »make«-Steuerdatei »%s« wurde nicht gefunden" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Konnte nicht in das ursprüngliche Verzeichnis wechseln." + +#: main.c:2102 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "Erneute Ausführung:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (temporäre Datei): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL beinhaltet mehr als ein Ziel" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Keine Targets angegeben und keine »make«-Steuerdatei gefunden" + +#: main.c:2272 +msgid "No targets" +msgstr "Keine Targets" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Aktualisieren der Ziele...\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"Warnung: Mit der Uhr stimmt etwas nicht. \n" +"Die Bearbeitung könnte unvollständig sein." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Syntax: %s [Optionen] [Target] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Fehlermeldungen (auf Englisch) an senden.\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "Die Option »-%c« verlangt eine positive ganze Zahl als Argument" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "Die Option »-%c« verlangt eine positive ganze Zahl als Argument" + +#: main.c:3054 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "" + +#: main.c:3056 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# »Make«-Datenbank; erstellt am: %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# »Make«-Datenbank; beendet am: %s\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "ein unbekanntes Verzeichnis" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "ein unbekanntes Verzeichnis" + +# !!! Attention: concatenated with the previous messages!!! +#: main.c:3242 +#, fuzzy, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "»%s«\n" + +# !!! Attention: concatenated with the previous messages!!! +#: main.c:3245 +#, fuzzy, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "»%s«\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "ein unbekanntes Verzeichnis" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "ein unbekanntes Verzeichnis" + +# !!! Attention: concatenated with the previous messages!!! +#: main.c:3257 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "»%s«\n" + +# !!! Attention: concatenated with the previous messages!!! +#: main.c:3260 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "»%s«\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Schluss.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Unbekannter Fehler %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "Der virtuelle Speicher ist verbraucht" + +#: misc.c:708 +#, fuzzy, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: Nutzer %lu (tatsächlich %lu), Gruppe %lu (tatsächlich %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Initialisierter Zugriff" + +#: misc.c:808 +msgid "User access" +msgstr "" + +#: misc.c:856 +msgid "Make access" +msgstr "" + +#: misc.c:890 +msgid "Child access" +msgstr "" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "Schreibfehler: %s" + +#: misc.c:956 +msgid "write error" +msgstr "Schreibfehler" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "»make«-Steuerdateien werden gelesen...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "»make«-Steuerdatei »%s« wird gelesen" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (kein Standard-Ziel)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (Suchpfad)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (macht nichts)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (keine ~-Auflösung)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "Ungültige Syntax in der Bedingung" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "Befehle beginnen vor dem ersten Ziel" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "Es fehlt eine Regel vor den Befehlen" + +# Untranslatable because of weird %s usage -ke- +#: read.c:1027 +#, fuzzy, c-format +msgid "missing separator%s" +msgstr "Fehlendes Trennzeichen%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (Meinten Sie TAB anstelle von 8 Leerzeichen?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "Es fehlt ein Target-Muster" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "Mehrfache Target-Muster" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "Target-Muster enthält kein »%%«" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "Fehlendes »endif«" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "Leerer Variablenname" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Überflüssiger Text nach einer »endef«-Anweisung" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "Fehlendes »endef«, nicht abgeschlossenes »define«" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Überflüssiger Text nach einer »endef«-Anweisung" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Überflüssiger Text nach einer »%s«-Anweisung" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "Überflüssiges »%s«" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "Es ist nur ein »else« je Verzweigung erlaubt" + +#: read.c:1797 +#, fuzzy +msgid "Malformed target-specific variable definition" +msgstr "Falsche Ziel-bezogene Variablendefinition" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "Implizite und statische Muster-Regel vermischt" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "Implizite und normale Regel vermischt" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "Target »%s« passt nicht zum Target-Muster" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "Das Ziel »%s« enthält sowohl »:«- als auch »::«-Einträge" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "Das Ziel »%s« steht mehrfach in derselben Regel." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "Warnung: Die Befehle für das Ziel »%s« werden überschrieben" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "Warnung: Alte Befehle für das Ziel »%s« werden ignoriert" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "Warnung: NUL-Zeichen gelesen; der Rest der Zeile wird ignoriert" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Für das Ziel »%s« ist nichts zu tun." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "»%s« ist bereits aktualisiert." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Die Datei »%s« wird \"gestutzt\" (der Abhängigkeitsgraph).\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sKeine Regel, um »%s« zu erstellen%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "" +"%sKeine Regel vorhanden, um das Target »%s«, \n" +" benötigt von »%s«, zu erstellen%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Betrachte Target-Datei »%s«.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "" +"Versuchte gerade die Datei »%s« zu aktualisieren, \n" +"dies schlug aber fehl.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Die Datei »%s« wurde bereits betrachtet.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Die Datei »%s« wird immer noch aktualisiert.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Aktualisierung der Datei »%s« beendet.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Die Datei »%s« existiert nicht.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Eine implizite Regel für »%s« gefunden.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Keine implizite Regel für »%s« gefunden.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Verwende die Standard-Kommandos für »%s«.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Zirkuläre Datei %s <- %s Abhängigkeit wird nicht verwendet." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Fertig mit den Voraussetzungen für die Ziel-Datei »%s«.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Die Voraussetzungen von »%s« werden fertiggestellt.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Die Arbeit an der Target-Datei »%s« wurde aufgegeben.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Das Target »%s« wurde wegen Fehlern nicht aktualisiert." + +#: remake.c:727 +#, fuzzy, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Die Datei »%s« ist älter als das davon abhängige Ziel »%s«.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "" +"Die Datei »%s«, Voraussetzung für das Ziel »%s«, \n" +"existiert nicht.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Die Datei »%s« ist jünger als das davon abhängige Ziel »%s«.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Die Datei »%s« ist älter als das davon abhängige Ziel »%s«.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "" +"Das Ziel »%s« hat einen doppelten Doppelpunkt \n" +"und keine Voraussetzungen.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "" +"Kein Kommando für »%s« und keine Voraussetzung \n" +"wurde tatsächlich verändert.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Es ist nicht notwendig, das Target »%s« neu zu erzeugen" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; benutze VPATH-Name »%s«" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Das Target »%s« muss neu erzeugt werden.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Ignoriere VPATH-Name »%s«.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Die Kommandos von »%s« werden gerade ausgeführt.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Fehler beim Aktualisieren der Target-Datei »%s«.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Die Target-Datei »%s« wurde erfolgreich aktualisiert.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Target »%s« muss bei -q aktualisiert werden.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Verwende die Standard-Kommandos für »%s«.\n" + +#: remake.c:1357 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "*** Warnung: Datei »%s« hat zukünftige Änderungszeit (%s > %s)!" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "*** Warnung: Datei »%s« hat zukünftige Änderungszeit (%s > %s)!" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNS Element »%s« ist kein Muster" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs wird nicht exportieren: %s\n" + +#: rule.c:499 +#, fuzzy +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Keine impliziten Regeln vorhanden." + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Keine impliziten Regeln vorhanden." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implizite Regeln, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " Terminal." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: »num_pattern_rules« falsch! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "Unbekanntes Signal" + +#: signame.c:94 +msgid "Hangup" +msgstr "Aufgelegt" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Abgebrochen (Interrupt)" + +#: signame.c:100 +msgid "Quit" +msgstr "Quit" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Illegaler Befehl" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Verfolgen/anhalten abfangen (Trace/breakpoint trap)" + +#: signame.c:111 +msgid "Aborted" +msgstr "Abgebrochen (Aborted)" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT abfangen (IOT trap)" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT abfangen (EMT trap)" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Gleitkommafehler" + +#: signame.c:123 +msgid "Killed" +msgstr "Abgebrochen (Killed)" + +#: signame.c:126 +msgid "Bus error" +msgstr "Bus-Fehler" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Adressierungsdefekt" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Falscher Systemaufruf" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Zerstörte Pipe" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Wecksignal" + +#: signame.c:141 +msgid "Terminated" +msgstr "Abgebrochen (Terminated)" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Nutzersignal 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Nutzersignal 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Kindprozess beendet" + +#: signame.c:158 +msgid "Power failure" +msgstr "Stromausfall" + +#: signame.c:161 +msgid "Stopped" +msgstr "Angehalten" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Angehalten (tty input)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Angehalten (tty output)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Angehalten (signal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "CPU-Zeitschranke überschritten" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Dateigrößenschranke überschritten" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Virtueller Timer erloschen" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Profiling Timer erloschen" + +#: signame.c:188 +msgid "Window changed" +msgstr "Fenster hat sich verändert" + +#: signame.c:191 +msgid "Continued" +msgstr "Fortgesetzt" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Dringende I/O-Bedingung" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O möglich" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Ressource verloren gegangen" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Gefahrensignal" + +#: signame.c:219 +msgid "Information request" +msgstr "Informationsanforderung" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Es ist kein Koprozessor für Fließkommaoperationen vorhanden" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "# %u Variablen für %u hash-Werte.\n" + +#: variable.c:1541 +msgid "default" +msgstr "Standard" + +#: variable.c:1544 +msgid "environment" +msgstr "Umgebung" + +#: variable.c:1547 +msgid "makefile" +msgstr "Makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "Umgebung per -e" + +#: variable.c:1553 +msgid "command line" +msgstr "Kommandozeile" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "»override«-Anweisung" + +#: variable.c:1559 +msgid "automatic" +msgstr "automatisch" + +#: variable.c:1570 +#, fuzzy, c-format +msgid " (from `%s', line %lu)" +msgstr " (aus »%s«, Zeile %lu):\n" + +#: variable.c:1612 +#, fuzzy +msgid "# variable set hash-table stats:\n" +msgstr "# %u Variablen für %u hash-Werte.\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variablen\n" + +#: variable.c:1627 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Musterspezifische Variablenwerte" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Keine musterspezifischen Variablenwerte." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u musterspezifische Variablenwerte" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "Warnung: undefinierte Variable »%.*s«" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "»sys$search« schlug mit %d fehl\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Warnung: Umleitung ins Leere!\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "Interner Fehler: »%s« command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-Warnung: Vielleicht müssen Sie STRG-Y aus DCL wieder ermöglichen.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "BUILTIN RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Unbekanntes eingebautes Kommando »%s«\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Fehler: Leere Anweisung\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Datei %s auf Standardeingabe umgeleitet\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Fehlerausgabe nach %s umgeleitet\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Ausgabe nach %s umgeleitet\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Ausgabe nach %s umgeleitet\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s wird stattdessen ausgeführt\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Fehler beim Starten eines Kindprozesses, %d.\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-Suchpfade\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Keine »vpath«-Suchpfade." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u »vpath«-Suchpfade.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Kein allgemeiner Suchpfad (Variable »VPATH«)." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Allgemeiner Suchpfad (Variable »VPATH«):\n" +"# " + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "" +#~ "Wenn »sh.exe« nicht vorhanden ist, \n" +#~ "sollten Sie nicht »-j« oder »--jobs« angeben." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "»make« wird so umgestellt, dass nur ein Job laufen kann." + +#, fuzzy +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ ", von Richard Stallman und Roland McGrath.\n" +#~ "%sErstellt für %s\n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s\tFree Software Foundation, Inc.\n" +#~ "%sDies ist Freie Software; siehe die Programmquellen für " +#~ "Vervielfältigungsbedingungen.\n" +#~ "%sEs gibt KEINE Gewährleistung; nicht einmal für VERMARKTUNG oder " +#~ "NUTZBARKEIT FÜR EINEN\n" +#~ "%sBESONDEREN ZWECK.\n" +#~ "\n" +#~ "%sFehlermeldungen (auf Englisch) an .\n" +#~ "\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "Überflüssiges »endef«" + +#~ msgid "empty `override' directive" +#~ msgstr "Leere »override«-Anweisung" + +#~ msgid "invalid `override' directive" +#~ msgstr "Ungültige »override«-Anweisung" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-Warnung: STRG-Y wird Unterprozesse übriglassen!\n" + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u Dateien zu %u hash-Werten.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# durchschnittlich %.3f Dateien je hash-Wert,\n" +#~ "max. %u Dateien zu einem hash-Wert.\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Syntaxfehler, immer noch in '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Erhielt Signal »SIGCHLD«; %u unbeendete Kindprozesse.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "VERZEICHNIS" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "In das VERZEICHNIS wechseln, bevor etwas anderes ausgeführt wird" + +#~ msgid "FLAGS" +#~ msgstr "FLAGS" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Prozess aussetzeb, um das Einklinken eines Debuggers zu ermöglichen" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Umgebungsvariablen überschreiben »make«-Steuerdateien" + +#~ msgid "FILE" +#~ msgstr "DATEI" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "DATEI als »make«-Steuerdatei lesen" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Das VERZEICHNIS nach eingebundenen »make«-Steuerdateien durchsuchen" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Nur bei Belastung unterhalb N mehrere Prozesse starten" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "Befehle nur anzeigen, nicht ausführen" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "DATEI als sehr alt betrachten und sie nicht neu erzeugen" + +#~ msgid "Don't echo commands" +#~ msgstr "Die Kommandos nicht ausgeben" + +#~ msgid "Turns off -k" +#~ msgstr "-k abschalten" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Die DATEI stets als neu betrachten" + +# !!! Attention: concatenated with the following messages!!! +#~ msgid "Entering" +#~ msgstr "Wechsel in das Verzeichnis" + +# !!! Attention: concatenated with the following messages!!! +#~ msgid "Leaving" +#~ msgstr "Verlassen des Verzeichnisses" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "Kein Dateiname für »%sinclude«" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "Target »%s« lässt Voraussetzungs-Muster leer" + +#~ msgid "# No variables." +#~ msgstr "# Keine Variablen vorhanden." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# Durchschnittlich %.1f Variablen pro Wert, max %u je Wert.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# Durchschnittlich %d.%d Variablen pro Wert, max %u je Wert.\n" + +#~ msgid "the `word' function takes a positive index argument" +#~ msgstr "Die »word«-Funktion erwartet als Argument einen positiven Index" diff --git a/po/en@boldquot.header b/po/en@boldquot.header new file mode 100644 index 0000000..fedb6a0 --- /dev/null +++ b/po/en@boldquot.header @@ -0,0 +1,25 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# +# This catalog furthermore displays the text between the quotation marks in +# bold face, assuming the VT100/XTerm escape sequences. +# diff --git a/po/en@quot.header b/po/en@quot.header new file mode 100644 index 0000000..a9647fc --- /dev/null +++ b/po/en@quot.header @@ -0,0 +1,22 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# diff --git a/po/es.gmo b/po/es.gmo new file mode 100644 index 0000000..5afbd6e Binary files /dev/null and b/po/es.gmo differ diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..b8dcf08 --- /dev/null +++ b/po/es.po @@ -0,0 +1,2885 @@ +# Mensajes en español para GNU make. +# Copyright (C) 1996, 2001 Free Software Foundation, Inc. +# Max de Mendizábal , 1996, 2001. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 3.81-b3\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2005-06-28 19:59-0500\n" +"Last-Translator: Max de Mendizábal \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "Se intentó utilizar una característica no implementada: `%s'" + +# Sugerencia: touch -> `touch'. sv +# Ok, aceptada. A falta de cursivas... mm +# No veo porqué no se ha de usar 'tocar' en vez de touch em+ +# El mensaje además hace referencia a un touch de un objeto dentro +# de una librería, y de eso no se dice nada en el mensaje. Creo que +# hay que tener cuidado con estas cosas. +# El programa para tocar un miembro de un archivo ... , y ahi estamos +# ya en problemas con el dichoso archivo/fichero. +# A ver que se os ocurre em+ +# Enrique: touch es un programa del sistema operativo y sirve para +# cambiar la fecha de un programa o archivo. Es decir lo "toca" y +# modifica sus atributos. Por eso preferí no traducirlo. +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "El programa para hacer un `touch' no está disponible en VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: El archivo `%s' no existe" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: `%s' no es un archivo válido" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: El miembro `%s' no existe en `%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: Código de retorno erróneo de ar_member_touch en `%s'" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"fallo en lbr$set_module para extraer la información del módulo, estado = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "fallo en lbr$ini_control con estado = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "Error al abrir la biblioteca `%s' para buscar al elemento `%s'" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Miembro `%s'%s: %ld bytes en %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (el nombre puede estar truncado)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Fecha %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modo = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Break.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "" +"*** [%s] Miembro de archivo `%s' podría estar incorrecto; aunque no se " +"elimina" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "" +"*** Miembro del archivo `%s' podría estar incorrecto; aunque no se elimina" + +# Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv +# Ok. mm +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Se borra el archivo `%s'" + +# Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv +# Ok. mm +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Se borra el archivo `%s'" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# comandos para ejecutar" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (interconstruido):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (de `%s', linea %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directorios\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: podría no estar establecido.\n" + +# ¿No sobraría el "posiblemente"? +# Propongo dejarlo en " no se pudo abrir ". sv +# Ok. Es consistente con otras traducciones. mm +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (llave %s, mtime %d): no se pudo abrir.\n" + +# En el K & R aparece inode traducido como nodo-i. ¿qué te parece? sv +# Bien. Me gusta con el guioncito. mm +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" +"# %s (dispositivo %d, nodo-i [%d,%d,%d]): posiblemente no se pueda abrir.\n" + +# ¿No sobraría el "posiblemente"? +# Propongo dejarlo en " no se pudo abrir ". sv +# Ok. Es consistente con otras traducciones. mm +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (dispositivo %ld, nodo-i %ld): no se pudo abrir.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (llave %s, mtime %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (dispositivo %d, nodo-i [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (dispositivo %ld, nodo-i %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "No" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " archivos, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "no" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " imposibilidades" + +# ¿"So far" no era "hasta ahora"? (no me hagas mucho caso) sv +# Si tu traducción es mejor. Aceptada. mm +#: dir.c:1075 +msgid " so far." +msgstr " hasta ahora." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " imposibilidades en %lu directorios.\n" + +# Creo que eventually sería "finalmente" o algo así. sv +# Si, es finalmente no a veces. Ok. mm +# referencia me parece que no lleva tilde. sv +# No, no lleva acento. Me emocioné con elos. mm +# Creeis de veras que tiene sentido 'finalmente'em+ +# yo pondría ser termina autoreferenciando, por +# ejemplo em+ +# Mejor lo eliminamos. Es de alguna forma reiterativo e innecesario. +# Lo de `al final' puede ser más confuso. mm +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "La variable recursiva `%s' se auto-referencia" + +# No me gusta nada ( lo siento ) +# ¿ Qué tal : La referencia a una variable está sin terminar em+ +# Creo que tienes razón la voz pasiva es muy desagradable. mm. +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "la referencia a la variable está sin terminar" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Las instrucciones fueron especificadas para el archivo `%s' en %s:%lu," + +# Buscando en las legras implícitas em+ +# Utilicé por búsqueda en para evitar el gerundio. mm +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" +"Las instrucciones para el archivo `%s' se encontraron por búsqueda en reglas " +"implícitas," + +# "now" es "ahora". ¿te lo has comido consciente o inconscientemente? sv +# inconscientemente. mm +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "pero `%s' se considera ahora como el mismo archivo que `%s'." + +# Lo repetiré una y mil veces... :-) +# "To ignore" *no* es ignorar. sv +# Propongo "no serán tenidas en cuenta" a falta de algo mejor. +# Ok. Mi necedad sobrepasa el milenio. mm +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "" +"Las instrucciones para `%s' no serán tenidas en cuenta en favor de las que " +"están en `%s'." + +# Me suena que eso de colon es algo así como punto, dos puntos o punto y coma. +# ¿Podrías comprobarlo? sv +# Es un punto sencillo (.). A ver si te gusta mi propuesta. mm +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "no se puede cambiar un punto (.) `%s' por dos puntos (:) `%s'" + +# Lo mismo. sv +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "no se pueden cambiar dos puntos (:) `%s' por un punto (.) `%s'" + +# Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv +# Ok. mm +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Se borra el archivo temporal `%s'" + +# Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv +# Ok. mm +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "*** Se borran los archivos temporales...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Fecha fuera de intervalo; sustituyéndola %s" + +#: file.c:804 +msgid "Current time" +msgstr "Hora actual" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# No es un objetivo:" + +# Pondría: es una dependencia de em+ +# Si, tienes razón. mm +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Archivo valioso (es una dependencia de .PRECIOUS)." + +# Lo mismo. Y traducir por falso es poco menos que poco exacto. +# Los phony target de make son aquellos que se ejecutan siempre +# sin tener en cuenta si existe un archivo con el nombre del objetivo +# y de si es actual. Propondría incondicional en vez de falso, ya que +# explica exactamente qué es un phony target em+ +# No. Incondicional no es una traducción correcta. Que tal si al rato +# se les ocurre hacer una nueva instrucción .INCONDITIONAL. +# Si quieres podríamos pensar en otra traducción como señuelo o algo así. mm +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# objetivo falso (dependencia de .PHONY)." + +# FUZZY +# Pondria línea de comandos +# Y creo que no sé exactamente a que se refiere, No creo que haya visto +# este mensaje nunca en make lo marco con FUZZY em+ +# Están traduciendo commands como comandos? Son más bien ordenes o +# instrucciones. Por mi parte no hay problema, incluso me gusta más +# comandos, pero es un anglicismo. mm +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Objetivo de línea de instrucciones." + +# Habría que entender esto +# Creo que esto es lo que significa. El fuente no es demasiado claro. mm +# Se refiere a que el fichero makefile es uno que encuentra por +# defecto ( en este orden GNUmakefile, Makefile y makefile ) o uno +# que está definido en la variable de entorno MAKEFILE em+ +# Así pues tu traducción es completamente equivocada, lo siento. +# Pondría: Fichero por defecto o definido en la variable MAKEFILE em+ +# Cierto, lo has entendido bien. Arreglo acorde. mm +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Por omisión, MAKEFILES, o -include/sinclude makefile." + +# Propongo efectuada en lugar de terminada. sv +# Ok. Es más literal. mm +# Atención ! , es la búsqueda 'de'reglas implícitas em+ +# Ok. Ojo, debo pluralizar regla e implícita. Platicarlo con Ulrich. mm +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# La búsqueda de reglas implícitas ha sido efectuada." + +# Propongo efectuada en lugar de terminada. sv +# Ok. Es más literal. mm +# Atención ! , es la búsqueda 'de'reglas implícitas em+ +# Ok. Ojo, debo pluralizar regla e implícita. Platicarlo con Ulrich. mm +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# La búsqueda de reglas implícitas ha sido efectuada." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# rama del patrón implícita/estática: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# El archivo es una dependencia intermedia." + +# Sugerencia: "crea". sv +# Ok. Aunque, viendolo bien, que tal "hace"? mm. +#: file.c:946 +msgid "# Also makes:" +msgstr "# También hace:" + +# ¿y "comprobó"? sv +# Ok. Mejora. mm +# No pondría nunca, sino simplemente 'no se comprobó 'em+ +# Si, es lo mismo pero es más español. mm +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# La fecha de modificación no se comprobó." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# El archivo no existe." + +#: file.c:956 +msgid "# File is very old." +msgstr "# El archivo es muy viejo." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Última modificación %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# El archivo ha sido actualizado." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# El archivo ha sido actualizado." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Las instrucciones siguen ejecutándose (ESTO ES UN BUG)." + +# ¿No sería más bien "las instrucciones de las dependencias"? sv +# Si, que babas soy. Ahora corrijo. mm +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" +"# Las instrucciones de las dependencias siguen ejecutándose (ESTO ES UN " +"BUG)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Actualizado con éxito." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Necesita ser actualizado (la opción -q está activa)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Fallo al ser actualizado." + +# ## Le he añadido un "¡" con tu permiso. +# Gracias. No lo puse porque no se como poner ese símbolo con el +# iso-accents-mode y luego se me olvidó. Por cierto, como se hace? +# también tengo duda de la interrogación abierta. +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# ¡Valor inválido en el miembro `update_status'!" + +# ## Lo mismo. +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# ¡Valor inválido en el miembro `command_state'!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Archivos" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# estadísticas de la tabla de hash de los archivos:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "el primer argumento de la función `word' no es numérico" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "el primer argumento de la función `word' debe ser mayor a 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "el primer argumento de la función `wordlist' no es numérico" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "el primer argumento de la función `wordlist' no es numérico" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: fallo en DuplicateHandle(In), (e=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: fallo en DuplicateHandle(Err), (e=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "Fallo en CreatePipe(), (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): fallo en process_init_fd()\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Limpiando el archivo temporal %s\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "Número de argumentos (%d) insuficientes para la función `%s'" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "No implementado en esta plataforma: función `%s'" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "la llamada a la función `%s' no concluyó: falta `%c'" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: la opción `%s' es ambigua\n" + +# No admite ningún argumento. sv +# Ok. Y vuelve la burra al trigo. mm +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: la opción `--%s' no admite ningún argumento\n" + +# Lo mismo. sv +# Ok. mm +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: la opción `%c%s' no admite ningún argumento\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: la opción `%s' requiere un argumento\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opción no reconocida `--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opción no reconocida `%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción inválida -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción inválida -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: la opción requiere un argumento -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: la opción `-W %s' es ambigua\n" + +# No admite ningún argumento. sv +# Ok. Y vuelve la burra al trigo. mm +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: la opción `-W %s' no admite ningún argumento\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "no se pueden reservar %ld bytes para la tabla de hash: memoria agotada" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Carga=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Colisiones=%ld/%ld=%.0f%%" + +# Y no sería mejor "Buscando una regla implícita ..." +# Ten en cuenta que este mensaje no parece un mensaje de error, sino más +# de "debug" o de "verbose". sv +# Cierto. mm +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Buscando una regla implícita para `%s'.\n" + +# Lo mismo. +# Buscando una regla implítita para el miembro del archivo `%s' em+ +# Se me resbaló. mm +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Buscando una regla implícita para el miembro del archivo `%s'.\n" + +# Pues si ilegal le suena a cárcel a Enrique, "evade" me suena a mí a +# escaparse de la cárcel... (fuga de alcatraz :-) +# te voy a dar yo a tí fuga ... em+ +# ¿Qué te parecería "se evita"? sv +# Me gusta evade, pero evita es correcto. Acepto tu sugerencia. mm +# No me gusta se evita, pondría evitando em+ +# Ok. Pero a mi paranoia de evitar gerundios dónde la dejas? mm +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitando la recursión en la regla implícita.\n" + +# FUZZY +# Esto me suena fatal. Se a que se refiere, porque lo +# he visto, pero en cristiano no se si podría entenderlo. +# se refiere a las reglas del tipo % , lo pongo FUZZY , tendré +# que pensar un poco en ello em+ +# De momento cambio la regla patron por una regla de patron , y +# pondría a toda costa gerundio ( intentando ) em+ +# Ok con el gerundio. Pero también tengo que meditarlo. mm +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Intentando una regla de patrón con la ramificación `%.*s'.\n" + +# ## Corrijo la palabra "dependencia". sv +# Cuando aparezca este mensaje tendrá poco menos que sentido +# testimonial. Date cuenta que los argumentos estan cambiados. +# Pon el orden correcto, siempre será más lógico que lo que vaya a +# aparecer tal y como está ahora (Se rechaza la dependencia imposible +# `%s' `%s )'em+ +# Ok. mm +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Se rechaza la regla de dependencia imposible `%s'.\n" + +# ## Corrijo la palabra "dependencia". sv +# Cuando aparezca este mensaje tendrá poco menos que sentido +# testimonial. Date cuenta que los argumentos estan cambiados. +# Pon el orden correcto, siempre será más lógico que lo que vaya a +# aparecer tal y como está ahora (Se rechaza la dependencia imposible +# `%s' `%s )'em+ +# Ok. mm +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Se rechaza la dependencia imposible `%s'.\n" + +# FUZZY +# Esto me suena fatal. Se a que se refiere, porque lo +# he visto, pero en cristiano no se si podría entenderlo. +# se refiere a las reglas del tipo % , lo pongo FUZZY , tendré +# que pensar un poco en ello em+ +# De momento cambio la regla patron por una regla de patron , y +# pondría a toda costa gerundio ( intentando ) em+ +# Ok con el gerundio. Pero también tengo que meditarlo. mm +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Intentando la regla de dependencia `%s'.\n" + +# Pues si ilegal le suena a cárcel a Enrique, "evade" me suena a mí a +# escaparse de la cárcel... (fuga de alcatraz :-) +# te voy a dar yo a tí fuga ... em+ +# ¿Qué te parecería "se evita"? sv +# Me gusta evade, pero evita es correcto. Acepto tu sugerencia. mm +# No me gusta se evita, pondría evitando em+ +# Ok. Pero a mi paranoia de evitar gerundios dónde la dejas? mm +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Probando la dependencia implícita `%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Se encontró la dependencia `%s' como la VPATH `%s'.\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Se busca una regla con el archivo intermedio `%s'.\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "No se puede crear un archivo temporal\n" + +# Lo mismo. sv +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Error 0x%x (no tiene efecto)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Error 0x%x" + +# Lo mismo. sv +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Error %d (no tiene efecto)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Error %d" + +# Sugerencia: " (volcado de `core')". sv +# volcado de `core' no significa nada, que te parece si mejor dejamos +# el core dumped, o bien volcado del núcleo o algo así. Por el momento +# no cambio nada. mm +#: job.c:460 +msgid " (core dumped)" +msgstr " (core dumped) [Núcleo vaciado a un archivo]" + +# ¿Y job -> trabajos? sv +# Si, pero no hablas de una computadora multi-trabajos sino multi-tareas. +# Por eso elegí tareas. Lo platicamos con más calma? mm +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Se espera a que terminen otras tareas...." + +# ¿De verdad se dice "vivo"? Si es un proceso, se me ocurre "activo". sv +# Me gusta lo de activo. mm +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Hijo activo 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (remoto)" + +# Lo mismo, pon Proceso hijo, y quita lo que hay +# entre paréntesis em+ +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Se pierde al proceso hijo descarriado 0x%08lx PID %ld %s\n" + +# Lo mismo, pon Proceso hijo, y quita lo que hay +# entre paréntesis em+ +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Se gana al proceso hijo descarriado 0x%08lx PID %ld %s\n" + +# Give up no es enfocar, es abandonar, o desistir em+ +# Si, metí la pata. mm +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Se limpia el archivo temporal %s\n" + +# Proceso hijo em+ +# Ok. +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Se elimina al proceso hijo 0x%08lx PID %ld%s de la cadena.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "escribir en el servidor de tareas" + +# Lo mismo, pon Proceso hijo, y quita lo que hay +# entre paréntesis em+ +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Se libera el token para el proceso hijo 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "fallo en process_easy() al lanzar el proceso (e=%d)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Se contaron %d argumentos en el lanzamiento fallido\n" + +# Proceso hijo em+ +# Ok. +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Se pone al proceso hijo 0x%08lx (%s) PID %ld%s en la cadena.\n" + +# Lo mismo, pon Proceso hijo, y quita lo que hay +# entre paréntesis em+ +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Se obtiene el token para el proceso hijo 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "tubería de trabajos leídos" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "No es necesario reconstruir el objetivo `%s'." + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "no se pueden forzar los límites de carga en este sistema operativo" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "no se puede forzar la carga límite: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "no hay más manejadores de archivos: no se puede duplicar stdin\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "no hay más manejadores de archivos: no se puede duplicar stdout\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "No se puede restaurar stdin\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "No se puede restaurar stdout\n" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "hacer un hijo descarriado %d, aún esperando el pid %d\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: No se encontró el programa" + +# ¿Y "el programa Shell"? (a secas) sv +# Si. Suena mucho mejor. mm +# Suena, pero no es mejor. Tal y como esta escrito, incluso +# yo pensaria que me falta un programa en mi sistema que se +# llame shell. No se ha encontrado el 'shell'em+ +# Es bueno contar con una segunda opinión ... mm +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: No se ha encontrado el `shell'" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: el espacio ambiental podría estar agotado" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL ha cambiado (era `%s' y ahora es `%s')\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Se crea el archivo temporal %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (linea %d) Contexto de shell erróneo (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Opciones:\n" + +# Lo mismo de arriba con "ignorar". sv +# Ok. mm. +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m No se tendrá en cuenta por compatibilidad.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Hace incondicionalmente todos los objetivos.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORIO, --directory=DIRECTORIO\n" +" Se cambia al DIRECTORIO antes de hacer nada.\n" + +# ¿"depurado" o "depuración"? sv +# Puse de depurado para evitar la cacofonía información depuración. +# Sugerencias bienvenidas. mm +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Se imprimirán grandes cantidades de información de depurado.\n" + +# ¿"depurado" o "depuración"? sv +# Puse de depurado para evitar la cacofonía información depuración. +# Sugerencias bienvenidas. mm +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=BANDERAS] Se imprimirán varios tipos de información de " +"depurado.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Las variables ambientales se imponen a las de los " +"makefiles.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f ARCHIVO, --file=ARCHIVO, --makefile=ARCHIVO\n" +" Lee al ARCHIVO como un makefile.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Muestra este mensaje y finaliza.\n" + +# Ojo con ignorar. sv +# Ok. mm +# Por favor, si has traducido commands como instrucciones , hazlo aqui +# tambien. +# No me gusta este mensaje, preferiría: Se ignoran los errores obtenidos +# en la ejecución de las instrucciones em+ +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors No se toman en cuenta los errores provenientes " +"de las instrucciones.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIRECTORIO, --include-dir=DIRECTORIO\n" +" Busca dentro del DIRECTORIO los makefiles incluidos.\n" + +# Yo traduciría "infinite" por "infinitos", no por "una infinidad", que +# parece que son muchos menos... sv +# Ok. mm +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Se permiten N trabajos a la vez; si no se " +"especifica un\n" +"argumento son infinitos.\n" + +# No entiendo por qué aquí empleas subjuntivo: "pudieron". sv +# Es incorrecto. Es una de las opciones `k' que dice... mm +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Sigue avanzando aún cuando no se puedan crear " +"algunos objetivos.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" No inicia con trabajos múltiples a menos que la carga esté por debajo " +"de N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Utiliza el último mtime entre los enlaces " +"simbólicos y los objetivos.\n" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" No ejecuta ninguna instrucción; sólo las " +"muestra.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o ARCHIVO, --old-file=ARCHIVO, --assume-old=ARCHIVO\n" +" Supone que ARCHIVO es muy viejo y no lo " +"reconstruye.\n" + +# de 'make' em+ +# ok. mm +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Se imprime la base de datos interna de " +"`make'.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question No se ejecutan las instrucciones; el " +"estado de salida\n" +"indicará si están actualizados.\n" + +# ¿desabilitan o deshabilitan? sv +# Error de dedo. mm +# ¡ Por favor ! , ¿ pero qué es eso de interconstruidas ? +# Pon almacenadas internamente, que es exactamente lo que son :) em+ +# Bueno, bajo protesta. mm +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Se deshabilitan las reglas implícitas " +"almacenadas internamente.\n" + +# ¿desabilitan o deshabilitan? sv +# Error de dedo. mm +# ¡ Por favor ! , ¿ pero qué es eso de interconstruidas ? +# Pon almacenadas internamente, que es exactamente lo que son :) em+ +# Bueno, bajo protesta. mm +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Se deshabilitan los ajustes a las variables " +"almacenadas internamente.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet No muestra las intrucciones.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Desactiva la opción -k.\n" + +# Se *tocan*, ¿no? sv +# Si. mm +# +# Pues entonces cámbialo arriba tambien em+ +# En donde? mm +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Se tocan los objetivos en vez de " +"reconstruirlos.\n" + +# Me comería el "Se" inicial. "Muestra la versión..." sv +# Ok. mm +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Muestra la versión del make y finaliza.\n" + +# Lo mismo. sv +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Muestra el directorio actual.\n" + +# Lo mismo. sv +# Turn off , desactiva o deshabilita , pero no apaga em+ +# apaga luz Mari Luz apaga luz ,que yo no puedo vivir con +# tanta luz ... ( canción tradicional ) ( no lo pude evitar ) em+ +# Juar, Juar, Juar. Coincido, pero el sentido es el mismo. mm +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Desactiva -w, aún cuando haya sido activado " +"implícitamente.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W ARCHIVO, --what-if=ARCHIVO, --new-file=ARCHIVO, --assume-new=ARCHIVO\n" +" Supone que ARCHIVO es infinitamente " +"reciente.\n" + +# Lo mismo. sv +# Todas estas parecen descripciones de opciones. +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Advierte cuando se hace una referencia a una " +"variable no definida.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "no se permite que una cadena vacía sea el nombre de un archivo" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "se especificó un nivel de depuración desconocido `%s'" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: Se atrapó una interrupción/excepción (código = 0x%x, dirección = 0x%x)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Se ha llamado un filtro de excepción no manejado desde el programa %s\n" +"Código de excepción %x\n" +"Banderas de excepción %x\n" +"Dirección de la excepción %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Violación de acceso: operación de escritura en la dirección %x\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Violación de acceso: operación de lectura en la dirección %x\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "la variable find_and_set_shell puesta como default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"la ruta de búsqueda find_and_set_shell está puesta como default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s está suspendida por 30 segundos..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "se hizo un sleep(30). Continuando.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "" +"El archivo Makefile ha sido especificado dos veces desde la entrada estándard" + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (archivo temporal)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (archivo temporal)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" +"Los trabajos en paralelo (-j) no están implementados en esta plataforma." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Reajustando al modo monotarea (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "error interno: hay varias opciones --jobserver-fds" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "error interno: cadena --jobserver-fds inválida `%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"atención: se fuerza a -jN en el submake: se deshabilita el modo de servidor " +"de tareas." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "servidor de tareas duplicado" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"atención: el servidor de tareas no está disponible: se utilizará -j1. Añada `" +"+' a la regla padre del make." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "creando una tubería de trabajos" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "se inicializa la tubería al servidor de tareas" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "Los enlaces simbólicos no están implementados: se deshabilitan con -L." + +# Antes pusiste "makefiles". Coherencia. sv +# Cierto. mm +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Actualizando archivos makefiles....\n" + +# Me comería el "archivo" inicial. +# Ok. mm +# "El Makefile `%s' ..." sv +# Pondría ( como en un mensaje anterior ) se autoreferencia ... em+ +# He puesto makefile con minúsculas , par ser coherentes em+ +# Ok. Es más breve. mm. +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "El makefile `%s' se autoreferencia; por lo cual no se reconstruye.\n" + +# Lo mismo. sv +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Fallo al reconstruir el makefile `%s'." + +# Lo mismo. sv +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "No se encontró el makefile incluído `%s'." + +# Lo mismo. sv +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "No se encontró el Makefile `%s'" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "No se pudo regresar al directorio original." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Re-ejecutando[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (archivo temporal)" + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL contien más de un objetivo" + +# Sugerencia: "No se especificó ningún objetivo ... " sv +# Ok. Me gusta. mm +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "No se especificó ningún objetivo y no se encontró ningún makefile" + +#: main.c:2272 +msgid "No targets" +msgstr "No hay objetivos" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Actualizando los objetivos finales....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"atención: Se ha detectado una desviación en el reloj. La construcción podría " +"estar incompleta." + +# ¿Y Modo de empleo? sv +# Soy medio bestia. Debería hacerlo automático. mm +# "target" es "objetivo", no "objetivos". Fíjate que lleva puntos +# suspensivos, permitiendo así varios objetivos. sv +# Ok. mm +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Modo de empleo: %s [opciones] [objetivo] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Este programa fue construido para %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Este programa construido para %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Informe sobre los errores a \n" + +# Me comería el "de" de "requiere de" sv +# Ok. mm +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "la opción `-%c' requiere un argumento no-vacío de tipo cadena" + +# Me comería el "de" de "requiere de" sv +# Ok. mm +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "la opción `-%c' requiere un argumento positivo y entero" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +" %sEste programa fue construido para %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sEste programa fue construido para %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Base de datos del Make, mostrada en %s" + +# make -> Make. sv +# Ok. mm +# Porqué 'del', o pones 'del programa' Make o pones +# 'de Make' em+ +# Ok. mm +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Se termina la base de datos de Make en %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: se ingresa a un directorio desconocido\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: se sale del directorio desconocido\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: se ingresa al directorio `%s'\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: se sale del directorio `%s'\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: se ingresa a un directorio desconocido\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: se sale del directorio desconocido\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: se ingresa al directorio `%s'\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: se sale del directorio `%s'\n" + +# Interrumpido (?). sv +# Mmgmh... El mensaje indica que hubo algún error muy grave y que por +# eso se detiene el make. Probablemente sea mejor dejarlo así. mm +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Alto.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Error desconocido %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +# Propongo eliminar la palabra virtual. sv +# Pero si es muy bonita. :) Bueno. Como ya platicamos puede que sea +# una buena idea pero, por ahora la dejaría. mm +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "memoria virtual agotada" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: usuario %lu (real %lu), grupo %lu (real %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Acceso inicializado" + +#: misc.c:808 +msgid "User access" +msgstr "Acceso del usuario" + +#: misc.c:856 +msgid "Make access" +msgstr "Acceso del Make" + +#: misc.c:890 +msgid "Child access" +msgstr "Acceso del hijo" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "error al escribir: %s" + +#: misc.c:956 +msgid "write error" +msgstr "error al escribir" + +# Sugerencia: eliminar la palabra "archivo". sv +# Ok. Mejora. mm +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Leyendo makefiles...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Leyendo makefile `%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (no hay objetivo por defecto)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (ruta de búsqueda)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (no importa)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (no hay expansión del ~)" + +# ## Sintaxis no llevaba tilde. +# Ok. mm +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "sintaxis no válida en condicional" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "las instrucciones comenzaron antes del primer objetivo" + +# "falta una regla". sv +# (es que extraviada me suena muy raro). +# Cierto pareciera que se perdió dentro de algún circuito. mm +# Falta 'la' regla em+ +# No no es la regla sino una regla pues puede ser cualquiera de ellas. mm +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "falta una regla antes de las instrucciones" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "falta un separador%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (¿Quiere decir TAB en vez de 8 espacios?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "falta un patrón de objetivos" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "hay varios patrones de objetivos" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "el patrón de objetivo no contiene `%%'" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "falta un `endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "nombre de variable vacío" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "" +"Hay un texto irrelevante o mal colocado después de la instrucción `endef'" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "falta un `endef', no se terminó un `define'" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "" +"Hay un texto irrelevante o mal colocado después de la instrucción `endef'" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Texto irrelevante o mal colocado después de la instrucción `%s'" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "irrelevante o mal colocado `%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "sólo se admite un `else' por condicional" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "" +"La definición de las variables específicas al blanco está mal construida" + +#: read.c:1855 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "los prerequisitos no pueden ser definidos por guiones de instrucciones" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "las reglas implícitas y las de patrón estático están mezcladas" + +# Y 'las' normales em+ +# Ok. mm +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "las reglas implícitas y las normales están mezcladas" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "el archivo de objetivos `%s' no coincide con el patrón de objetivos" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "el archivo de objetivos `%s' tiene líneas con : y ::" + +# Cambiaría given por 'proporcionó' o 'indicó' em+ +# Ok. mm +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "el objetivo `%s' se proporcionó más de una vez en la misma regla." + +# No me gusta esta traducción de override. Mira a ver +# si encaja mejor alguna de las dos que se proponen arriba +# em+ +# Aunque no me acaba de convencer, que te parece ésto? mm +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "atención: se imponen comandos para el objetivo `%s'" + +# Ojo con ignora. sv +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "atención: se ignoran las instrucciones viejas para el objetivo `%s'" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "atención: hay un carácter NUL; se ignora el resto de la línea" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "No se hace nada para `%s'." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s' está actualizado." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Se continúa actualizando el archivo `%s'.\n" + +# Sugerencia: No hay ninguna regla... sv +# Como una no hay ninguna. mm +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sNo hay ninguna regla para construir el objetivo `%s'%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "" +"%sNo hay ninguna regla para construir el objetivo `%s', necesario para `%s'%s" + +# ¿target file no sería "archivo objetivo"? sv +# Literalmente si pero un archivo make puede tener varios objetivos. mm +# Max , pero no existe un archivo de objetivos. Esta línea, que es +# de las que aparecen al hacer un make con la opción -d ( debug ) +# se refiere a lo que dice Santiago, es decir, 'archivo objetivo' em+ +# Ok creo que tienen razón. mm +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Se considera el archivo objetivo `%s'.\n" + +# Un compañero mío dice que una buena regla es poner siempre que se pueda +# un número par de comas. +# Es decir: "Se intentó, sin éxito, actualizar ..." +# o bien "Se intentó sin éxito actualizar ..." +# ¿Qué te parece? sv +# Bien y tiene razón. mm +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Se intentó, sin éxito, actualizar el archivo `%s'.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "El archivo `%s' ya fue considerado.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Se continúa actualizando el archivo `%s'.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Se terminó de actualizar el archivo `%s'.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "El archivo `%s' no existe.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Atención: el archivo .LOW_RESOLUTION_TIME `%s' tiene una resolución " +"demasiado alta" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Se encontró una regla implícita para `%s'.\n" + +# Se ha encontrado em+ +# Ok, pero procuro evitar como a la muerte los gerundios. mm +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "No se ha encontrado una regla implícita para `%s'.\n" + +# Por defecto, como haces arriba em+ +# en efecto, mm +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Se utilizan las instrucciones por defecto para `%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Se elimina la dependencia circular %s <- %s." + +# Lo mismo de antes con "target file". sv +# Estoy de acuerdo con él ( por una vez ;) ) em+ +# Ok. mm +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Se terminaron las dependencias del archivo objetivo `%s'.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Se están construyendo las dependencias de `%s'.\n" + +# Give up no es enfocar, es abandonar, o desistir em+ +# Si, metí la pata. mm +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Se abandona el archivo objetivo `%s'.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Debido a los errores, el objetivo `%s' no se reconstruyó." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "El prerequisito `%s' es posterior al objetivo `%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "La dependencia `%s' del blanco `%s' no existe.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "La dependencia `%s' es más reciente que el objetivo `%s'.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "La dependencia `%s' es posterior al objetivo `%s'.\n" + +# Ahorra espacio, y pon '::' en vez de eso :) em+ +# Bueno, no es mala idea. A ver si te gusta lo que puse. mm +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "" +"El objetivo `%s' es de tipo dos puntos dos veces (::)\n" +"y no tiene dependencias.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "No hay instrucciones para `%s' y ninguna dependencia cambió.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Haciendo `%s' debido a la bandera always-make.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "No es necesario reconstruir el objetivo `%s'." + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; se usa el nombre del VPATH `%s'" + +# Revisa todo el po con un search, y mira a ver si decides usar +# regenerar o reconstruir ( prefiero lo último 10000 veces ) em+ +# Ok, buena propuesta. mm +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Se debe reconstruir el objetivo `%s'.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Se ignora el nombre del VPATH `%s'.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Las instrucciones de `%s' se están ejecutando.\n" + +# Target file no es archivo de objetivos, sino el archivo objetivo +# make no tiene ningún archivo de objetivos em+ +# Ok. mm +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Fallo al reconstruir el archivo objetivo `%s'.\n" + +# Lo mismo em+ +# Ok. mm +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Se reconstruyó con éxito el archivo objetivo `%s'.\n" + +# Otra vez em+ +# Ok, no te puedes quejar de falta de consistencia en este caso! mm +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Se necesita reconstruir el archivo objetivo `%s' con la opción -q.\n" + +# Por defecto, como haces arriba em+ +# en efecto, mm +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Se utilizan las instrucciones por defecto para `%s'.\n" + +# Ubicada :)) , que tal futura, a secas ? em+ +# Bueno, sonaba como StarTrek, muy chido, pero acepto tu sugerencia. mm +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Atención: El archivo `%s' tiene una hora de modificación en el futuro" + +# Ubicada :)) , que tal futura, a secas ? em+ +# Bueno, sonaba como StarTrek, muy chido, pero acepto tu sugerencia. mm +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "" +"Atención: El archivo `%s' tiene una hora de modificación %.2g en el futuro" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "El elemento .LIBPATTERNS `%s' no es un patrón" + +# ¿Las aduanas? sv +# Si, las aduanas de exportación de procesos. Suena rarísimo pero +# revisé el código y todo parece apuntar a que así son las cosas. +# Creo que esto es otra cosa. Custom se refiere a los valores dados +# por el usuario ( customizables ) , y que no se exportarán se refiere +# a que al llamar a otros makefiles, no serán pasados como valores +# que se antepongan ( otro término para override ) a los que make +# tiene por defecto . +# La traducción exacta por tanto es, los valores definidos por el usuario +# no se exportarán em+ +# Muchísimo más claro (es más me gusta más en español que en inglés con tu +# arreglo) mm +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Los valores definidos por el usuario no se exportarán: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Reglas implícitas." + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# No hay reglas implícitas." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u reglas implícitas, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminal." + +# ## Añado ¡ con tu permiso. sv +# Gracias. mm +# ¿ qué tal erróneo ? em+ +# Si, suena mejor. mm +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: ¡num_pattern_rules erróneo! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "señal desconocida" + +#: signame.c:94 +msgid "Hangup" +msgstr "Colgado" + +# ¿ Y por qué no Interrupción ? em+ +# Porque es una acción. De hecho es un mensaje que se envía a través +# del sistema en este caso le enviarías un kill -INT num_proceso para +# interrumpir al programa. Lo revisé contra el fuente. mm +#: signame.c:97 +msgid "Interrupt" +msgstr "Interrumpir" + +#: signame.c:100 +msgid "Quit" +msgstr "Finalizar" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Instrucción no válida" + +# Los trap los hemos dejado como traps, simplemente. em+ +# Ok. mm +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Trace/breakpoint trap" + +#: signame.c:111 +msgid "Aborted" +msgstr "Abortado" + +# Ponte de acuerdo con Enrique en cómo se traduce esto. +# Enrique tiene esta misma frase en glibc. sv +# Eso es :) IOT trap em+ +# Ok. mm +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT trap" + +# Otra em+ +# Ok. mm +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT trap" + +# Coma flotante, por favor. sv +# Creeme que aquí lo de coma flotante no vale. Somos pro-yanquis y +# por eso usamos el punto flotante. Debemos llegar a un acuerdo. +# Por ahora pongo coma flotante para facilitar las cosas, pero bajo +# protesta ;-) mm +#: signame.c:120 +msgid "Floating point exception" +msgstr "Excepción de coma flotante" + +# "Terminado por la señal kill" quedaría un poco más suave ... sv +# Enrique tiene en glibc "Terminado (killed)". sv +# Bueno, creo que mi traducción es más exacta, concisa y clara +# pero si insisten... Además recuerda en que estoy en un país +# en donde asesinado es palabra de todos los días. mm +#: signame.c:123 +msgid "Killed" +msgstr "Terminado (killed)" + +#: signame.c:126 +msgid "Bus error" +msgstr "Error en el bus" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Fallo de segmentación" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Llamada al sistema errónea" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Tubería rota" + +# ¿Temporizador? (así lo tradujo Enrique en glibc). sv +# Suena como StarTrek. Mejor lo platico con él. A lo mejor +# hasta lo convenzo. mm +# Pues tendrás que darme razones em+ +# Bueno, un alarm clock es una alarma del reloj. No tiene pierde. +# Temporizador es una bonita palabra pero en donde dice que va a +# sonar una campana para despertarte? mm +#: signame.c:138 +msgid "Alarm clock" +msgstr "Alarma del reloj" + +#: signame.c:141 +msgid "Terminated" +msgstr "Finalizado" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Señal 1 definida por el usuario" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Señal 2 definida por el usuario" + +# Proceso hijo terminado em+ +# Ok. mm +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Proceso hijo terminado" + +# Fallo. sv +# Alimentación eléctrico em+ +# Ok. mm +#: signame.c:158 +msgid "Power failure" +msgstr "Falla de alimentación eléctrica" + +#: signame.c:161 +msgid "Stopped" +msgstr "Detenido" + +# Enrique hizo una preciosa traducción de este mensaje que, según él, +# mejora el original. Era algo así como: +# "Detenido (requiere entrada de terminal)". sv +# Tiene razón se ve bien. mm +# Requiere 'de';) , como te vea Santiago que le metes +# otro 'de' otra vez ... em+ +# Ok. mm +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Detenido (se requiere entrada de terminal)" + +# lo mismo, se requiere entrada de terminal , em+ +# Ok. mm +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Detenido (se requiere salida de terminal)" + +# idem em+ +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Detenido (se requiere una señal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Se agotó el tiempo de CPU permitido" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Se excedió el tamaño máximo de archivo permitido" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "El contador de tiempo virtual ha expirado" + +# Nunca me enteré de cómo se traducía profile, pero perfil me suena raro. +# ¿De dónde lo has sacado? sv +# Es lo que quiere decir, ni modo. Perfil de un avión es plane profile. +# Por cierto, lo más probable es que esta "traducción" haya que +# modificarla para que sea entendible. mm +# Esto lo tengo en glibc, lo mirare otro día. Estos mensajes no son +# importantes em+ +# Agregué unas palabras en aras de claridad (espero) mm +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "El contador de tiempo para la generación del perfil ha expirado" + +#: signame.c:188 +msgid "Window changed" +msgstr "La ventana ha cambiado" + +#: signame.c:191 +msgid "Continued" +msgstr "Continuado" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Condición urgente de I/O" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "Posible I/O" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Recurso perdido" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Señal de peligro" + +#: signame.c:219 +msgid "Information request" +msgstr "Petición de información" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Coprocesador de punto flotante no disponible" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# estadísticas de la tabla de hash de los archivos:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "por defecto" + +#: variable.c:1544 +msgid "environment" +msgstr "entorno" + +# Sugerencia: No poner archivo. sv +# Ok. mm +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +# 'bajo -e' = 'con -e activo' em+ +# Ok. Esta inversión en los idiomas sajones se pega. mm +#: variable.c:1550 +msgid "environment under -e" +msgstr "con -e activo" + +# Línea de comandos me parece correcto em+ +# Ver arriba. Estoy de acuerdo si así han traducido en otros lados. mm +#: variable.c:1553 +msgid "command line" +msgstr "línea de instrucciones" + +# Creo que tendremos un problema con instrucción, comando +# , programa y directiva . Está claro que aquí es directiva em+ +# Ok, pero no deja de sonar a RoboCop. A ver que te parece como quedó. mm +#: variable.c:1556 +msgid "`override' directive" +msgstr "directiva de sobreposición `override'" + +# Lo he cmabiado em+ +# Ok. Deberíamos platicarlo con Ulrich. mm +#: variable.c:1559 +msgid "automatic" +msgstr "automática/o" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (de `%s', línea %lu):" + +# Bueno. Aquí un punto de discusión. Traduzco buckets por cubetas o +# mejor las dejo tal cual? Opiniones bienvenidas. mm +# Estos mensajes son para debug, no creo que haga falta usar cubetas ;) em+ +# Tienes razón, si el debugueador no lo entiende pues, ... que se +# dedique a otra cosa. mm +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# estadísticas del conjunto de variables de la tabla de hash:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valores de variables específicas al patrón" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# No hay valores de variables específicas al patrón." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valores de variables específicas al patrón" + +# ¿Qué te parece "atención"? Lo hemos usado mucho en otros programas. sv +# Pero que bestia soy. Perdón por el desbarre. mm +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "atención: la variable `%.*s' no ha sido definida" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "fallo en sys$search con %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Atención: redirección vacía\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "error interno: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-atención, deberás rehabilitar el manejo del CTRL-Y desde el DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "INTERCONSTRUIDO [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD INTERCONSTRUIDO %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "RM INTERCONSTRUIDO %s\n" + +# Por defecto, como haces arriba em+ +# en efecto, mm +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Instrucción interconstruida desconocida `%s'.\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Error, comando vacío\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Entrada redirigida desde %s\n" + +# Probablemente sea aquí donde haya que ponerle el "el" para que "Entering" +# concuerde bien con esta frase y con la anterior simultáneamente. sv +# No. Ya revisé el fuente y transcribo el trozo pertinente: +# char *message = entering ? "Entering" : "Leaving"; +# if (makelevel == 0) +# printf ("%s: %s ", program, message); +# else +# printf ("%s[%u]: %s ", program, makelevel, message); +# Como notarás lo del directorio va en otro lado. +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Se redirecciona el error a %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Salida redirigida a %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Salida redirigida a %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +# "en sustituto" me suena muy raro. Propongo: "en su lugar" en su lugar :-) sv +# Ok. mm +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "En su lugar, se ejecuta %s\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Error al lanzar el proceso %d\n" + +# ¿Y al revés?: Rutas de búsqueda VPATH. sv +# Mejora +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Rutas de búsqueda VPATH\n" + +# Rutas creo que queda mejor. sv +# Ok. Es más común. mm +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# No hay rutas de búsqueda `vpath'." + +# ¡Ah! Aquí si que pones el vpath al final, ¿eh? :-) sv +# You really got me! mm +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u rutas de búsqueda `vpath'.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# No hay ruta de búsqueda general (variable `VPATH')." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Ruta de búsqueda general (variable `VPATH'):\n" +"# " + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "No especifique -j o --jobs si sh.exe no está disponible." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Reajustando a make para el modo monotarea." + +# De esto hablaremos otro día. sv +# Si. Es bastante complicado. mm +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sEste es software libre; consulte en el código fuente las condiciones de " +#~ "copia.\n" +#~ "%sNO hay garantía; ni siquiera para MERCANTIBILIDAD o EL CUMPLIMIENTO DE\n" +#~ "%sALGÚN PROPÓSITO PARTICULAR.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "el `endef' es irrelevante o está mal colocado" + +#~ msgid "empty `override' directive" +#~ msgstr "instrucción `override' vacía" + +# Creo que tendremos un problema con instrucción, comando +# , programa y directiva . Está claro que aquí es directiva em+ +# Ok, pero no deja de sonar a RoboCop. A ver que te parece como quedó. mm +#~ msgid "invalid `override' directive" +#~ msgstr "directiva de sobreposición `override' inválida" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-atención, CTRL-Y dejará vivos a los subprocesos.\n" + +# Esto habría que revisarlo. sv +# En efecto, había que revisarlo, no es número de archivos +# sino que no hay archivos. mm +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# No hay archivos." + +# Sugerencia: hash buckets -> `hash buckets' +# (al menos hasta que sepamos lo que es, creo que me salió algo parecido +# en recode). sv +# Literalmente un hash bucket es un tonel de trozos. En un proceso de +# partición por picadillo (hash) se deben definir "toneles" o "cubetas" +# para guardar allí la información "hasheada". En otras palabras es el +# tamaño de las entradas de índice hash. Claro como el lodo? +# Finalmente, ok. Por ahora no traducimos hasta ponernos de acuerdo. +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u archivos en %u `hash buckets'.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# promedio de %.3f archivos por `bucket', max %u archivos en un " +#~ "`bucket'.\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Error de sintáxis, aún se está dentro de '\"'\n" + +# Recibida o capturada, pero por Dios , no pongas +# 'se tiene' . En vez de hijo pon proceso hijo , y quita lo +# que tienes entre paréntesis em+ +# Lo del paréntesis era para escoger. mm +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Recibí una señal SIGCHLD; %u proceso hijo descarriado.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIRECTORIO" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "" +#~ "Debe desplazarse al directorio DIRECTORY antes de hacer cualquier cosa" + +#~ msgid "FLAGS" +#~ msgstr "BANDERAS" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Suspender el proceso para permitir que un depurador se utilice" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Las variables de entorno tienen prioridad sobre los makefiles" + +#~ msgid "FILE" +#~ msgstr "ARCHIVO" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Se leyó el ARCHIVO como makefile" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Se buscan en DIRECTORIO los archivos makefile incluídos" + +# Esto me suena a descripción de una opción, más que a un mensaje de error. +# Sugerencia por lo tanto: "No se lanzan ..." sv +# Estás en lo correcto. mm +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "" +#~ "No se lanzan varios trabajos a menos que la carga\n" +#~ "sea inferior a N" + +# Lo mismo de antes. sv +# Ok. mm +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "No se ejecutan las instrucciones; sólamente se muestran" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "Se considera el ARCHIVO demasiado viejo y no se reconstruye" + +# ¿ qué te parece ... +# No se hace echo de las instrucciones em+ +# No me gusta. Que te parece lo que puse ahora? mm +#~ msgid "Don't echo commands" +#~ msgstr "Los comandos no se muestran con eco" + +# Corregido error de tecleos ;) em+ +# Ok. +#~ msgid "Turns off -k" +#~ msgstr "Se deshabilita -k" + +# Lo mismo. sv +# Se considera siempre como nuevo em+ +# Ok. Elimino el 'se' porque está describiendo a una opción. mm +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Considera al ARCHIVO siempre como nuevo" + +# "Entrando en el" (fíjate que esto lo dice cuando entra en un directorio). +# Habría que ver cómo queda. sv +# Ver nota más adelante. mm +# Cambiando a , me pareceria mucho mejor em+ +# En efecto. mm +#~ msgid "Entering" +#~ msgstr "Cambiando a" + +# "Dejando el", "Abandonando el". sv +# Que tal "saliendo"? mm +# Prefiero 'abandonando' , o 'saliendo de' em+ +# Que tal saliendo? mm +#~ msgid "Leaving" +#~ msgstr "Saliendo" + +# corregido el efecto indio , añado un 'un'em+ +# Ok. mm +#~ msgid "no file name for `%sinclude'" +#~ msgstr "no hay un nombre de archivo para `%sinclude'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "El objetivo `%s' deja a los patrones de dependencias vacíos" + +#~ msgid "# No variables." +#~ msgstr "# No hay variables." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# promedio de %.1f variables por `bucket', máx %u en un `bucket'.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# promedio de %d.%d variables por `bucket', máx %u en un `bucket'.\n" + +#~ msgid "Error in lbr$ini_control, %d\n" +#~ msgstr "Error en lbr$ini_control, %d\n" + +#~ msgid "Error looking up module %s in library %s, %d\n" +#~ msgstr "Error al buscar el módulo %s en la biblioteca %s, %d\n" + +#~ msgid "Error getting module info, %d\n" +#~ msgstr "Error al intentar obtener la información del módulo, %d\n" + +#~ msgid "touch: " +#~ msgstr "touch: " + +#~ msgid " not" +#~ msgstr " no" + +#~ msgid "# Last modified %.24s (%0lx)\n" +#~ msgstr "# Última modificación %.24s (%0lx)\n" + +#~ msgid "undefined" +#~ msgstr "indefinido" + +#~ msgid "file" +#~ msgstr "archivo" + +# ¿ crees sinceramente que esto lo puede entender alguien ? em+ +# ¿ qué tal ? con preferencia sobre el entorno em+ +# No, está en AIX, ahora lo arreglo. mm +#~ msgid "environment override" +#~ msgstr "con preferencia sobre el entorno" + +# Habra que compilar esto inmediatamente e instalar +# el .po a ver que es esto em+ +# No se puede por ahora pues make no ha sido internacionalizado aún. +# Será una de las primeras cosas que haga en cuanto se pueda. mm +#~ msgid "override" +#~ msgstr "sobreposición" + +# Sugerencia: Borrar el "de" en "requiere de ..." sv +# Perdón, siempre se me vá a pesar de haberlo discutido un buen rato. mm +#~ msgid "the `word' function takes a one-origin index argument" +#~ msgstr "la función `word' requiere un argumento indexado de tipo origen-uno" + +#~ msgid "implicit" +#~ msgstr "implícita" + +#~ msgid "rule" +#~ msgstr "regla" + +#~ msgid "Trying %s dependency `%s'.\n" +#~ msgstr "Se intenta la dependencia %s `%s'.\n" + +#~ msgid "Found dependency as `%s'.%s\n" +#~ msgstr "Se encuentra la dependencia como `%s'.%s\n" + +#~ msgid "intermediate" +#~ msgstr "intermedia" + +# Preferiría mil veces "sin efecto" o algo parecido. sv +# Ok. Habíamos quedado en `no tiene efecto'. mm +#~ msgid " (ignored)" +#~ msgstr " (no tiene efecto)" + +# Protestar al autor. No hay forma de poner trabajo(s) desconocido(s) +# con coherencia. sv +# Si, si no tienen identificado a su padre. Ni modo. mm +# Pongo /s em+ +# Ok. mm +#~ msgid "Unknown%s job %d" +#~ msgstr "Trabajo%s desconocido/s %d" + +#~ msgid " remote" +#~ msgstr " remoto" + +#~ msgid "%s finished." +#~ msgstr "%s terminado." + +#~ msgid "losing" +#~ msgstr "se pierde" + +#~ msgid "winning" +#~ msgstr "se gana" + +# No me gusta como queda así. +# Sugerencia: "%sGNU Make versión %s" sv +# Aceptada. mm +#~ msgid "%sGNU Make version %s" +#~ msgstr "%sGNU Make versión %s" + +#~ msgid "Unknown error 12345678901234567890" +#~ msgstr "Error desconocido 12345678901234567890" + +#~ msgid "User" +#~ msgstr "Usuario" + +#~ msgid "Make" +#~ msgstr "Make" + +#~ msgid "Child" +#~ msgstr "Hijo" + +#~ msgid "Dependency `%s' does not exist.\n" +#~ msgstr "La dependencia `%s' no existe.\n" + +#~ msgid "newer" +#~ msgstr "más reciente" + +#~ msgid "older" +#~ msgstr "más antigua" + +# Sugerencia: `socket' sv +# Ok. mm +#~ msgid "exporting: Couldn't create return socket." +#~ msgstr "exportando: No se puede crear el `socket' de regreso." + +#~ msgid "exporting: " +#~ msgstr "exportando: " + +#~ msgid "exporting: %s" +#~ msgstr "exportando: %s" + +#~ msgid "Job exported to %s ID %u\n" +#~ msgstr "El trabajo ha sido exportado a %s ID %u\n" + +#~ msgid "Error getting load average" +#~ msgstr "Error al obtener la carga promedio" + +#~ msgid "1-minute: %f " +#~ msgstr "1-minuto: %f " + +#~ msgid "5-minute: %f " +#~ msgstr "5-minutos: %f " + +#~ msgid "15-minute: %f " +#~ msgstr "15-minutos: %f " + +# argv-elements -> elementos argv. sv +# (A poco C que sepas, sabrás lo que es). +# Algunos si, algunos no. Pero tienes razón. mm +#~ msgid "digits occur in two different argv-elements.\n" +#~ msgstr "los dígitos están en dos elementos argv distintos.\n" + +#~ msgid "option %c\n" +#~ msgstr "opción %c\n" + +#~ msgid "option a\n" +#~ msgstr "opción a\n" + +#~ msgid "option b\n" +#~ msgstr "opción b\n" + +# Sugerencia: La opción c tiene el valor `%s' +# Hay un mensaje idéntico en hello. sv +# Me gusta mucho. mm +#~ msgid "option c with value `%s'\n" +#~ msgstr "La opción c tiene el valor `%s'\n" + +#~ msgid "?? getopt returned character code 0%o ??\n" +#~ msgstr "?? getopt() regresó un cáracter con código 0%o ??\n" + +# Elementos ARGV que no son opciones: sv +# Ok. mm. +# Esto es: +# Elementos de ARGV 'que' no son opciones: +# pero tambien es un mensaje de debug del propio make, asi +# que no me preocupa ( no aparecerá a usuarios normales de make ) em+ +# Bueno, pero de todas formas se corrige. mm +#~ msgid "non-option ARGV-elements: " +#~ msgstr "los elementos ARGV que no son opciones: " + +#~ msgid "option d with value `%s'\n" +#~ msgstr "opción d con valor `%s'\n" + +#~ msgid "%s: unknown signal" +#~ msgstr "%s: señal desconocida" + +#~ msgid "Signal 12345678901234567890" +#~ msgstr "Señal 12345678901234567890" + +#~ msgid "Signal %d" +#~ msgstr "Señal %d" diff --git a/po/fi.gmo b/po/fi.gmo new file mode 100644 index 0000000..cc9ea0c Binary files /dev/null and b/po/fi.gmo differ diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..b85fbc4 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,2069 @@ +# Finnish messages for make. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Lauri Nurmi , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81-b3\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2005-07-06 21:36+0300\n" +"Last-Translator: Lauri Nurmi \n" +"Language-Team: Finnish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "yritettiin käyttää ominaisuutta, jolle ei ole tukea: \"%s\"" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "arkistojäsenten kosketus ei ole mahdollista VMS:ssä" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: Arkistoa \"%s\" ei ole olemassa" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: \"%s\" ei ole kelvollinen arkisto" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: Arkistossa \"%1$s\" ei ole jäsentä \"%2$s\"" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: ar_member_touch antoi virheellisen paluuarvon kohteesta \"%s\"" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module epäonnistui moduulitietojen noutamisessa, tila = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control epäonnistui, tila = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "kirjastoa \"%s\" ei voi avata jäsenen \"%s\" etsimiseksi" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Jäsen \"%s\"%s: %ld tavua kohdassa %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (nimi voi olla typistynyt)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Päiväys %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, oikeudet = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Katkaisu.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Arkistojäsen \"%s\" voi olla viallinen - ei poisteta" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Arkistojäsen \"%s\" voi olla viallinen - ei poisteta" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Poistetaan tiedosto \"%s\"" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Poistetaan tiedosto \"%s\"" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# käynnisetttävät komennot" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (sisäänrakennettu):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (tiedostosta \"%s\", rivi %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Hakemistot\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: tilaa ei voitu lukea.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (avain %s, maika %d): ei voitu avata.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (laite %d, i-solmu [%d,%d,%d]): ei voitu avata.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (laite %ld, i-solmu %ld): ei voitu avata.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (avain %s, maika %d: " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (laite %d, i-solmu [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (laite %ld, i-solmu %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Ei" + +# Juuri näin, muodostetaan käännöslause yksittäisistä sanoista... +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " tiedostoa, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "ei" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " mahdottomuutta" + +#: dir.c:1075 +msgid " so far." +msgstr " tähän mennessä." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " mahdottomuutta %lu hakemistossa.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Rekursiivinen muuttuja \"%s\" viittaa (lopulta) itseensä" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "päättämätön muuttujaviittaus" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Tiedostolle \"%s\" määriteltiin komentoja paikassa %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "Tiedostolle \"%s\" löytyi komentoja oletussääntöhaussa," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "mutta \"%s\":n katsotaan nyt olevan sama tiedosto kuin \"%s\"." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "" +"Tiedoston \"%s\" komentoja ei huomioida, vaan käytetään komentoja " +"tiedostosta \"%s\"." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Poistetaan aputiedosto \"%s\"" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Poistetaan aputiedostot...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Aikaleima ei ole sallitulla välillä, korvataan %s" + +#: file.c:804 +msgid "Current time" +msgstr "Tämänhetkinen aika" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Ei kohde:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Arvokas tiedosto (ennakkoehto .PRECIOUS:ille)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Valekohde (ennakkoehto .PHONY:lle)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Komentorivikohde." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Oletus-, MAKEFILES- tai -include/sinclude -makefile-tiedosto." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Oletussääntöhaku on suoritettu." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Oletussääntöhakua ei ole suoritettu." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Tiedosto on välitason ennakkoehto." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Tuotetaan myös:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Muutosaikaa ei koskaan tarkastettu." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Tiedosto ei ole olemassa." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Tiedosto on hyvin vanha." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Viimeksi muutettu %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Tiedosto on päivitetty." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Tiedostoa ei ole päivitetty." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Ajossa olevat komennot (TÄMÄ ON OHJELMISTOVIKA)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Ajossa olevat riippuvuuskomennot (TÄMÄ ON OHJELMISTOVIKA)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Päivitetty onnistuneesti." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Vaatii päivitystä (-q on asetettu)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Päivitys epäonnistui." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Virheellinen arvo \"update_status\"-jäsenessä!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Virheellinen arvo \"command_state\"-jäsenessä!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Tiedostot" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tilasto tiedostojen hajautustaulusta:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "ei-numeerinen ensimmäinen argumentti \"word\"-funktiolle" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "\"word\"-funktion ensimmäisen argumentin on oltava suurempi kuin 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "ei-numeerinen ensimmäinen argumentti \"wordlist\"-funktiolle" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "ei-numeerinen toinen argumentti \"wordlist\"-funktiolle" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) epäonnistui (v=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) epäonnistui (v=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() epäonnistui (v=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() epäonnistui\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Siivotaan väliaikainen komentotiedosto %s\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "Liian vähän (%d) argumenttejeja funktiolle \"%s\"" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "Ei toteutettu tällä alustalla: funktio \"%s\"" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "päättämätön kutsu funktioon \"%s\": puuttuva \"%c\"" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: valitsin \"%s\" on moniselitteinen\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: valitsin \"--%s\" ei salli argumenttia\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: valitsin \"%c%s\" ei salli argumenttia\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: valitsin \"%s\" vaatii argumentin\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: tunnistamaton valitsin \"--%s\"\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: tunnistamaton valitsin \"%c%s\"\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: virheellinen valitsin -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: virheellinen valitsin -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: valitsin vaatii argumentin -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: valitsin \"-W %s\" on moniselitteinen\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: valitsin \"-W %s\" ei salli argumenttia\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "ei voida varata %ld tavua hajautustaululle: muisti lopussa" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Kuormitus=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Uudelleenhajautus=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Törmäykset=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Etsitään oletussääntöä kohteelle \"%s\".\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Etsitään arkistojäsenen oletussääntöä kohteelle \"%s\".\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Vältetään oletussääntörekursio.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Kokeillaan hahmosääntöä rungolla \"%.*s\".\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Hylätään mahdoton säännön ennakkoehto \"%s\".\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Hylätään mahdoton oletusennakkoehto \"%s\".\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Yritetään käyttää säännön ennakkoehtoa \"%s\".\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Yritetään käyttää oletusennakkoehtoa \"%s\".\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Löydettiin ennakkoehto \"%s\", joka on VPATH \"%s\"\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Etsitään sääntöä aputiedostolla \"%s\".\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Väliaikaistiedoston luominen ei onnistu\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Virhe 0x%x (ei huomioida)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Virhe 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Virhe %d (ei huomioida)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Virhe %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (muisti vedostettu)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Odotetaan keskeneräisiä töitä...." + +#: job.c:579 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (etä)" + +#: job.c:758 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: job.c:759 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Siivotaan väliaikainen komentotiedosto %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Poistetaan ketjusta lapsiprosessi 0x%08lx PID %ld%s.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "työpalvelimen kirjoitus" + +#: job.c:922 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() epäonnistui prosessin käynnistämisessä (v=%d)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Laskettiin %d argumenttia epäonnistuneessa käynnistyksessä\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Lisätään ketjuun lapsiprosessi 0x%08lx (%s) PID %ld%s.\n" + +#: job.c:1778 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "työputken luku" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Ei tarvetta uudelleentuottaa kohdetta \"%s\"" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "kuormarajoja ei voi ottaa käyttöön tässä käyttöjärjestelmässä" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "kuormarajaa ei voi ottaa käyttöön: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"tiedostokahvoja ei ole enempää: vakiosyötteen kahdentaminen ei onnistunut\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"tiedostokahvoja ei ole enempää: vakiotulosteen kahdentaminen epäonnistui\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Vakiosyötettä ei voitu palauttaa\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Vakiotulostetta ei voitu palauttaa\n" + +#: job.c:2127 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Komentoa ei löytynyt" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Kuoriohjelmaa ei löytynyt" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: ympäristötila saattaa olla lopussa" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL muuttunut (oli \"%s\", nyt \"%s\")\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Luodaan väliaikainen komentotiedosto %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (rivi %d) Väärä kuoriympäristö (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Valitsimet:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m Yhteensopivuuden vuoksi jätetään huomiotta.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Tuota kaikki kohteet ehdoitta.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C HAKEMISTO, --directory=HAKEMISTO\n" +" Siirry HAKEMISTOon ennen jatkamista.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Näytä runsaasti vianetsintätietoja.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr " --debug[=LIPUT] Näytä monenlaisia vianetsintätietoja.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Ympäristömuuttujat kumoavat makefile-" +"tiedostot.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f TIEDOSTO, --file=TIEDOSTO, --makefile=TIEDOSTO\n" +" Käytä TIEDOSTOa makefile-tiedostona.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Näytä tämä viesti ja poistu.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Älä huomioi suoritettujen komentojen " +"virheitä.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I HAKEMISTO, --include-dir=HAKEMISTO\n" +" Etsi sisällytettäviä makefile:ja " +"HAKEMISTOsta.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Salli N yhtäaikaista työtä; ilman N:ää " +"ääretön.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Jatka vaikka joidenkin kohteiden tuottaminen\n" +" epäonnistuisi.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Älä aloita useita töitä ellei kuormitus alle " +"N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Käytä uusinta mtime-aikaa symlinkkien ja\n" +" kohteen välillä.\n" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Näytä ajettavat komennot, älä käynnistä " +"niitä.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o TIEDOSTO, --old-file=TIEDOSTO, --assume-old=TIEDOSTO\n" +" Käsittele TIEDOSTO vanhana, älä tuota sitä.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Näytä make:in sisäinen tietokanta.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Älä aja komentoja; paluuarvo kertoo ajan-\n" +" tasaisuuden.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Poista käytöstä sisäiset oletussäännöt.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Poista käytöstä sisäiset muuttuja-asetukset.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Älä kaiuta komentoja.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Kumoaa valitsimen -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch Kosketa kohteita tuottamisen sijaan.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Näytä make:in versionumero ja poistu.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Näytä nykyinen hakemisto.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Kumoa -w, vaikka se olisi käytössä " +"oletuksena.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W TIEDOSTO, --what-if=TIEDOSTO, --new-file=TIEDOSTO, --assume-" +"new=TIEDOSTO\n" +" Käsittele TIEDOSTO aina uutena.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Varoita viittauksista määrittelemättömiin\n" +" muuttujiin.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "tyhjä merkkijono ei kelpaa tiedostonimeksi" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "tuntematon vianetsintätason määritys \"%s\"" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Keskeytys/poikkeus siepattu (koodi = 0x%x, osoite = 0x%x)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Ohjelmasta %s kutsuttiin käsittelemätöntä poikkeussuodinta\n" +"Poikkeuskoodi = %x\n" +"Poikkeusliput = %x\n" +"Poikkeusosoite = %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Suojausvirhe: kirjoitusoperaatio osoitteeseen %x\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Suojausvirhe: lukuoperaatio osoitteeseen %x\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell asettaa default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell: polkuhaku asetti default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s keskeytyy 30 sekunniksi..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) valmis. Jatketaan.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile-tiedosto vakiosyötteestä määritelty kahdesti." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (väliaikaistiedosto)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (väliaikaistiedosto)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Rinnakkaiset työt (-j) eivät ole tuettuja tällä alustalla." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Palataan yhden työn (-j1) tilaan." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "sisäinen virhe: useitan --jobserver-fds -valitsimia" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "sisäinen virhe: virheellinen --jobserver-fds -merkkijono \"%s\"" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "varoitus: -jN pakotettu ali-make:ssa: poistetaan työpalvelin käytöstä." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "kaksinkertainen työpalvelin" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"varoitus: työpalvelin ei käytettävissä: käytetään -j1. Lisää \"+\" ylemmän " +"tason make-sääntöön." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "luodaan työputki" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "alustetaan työpalvelimen putki" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "Ei tukea symbolisille linkeille: poistetaan -L käytöstä." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Päivitetään makefile-tiedostoja....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "" +"Ei uudelleentuoteta makefile-tiedostoa \"%s\" - vältetään mahdollinen " +"ikuinen silmukka.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Makefile-tiedoston \"%s\" uudelleentuottaminen epäonnistui." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Sisällytettyä makefile-tiedostoa \"%s\" ei löytynyt." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Makefile-tiedostoa \"%s\" ei löytynyt" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Ei voitu siirtyä takaisin alkuperäiseen hakemistoon." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Uudelleenkäynnistetään[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (väliaikaistiedosto): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL sisältää yli yhden kohteen" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Kohteita ei ole annettu, eikä makefileä löytynyt" + +#: main.c:2272 +msgid "No targets" +msgstr "Ei kohteita" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"varoitus: Havaittu väärä kellonaika. Käännösversio saattaa olla " +"epätäydellinen." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Käyttö: %s [valitsimet] [kohde] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Tämä ohjelma on käännetty järjestelmälle %s.\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Tämä ohjelma on käännetty järjestelmälle %s (%s).\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Ilmoita ohjelmistovioista (englanniksi) osoitteeseen .\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "valitsin \"-%c\" vaatii ei-tyhjän merkkijonoargumentin" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "valitsin \"-%c\" vaatii positiivisen kokonaislukuargumentin" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sTämä ohjelma on käännetty järjestelmälle %s.\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sTämä ohjelma on käännetty järjestelmälle %s (%s).\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make-tietokanta, tulostettu %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Make-tietokanta saatu valmiiksi %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Siirrytään tuntemattomaan hakemistoon\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Poistutaan tuntemattomasta hakemistosta\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Siirrytään hakemistoon \"%s\"\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Poistutaan hakemistosta \"%s\"\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Siirrytään tuntemattomaan hakemistoon\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Poistutaan tuntemattomasta hakemistosta\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Siirrytään hakemistoon \"%s\"\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Poistutaan hakemistosta \"%s\"\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Seis.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Tuntematon virhe %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "virtuaalimuisti lopussa" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: käyttäjä %lu (todellinen %lu), ryhmä %lu (todellinen %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Alkuperäiset käyttöoikeudet" + +#: misc.c:808 +msgid "User access" +msgstr "Käyttäjän käyttöoikeudet" + +#: misc.c:856 +msgid "Make access" +msgstr "Make-prosessin käyttöoikeudet" + +#: misc.c:890 +msgid "Child access" +msgstr "Lapsiprosessin käyttöoikeudet" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "kirjoitusvirhe: %s" + +#: misc.c:956 +msgid "write error" +msgstr "kirjoitusvirhe" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Luetaan makefile-tiedostoja...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Luetaan makefile-tiedosto \"%s\"" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr "" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (hakupolku)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (ei välitetä)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ei ~-laajennusta)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "virheellinen syntaksi ehtolauseessa" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "komennot alkavat ennen ensimmäistä kohdetta" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "puuttuva sääntö ennen komentoja" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "puuttuva erotin%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (ehkä tarkoitit sarkainta eikä kahdeksaa välilyöntiä?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "puuttuva kohdehahmo" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "useita kohdehahmoja" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "kohdehahmo ei sisällä %%-merkkiä" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "puuttuva \"endif\"" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "tyhjä muuttujan nimi" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Ylimääräistä tekstiä \"endef\"-toimintaohjeen jälkeen" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "puuttuva \"endef\", päättämätön \"define\"" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Ylimääräistä tekstiä \"endef\"-toimintaohjeen jälkeen" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Ylimääräistä tekstiä \"%s\"-toimintaohjeen jälkeen" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "ylimääräinen \"%s\"" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "vain yksi \"else\" ehtolausetta kohden" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Väärin muotoiltu kohdekohtainen muuttujamäärittely" + +# skripti? +#: read.c:1855 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "ennakkoehtoja ei voi määritellä komentoskripteissä" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "kohde \"%s\" ei täsmää kohdehahmon kanssa" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "kohdetiedostolla \"%s\" on sekä :- että ::-merkinnät" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "kohde \"%s\" annettu yli yhden kerran samassa säännössä." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "varoitus: syrjäytetään kohteen \"%s\" komennot" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "varoitus: ei huomioida vanhoja komentoja kohteelle \"%s\"" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "varoitus: havaittu NUL-merkki, rivin loppuosaa ei huomioida" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Kohteelle \"%s\" ei tarvitse tehdä mitään." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "\"%s\" on ajan tasalla." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Karsitaan tiedosto \"%s\".\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sKohteen \"%s\" tuottamiseen ei ole sääntöä%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "" +"%1$s\"%3$s\"-kohteen tarvitseman kohteen \"%2$s\" tuottamiseen ei ole sääntöä" +"%4$s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Tarkastellaan tiedostoa \"%s\".\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Tiedoston \"%s\" päivitysyritys epäonnistui äskettäin.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Tiedostoa \"%s\" on jo tarkasteltu.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Päivitetään edelleen tiedostoa \"%s\".\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Tiedosto \"%s\" päivitetty.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Tiedosto \"%s\" ei ole olemassa.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Varoitus: .LOW_RESOLUTION_TIME-tiedostolla \"%s\" on " +"korkearesoluutioinen aikaleima" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Kohteelle \"%s\" löytyi oletussääntö.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Kohteelle \"%s\" ei löytynyt oletussääntöä.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Käytetään oletuskomentoja kohteelle \"%s\".\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Kehäriippuvuus %s <- %s hylätty." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Kohdetiedoston \"%s\" ennakkoehdot täytetty.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Kohteen \"%s\" ennakkoehtoja täytetään.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Luovutaan kohdetiedostosta \"%s\".\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Kohdetta \"%s\" ei tuotettu uudelleen virheiden vuoksi." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Kohteen \"%2$s\" ennakkoehto \"%1$s\" ei ole olemassa.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Ennakkoehto \"%s\" on uudempi kuin kohde \"%s\".\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Ennakkoehto \"%s\" on vanhempi kuin kohde \"%s\".\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: remake.c:765 +#, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Tuotetaan \"%s\", koska --always-make -valitsin on käytössä.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Ei tarvetta uudelleentuottaa kohdetta \"%s\"" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; käytetään VPATH-nimeä \"%s\"" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Kohde \"%s\" on tuotettava uudelleen.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Ei huomioida VPATH-nimeä \"%s\".\n" + +#: remake.c:815 +#, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Kohdetiedoston \"%s\" uudelleentuottaminen epäonnistui.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Kohdetiedosto \"%s\" uudelleentuotettiin onnistuneesti.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Käytetään oletuskomentoja kohteelle \"%s\".\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Varoitus: Tiedoston \"%s\" muutosaika on tulevaisuudessa" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Varoitus: Tiedoston \"%s\" muutosaika on %.2g sekuntia tulevaisuudessa" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNS-elementti \"%s\" ei ole hahmo" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Oletussäännöt" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Ei oletussääntöjä." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u oletussääntöä, %u" + +#: rule.c:526 +msgid " terminal." +msgstr "" + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "VIKA: num_pattern_rules väärä! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "tuntematon signaali" + +#: signame.c:94 +msgid "Hangup" +msgstr "Linjankatkaisu" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Keskeytys" + +#: signame.c:100 +msgid "Quit" +msgstr "Lopetettu" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Virheellinen käsky" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Jäljitys/katkaisupisteansa" + +#: signame.c:111 +msgid "Aborted" +msgstr "Keskeytetty" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT-ansa" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT-ansa" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Liukulukupoikkeus" + +#: signame.c:123 +msgid "Killed" +msgstr "Tapettu" + +#: signame.c:126 +msgid "Bus error" +msgstr "Väylävirhe" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Muistialueen ylitys" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Virheellinen järjestelmäkutsu" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Katkennut putki" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Herätyskello" + +#: signame.c:141 +msgid "Terminated" +msgstr "Päätetty" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Käyttäjän määrittelemä signaali 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Käyttäjän määrittelemä signaali 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Lapsi lopetti" + +#: signame.c:158 +msgid "Power failure" +msgstr "Sähkökatko" + +#: signame.c:161 +msgid "Stopped" +msgstr "Pysäytetty" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Pysäytetty (päätteen syöte)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Pysäytetty (päätteen tuloste)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Pysäytetty (signaali)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Suoritinaikaraja ylittynyt" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Tiedoston kokoraja ylitetty" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Virtuaaliajastin vanhentunut" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Profilointiajastin vanhentunut" + +#: signame.c:188 +msgid "Window changed" +msgstr "Ikkuna vaihtunut" + +#: signame.c:191 +msgid "Continued" +msgstr "Jatkettu" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Kiireellinen I/O-tilanne" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O mahdollista" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Resurssi menetetty" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Vaarasignaali" + +#: signame.c:219 +msgid "Information request" +msgstr "Tietopyyntö" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Käytettävissä ei ole liukulukusuoritinta" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tilasto tiedostojen hajautustaulusta:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "oletus" + +#: variable.c:1544 +msgid "environment" +msgstr "ympäristö" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "-e:n alainen ympäristö" + +#: variable.c:1553 +msgid "command line" +msgstr "komentorivi" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "\"override\"-toimintaohje" + +#: variable.c:1559 +msgid "automatic" +msgstr "automaattinen" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (tiedostosta \"%s\", rivi %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# muuttujajoukon hajautustaulutilastot:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Muuttujat\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Hahmokohtaisia muuttujien arvoja" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Ei hahmokohtaisia muuttuja-arvoja." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u hahmokohtaista muuttuja-arvoa" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "varoitus: määrittelemätön muuttuja \"%.*s\"" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search epäonnistui, arvo %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Varoitus: Tyhjä uudelleenohjaus\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "sisäinen virhe: \"%s\" command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-varoitus, Ctrl-Y-käsittely on ehkä otettava uudelleen käyttöön DCL:stä.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "SISÄÄNRAKENNETTU [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "SISÄÄNRAKENNETTU CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "SISÄÄNRAKENNETTU RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Tuntematon sisäänrakennettu komento \"%s\"\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Virhe, tyhjä komento\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Syöte uudelleenohjattu kohteesta %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Virhetuloste uudelleenohjattu kohteeseen %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Tuloste uudelleenohjattu kohteeseen %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Tuloste uudelleenohjattu kohteeseen %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Käynnistetään sen sijaan %s\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Virhe käynnistyksessä, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-hakupolut\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Ei \"vpath\"-hakupolkuja." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u \"vpath\"-hakupolkua.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Ei yleistä (\"VPATH\"-muuttuja) hakupolkua." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Yleinen (\"VPATH\"-muuttuja) hakupolku:\n" +"# " + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Älä anna -j tai --jobs -valitsinta jos sh.exe ei ole käytettävissä." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Palautetaan make yhden työn tilaan." + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sTämä on vapaa ohjelmisto; katso kopiointiehdot lähdekoodista.\n" +#~ "%sTakuuta EI ole, ei edes KAUPALLISESTI HYVÄKSYTTÄVÄSTÄ LAADUSTA tai\n" +#~ "%sSOPIVUUDESTA TIETTYYN TARKOITUKSEEN.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "ylimääräinen \"endef\"" + +#~ msgid "empty `override' directive" +#~ msgstr "tyhjä \"override\"-toimintaohje" + +#~ msgid "invalid `override' directive" +#~ msgstr "virheellinen \"override\"-toimintaohje" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-varoitus, Ctrl-Y jättää aliprosessi(n/t) käyntiin.\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Syntaksivirhe, edelleen \":n sisällä\n" diff --git a/po/fr.gmo b/po/fr.gmo new file mode 100644 index 0000000..85109c0 Binary files /dev/null and b/po/fr.gmo differ diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..4b38b22 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,2338 @@ +# Messages français pour make. +# Copyright © 2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# 30-juillet-2001, n'avons plus de nouvelle de Marc depuis 5 janvier 1997 +# Marc Baudoin , Frédéric Liné , 1996. +# Michel Robitaille , 1996-2006 +# Christophe Combelles , 2009, 2010 +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 3.81.91\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2010-07-23 01:02+0100\n" +"Last-Translator: Christophe Combelles \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "tentative d'utiliser une caractéristique non prise en charge : « %s »" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "impossible de modifier la date d'un membre d'une archive sur VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch : l'archive « %s » n'existe pas" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch : « %s » n'est pas une archive valide" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch : le membre « %s » n'existe pas dans « %s »" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch : mauvais code de retour de ar_member_touch pour « %s »" + +#: arscan.c:69 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() n'a pas pu extraire les infos du module. Code = %d" + +#: arscan.c:175 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() a échoué avec un code = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "impossible d'ouvrir la bibliothèque %s pour récupérer le membre « %s »" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Membre `%s'%s : %ld octets à %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (le nom peut être tronqué)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Date %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Break.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "" +"*** [%s] le membre d'archive « %s » peut avoir un problème ; il n'a pas été " +"supprimé" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "" +"*** Le membre d'archive « %s » peut avoir un problème; il n'a pas été supprimé" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Suppression du fichier « %s »" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Suppression du fichier « %s »" + +#: commands.c:676 +msgid "# recipe to execute" +msgstr "# recette à exécuter" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (commande interne):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (de « %s », ligne %lu) :\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Répertoires\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s : « stat » impossible.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (clé %s, mtime %d) : ouverture impossible.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (périphérique %d, inode [%d,%d,%d]) : ouverture impossible.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (périphérique %ld, inode %ld) : ouverture impossible.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (périphérique %s, mtime %d) : " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (périphérique %d, inode [%d,%d,%d]) : " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (périphérique %ld, inode %ld) : " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Aucun" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " fichier(s), " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "aucune" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " impossibilité(s)" + +#: dir.c:1075 +msgid " so far." +msgstr " jusqu'ici." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilités dans %lu répertoires.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "La variable récursive « %s » se référence elle-même (finalement)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "référence incomplète à une variable" + +#: file.c:267 +#, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Une recette a été spécifiée pour le fichier « %s » à %s:%lu," + +#: file.c:272 +#, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" +"La recette pour le fichier « %s » a été trouvée par une recherche de règle " +"implicite," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "" +"mais « %s » est maintenant considéré comme étant le même fichier que « %s »." + +#: file.c:278 +#, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "La recette pour « %s » sera ignorée en faveur de celle pour « %s »." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" +"impossible de renommer le deux-points simple « %s » en deux-points double « %s " +"»" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" +"impossible de renommer le deux-points double « %s » en deux-points simple « %s " +"»" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Suppression du fichier intermédiaire « %s »" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Suppression des fichiers intermédiaires...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s : horodatage hors limite ; remplacement par %s" + +#: file.c:804 +msgid "Current time" +msgstr "Heure actuelle" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Pas une cible :" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Fichier précieux (dépendance de .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Cible factice (dépendance de .PHONY)." + +#: file.c:933 +msgid "# Command line target." +msgstr "# Cible de la ligne de commande." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Une valeur par défaut, MAKEFILES ou -include/sinclude makefile." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# La recherche de règle implicite a été effectuée." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# La recherche de règle implicite n'a pas été effectuée." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Préfixe de motif implicite ou statique : « %s »\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Le fichier est une dépendance intermédiaire." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Fabrique également :" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Heure de modification jamais vérifiée." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Le fichier n'existe pas." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Le fichier est très ancien." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Dernière modification %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Le fichier a été mis à jour." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Le fichier n'a pas été mis à jour." + +#: file.c:968 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Recette en cours d'exécution (CECI EST UNE ANOMALIE)." + +#: file.c:971 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" +"# Recette de dépendances en cours d'exécution (CECI EST UNE ANOMALIE)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Mise à jour réussie." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# A besoin d'être mis à jour (l'option -q est activée)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# N'a pas pu être mis à jour." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Valeur non valable dans le membre « update_status » !" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Valeur non valable dans le membre « command_state » !" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Fichiers" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# stats des tables de hachage des fichiers :\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "le premier argument de la fonction « word » doit être numérique" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "le premier argument de la fonction « word » doit être plus grand que 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "le premier argument de la fonction « wordlist » doit être numérique" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "le deuxième argument de la fonction « wordlist » doit être numérique" + +#: function.c:1458 +#, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(In) a échoué (e=%ld)\n" + +#: function.c:1469 +#, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_open_pipe(): DuplicateHandle(Err) a échoué (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() a échoué (e=%ld)\n" + +#: function.c:1479 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() a échoué\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Nettoyage du fichier de commandes temporaire %s\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "nombre d'arguments insuffisant (%d) pour la fonction « %s »" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "non implémenté sur cette plateforme: fonction « %s »" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "appel à la fonction « %s » non terminé : « %c » manquant" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s : l'option « %s » est ambiguë\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s : l'option « --%s » ne prend pas d'argument\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s : l'option « %c%s » ne prend pas d'argument\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s : l'option « %s » nécessite un argument\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s : option non reconnue « --%s »\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s : option non reconnue « %c%s »\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s : option non admise -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s : option incorrecte -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s : l'option nécessite un argument -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s : l'option « -W %s » est ambiguë\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s : l'option « -W %s » ne prend pas d'argument\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"impossible d'allouer %lu octets pour la table de hachage : mémoire épuisée" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Charge=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Collisions=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Recherche d'une règle implicite pour « %s ».\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Recherche d'une règle implicite de membre d'archive pour « %s ».\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Évitement de récursion dans une régle implicite.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Essai du motif avec « %.*s » comme radical.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Rejet d'une dépendance de règle impossible « %s ».\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Rejet d'une dépendance implicite impossible « %s ».\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Essai de la dépendance de règle « %s ».\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Essai de la dépendance implicite « %s ».\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Dépendance trouvée « %s » comme VPATH « %s »\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Recherche d'une règle contenant le fichier intermédaire « %s ».\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Impossible de créer un fichier temporaire\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Erreur 0x%x (ignorée)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Erreur 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Erreur %d (ignorée)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Erreur %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (core dump créé)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Attente des tâches non terminées...." + +#: job.c:579 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Processus fils actif %p (%s) PID %s %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (distant)" + +#: job.c:758 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Récolte du processus fils perdant %p PID %s %s\n" + +#: job.c:759 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Récolte du processus fils gagnant %p PID %s %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Nettoyage du fichier de commande temporaire %s\n" + +#: job.c:861 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Retrait du processus fils %p PID %s%s de la chaîne.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "écriture vers le serveur de tâches" + +#: job.c:922 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Jeton relâché pour le processus fils %p (%s).\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() n'a pas pu lancer de processus (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"%d arguments comptés lors du lancement échoué\n" + +#: job.c:1525 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Ajout du processus fils %p (%s) PID %s%s à la chaîne.\n" + +#: job.c:1778 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Jeton obtenu pour le processus fils %p (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "lecture du tube des processus" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "Invocation de recette de %s:%lu pour mettre à jour la cible « %s ».\n" + +#: job.c:1802 +#, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "" +"Invocation de la recette incorporée pour mettre à jour la cible « %s ».\n" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "" +"impossible d'imposer des limites de charge sur ce système d'exploitation" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "impossible d'imposer des limites de charge : " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"plus d'identificateur de fichier disponible : impossible de dupliquer stdin\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"plus d'identificateur de fichier disponible : impossible de dupliquer " +"stdout\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Impossible de restaurer stdin\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Impossible de restaurer stdout\n" + +#: job.c:2127 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"make a récolté le processus fils pid %s, toujours en attente du pid %s\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s : commande introuvable" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s : programme Shell introuvable" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: l'espace d'environnement est peut-être épuisé" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL a été modifié (valait « %s », maintenant vaut « %s »)\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Création d'un fichier de commande temporaire %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Contenu du fichier Batch :%s\n" +"\t%s\n" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (ligne %d) Mauvais contexte du shell (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Options :\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoré pour compatibilité.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Fabriquer toutes les cibles sans condition.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C RÉPERTOIRE, --directory=RÉPERTOIRE\n" +" Se placer dans le RÉPERTOIRE avant toute " +"action.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Afficher beaucoup d'informations de débogage.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGS] Afficher divers types d'informations de " +"débogage.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Les variables d'environment sont prioritaires " +"sur les makefiles.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=CHAINE Evaluer la CHAINE comme une instruction de " +"makefile.\n" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FICHIER, --file=FICHIER, --makefile=FICHIER\n" +" Lire le FICHIER comme un makefile.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Afficher ce message et quitter.\n" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Ignorer les erreurs venant des recettes.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I RÉPERTOIRE, --include-dir=RÉPERTOIRE\n" +" Chercher dans le RÉPERTOIRE les makefiles " +"traités par inclusion.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Autoriser N tâches simultanées ; nombre infini " +"si utilisé sans argument.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Poursuivre même si certaines cibles n'ont pas " +"pu être fabriquées.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Ne pas lancer de tâches multiples à moins que " +"la charge soit inférieure à N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Utiliser le « mtime » le plus récent entre les " +"liens symboliques et la cible.\n" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" N'exécuter aucune recette ; seulement les " +"afficher.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o FICHIER, --old-file=FICHIER, --assume-old=FICHIER\n" +" Considérer le FICHIER comme étant très ancien " +"et ne pas le refabriquer.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Afficher la base de données interne de make.\n" + +#: main.c:347 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Ne pas exécuter de recette ; le code de sortie " +"indique si la cible est à jour.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Désactiver les règles implicites internes.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Désactiver les réglages des variables " +"internes.\n" + +#: main.c:353 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ne pas répéter les recettes.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Désactiver -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Assigner l'heure actuelle aux cibles au lieu " +"de les refabriquer.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Afficher le numéro de version de make et " +"quitter.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Afficher le répertoire courant.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Désactiver l'option -w, même si elle a été " +"activée implicitement.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W FICHIER, --what-if=FICHIER, --new-file=FICHIER, --assume-new=FICHIER\n" +" Considérer le FICHIER comme étant toujours " +"nouveau.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Prévenir lorsqu'une variable non définie est " +"référencée.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "une chaîne vide n'est pas un nom de fichier valable" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "niveau de débogage inconnu « %s »" + +#: main.c:690 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s : interception de l'Interruption/Exception (code = 0x%lx, addr = 0x%p)\n" + +#: main.c:697 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Filtre d'exception non pris en charge appelé depuis le programme %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" + +#: main.c:705 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Violation d'accès : opération d'écriture à l'adresse 0x%p\n" + +#: main.c:706 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Violation d'accès : opération de lecture à l'adresse 0x%p\n" + +#: main.c:781 main.c:792 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() définit default_shell = %s\n" + +#: main.c:834 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"La recherche de chemin de find_and_set_shell() a définit default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s s'arrête pendant 30 secondes..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) terminé. On continue.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile depuis l'entrée standard spécifié deux fois." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (fichier temporaire)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (fichier temporaire)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" +"Les tâches en parallèle (-j) ne sont pas prises en charge sur cette " +"plateforme." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "On revient en mode monotâche (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "erreur interne : options --jobserver-fds multiples" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "erreur interne : chaîne --jobserver-fds incorrecte « %s » " + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "client Jobserver (fds %d,%d)\n" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"AVERTISSEMENT : -jN forcé dans un submake : désactivation du mode serveur de " +"tâches." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "duplication du serveur de tâches" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"AVERTISSEMENT : le serveur de tâches n'est pas disponible: utilisation de -" +"j1. Ajouter « + » à la règle parent du make." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "création d'un tube pour les tâches" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "initialisation du tube du serveur de tâches" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" +"Les liens symboliques ne sont pas pris en charge : désactivation de -L." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Mise à jour des makefiles....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Le makefile « %s » peut boucler ; on ne refabrique pas.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Échec de refabrication du makefile « %s »." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Le makefile inclus « %s » est introuvable." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Le makefile « %s » est introuvable" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Impossible de revenir dans le répertoire d'origine." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Ré-exécution[%u] :" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (fichier temporaire):" + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL contient plus d'une cible" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Pas de cible spécifiée et aucun makefile n'a été trouvé" + +#: main.c:2272 +msgid "No targets" +msgstr "Pas de cible" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Mise à jour des objectifs cibles....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"AVERTISSEMENT : décalage d'horloge détecté. La construction peut être " +"incomplète." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Utilisation : %s [options] [cible] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Ce programme a construit pour %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Ce programme a construit pour %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Signaler les anomalies à .\n" + +#: main.c:2562 +#, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "l'option « %s%s » a besoin d'une chaîne non vide comme argument" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "l'option « -%c » prend en argument un entier positif" + +#: main.c:3054 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sConstruit pour %s\n" + +#: main.c:3056 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sConstruit pour %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" +"%sLicence GPLv3+ : GNU GPL version 3 ou ultérieure \n" +"%sCeci est un logiciel libre : vous êtes autorisé à le modifier et à la " +"redistribuer.\n" +"%sIl ne comporte AUCUNE GARANTIE, dans la mesure de ce que permet la loi.\n" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Base de données de Make, imprimée le %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Base de données de Make terminée le %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s : on entre dans un répertoire inconnu\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s : on quitte un répertoire inconnu\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s : on entre dans le répertoire « %s »\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: on quitte le répertoire « %s »\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u] : on entre dans un répertoire inconnu\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u] : on quitte un répertoire inconnu\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u] : on entre dans le répertoire « %s »\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u] : on quitte le répertoire « %s »\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Arrêt.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Erreur inconnue %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s : %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s : %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "mémoire virtuelle épuisée" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s : utilisateur %lu (reél %lu), groupe %lu (réel %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Accès initialisé" + +#: misc.c:808 +msgid "User access" +msgstr "Accès utilisateur" + +#: misc.c:856 +msgid "Make access" +msgstr "Accès de Make" + +#: misc.c:890 +msgid "Child access" +msgstr "Accès des fils" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "erreur d'écriture : %s" + +#: misc.c:956 +msgid "write error" +msgstr "erreur d'écriture" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Lecture des makefiles...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Lecture du makefile « %s »" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (pas d'objectif par défaut)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (chemin de recherche)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (peu importe)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (pas de remplacement du ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "syntaxe incorrecte dans la condition" + +#: read.c:891 +msgid "recipe commences before first target" +msgstr "La recette commence avant la première cible" + +#: read.c:940 +msgid "missing rule before recipe" +msgstr "règle manquante avant la recette" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "séparateur manquant %s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (vouliez-vous dire TAB au lieu des 8 espaces ?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "motif de cible manquant" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "motifs de cible multiples" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "le motif de cible ne contient pas « %% »" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "« endif » manquant" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "nom de variable vide" + +#: read.c:1367 +msgid "extraneous text after `define' directive" +msgstr "Texte superflu après la directive « define »" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "« endef » manquant, « define » non terminé" + +#: read.c:1420 +msgid "extraneous text after `endef' directive" +msgstr "Texte superflu après la directive « endef »" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Texte superflu après la directive « %s »" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "« %s » superflu" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "un seul « else » par condition" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Définition malformée de variable spécifique à une cible" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "les prérequis ne peuvent être définis dans des recettes" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "mélange de règles implicites et statiques pour le motif" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "mélange de règles implicites et normales" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "la cible « %s » ne correspond pas au motif de cible" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "le fichier cible « %s » possède à la fois des entrées : et ::" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "la cible « %s » apparaît plus d'une fois dans la même règle." + +#: read.c:2006 +#, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "AVERTISSEMENT : surchargement de la recette pour la cible « %s »" + +#: read.c:2009 +#, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "AVERTISSEMENT : ancienne recette ignorée pour la cible « %s »" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" +"AVERTISSEMENT : caractère NUL détecté ; le reste de la ligne est ignoré" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Rien à faire pour « %s »." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "« %s » est à jour." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Élagage du fichier « %s ».\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sAucune règle pour fabriquer la cible « %s »%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%s Aucune règle pour fabriquer la cible « %s », nécessaire pour « %s »%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Étude du fichier cible « %s ».\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Tentative récente échouée de mettre à jour le fichier « %s ».\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Le fichier « %s » a déjà été étudié.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Mise à jour du fichier « %s » en cours.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Fin de la mise à jour du fichier « %s ».\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Le fichier « %s » n'existe pas.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** AVERTISSEMENT : le fichier .LOW_RESOLUTION_TIME « %s » a un horodatage à " +"haute résolution" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Règle implicite trouvée pour « %s ».\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Pas de règle implicite trouvée pour « %s ».\n" + +#: remake.c:502 +#, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Utilisation de la recette par défaut pour « %s ».\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Dépendance circulaire %s <- %s abandonnée." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Fin des dépendances du fichier cible « %s ».\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Les dépendances de « %s » sont en cours de fabrication.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Abandon sur le fichier cible « %s ».\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "La cible « %s » n'a pas été refabriquée à cause d'erreurs." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Le prérequis « %s » est seulement d'ordre pour la cible « %s ».\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "La dépendance « %s » de la cible « %s » n'existe pas.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "La dépendance « %s » est plus récente que la cible « %s ».\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "La dépendance « %s » est plus ancienne que la cible « %s ».\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "La cible « %s » a un double deux-points et n'a pas de dépendance.\n" + +#: remake.c:765 +#, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Pas de recette pour « %s » et aucune dépendance n'a changé.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Fabrication de « %s » à cause de l'indicateur « always-make ».\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Inutile de refabriquer la cible « %s »." + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; utilisation du nom VPATH « %s »" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Il faut refabriquer la cible « %s ».\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " On ignore le nom VPATH « %s ».\n" + +#: remake.c:815 +#, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "La recette de « %s » est en cours d'exécution.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Échec de refabrication du fichier cible « %s ».\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Refabrication réussie du fichier cible « %s ».\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Le fichier cible « %s » a besoin d'être refabriqué avec l'option -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Utilisation des commandes par défaut pour « %s ».\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "" +"AVERTISSEMENT : le fichier « %s » a une date de modification dans le futur" + +#: remake.c:1370 +#, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "" +"AVERTISSEMENT : le fichier « %s » a une date de modification %s s dans le " +"futur" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "l'élément « %s » de .LIBPATTERNS n'est pas un motif" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "« customs » n'exportera pas : %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Règles Implicites" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Pas de règle implicite." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u règles implicites, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminales." + +#: rule.c:534 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ANOMALIE : num_pattern_rules est faux ! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "signal inconnu" + +#: signame.c:94 +msgid "Hangup" +msgstr "Raccroche" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Interrompt" + +#: signame.c:100 +msgid "Quit" +msgstr "Quitte" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Instruction non admise" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Point de trace/arrêt" + +#: signame.c:111 +msgid "Aborted" +msgstr "Annulé" + +#: signame.c:114 +msgid "IOT trap" +msgstr "Appel IOT" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Appel EMT" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Exception en virgule flottante" + +#: signame.c:123 +msgid "Killed" +msgstr "Tué" + +#: signame.c:126 +msgid "Bus error" +msgstr "Erreur de bus" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Erreur de segmentation" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Mauvais appel système" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Tube cassé" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Alarme" + +#: signame.c:141 +msgid "Terminated" +msgstr "Terminé" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Signal utilisateur 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Signal utilisateur 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Processus fils terminé" + +#: signame.c:158 +msgid "Power failure" +msgstr "Coupure d'alimentation" + +#: signame.c:161 +msgid "Stopped" +msgstr "Arrêté" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Arrêté (entrée tty)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Arrêté (sortie tty)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Arrêté (signal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Limite du temps CPU dépassée" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Limite de taille de fichier dépassée" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Compteur virtuel expiré" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Compteur de profiling expiré" + +#: signame.c:188 +msgid "Window changed" +msgstr "Fenêtre modifiée" + +#: signame.c:191 +msgid "Continued" +msgstr "Reprise" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Condition d'E/S urgente" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "E/S possible" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Ressource perdue" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Signal de danger" + +#: signame.c:219 +msgid "Information request" +msgstr "Demande d'informations" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Coprocesseur en virgule flottante non disponible" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s nombre de chaines dans strcache: %d / lookups = %lu / hits = %lu\n" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s nombre de tampons strcache : %d (* %d B/buffer = %d B)\n" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s strcache utilisé : total = %d (%d) / max = %d / min = %d / moy = %d\n" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s strcache libre : total = %d (%d) / max = %d / min = %d / moy = %d\n" + +#: strcache.c:244 +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# stats des tables de hachage strcache :\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "défaut" + +#: variable.c:1544 +msgid "environment" +msgstr "environnement" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "environnement avec l'option -e" + +#: variable.c:1553 +msgid "command line" +msgstr "ligne de commande" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "directive « override »" + +#: variable.c:1559 +msgid "automatic" +msgstr "automatique" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (depuis « %s », ligne %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# stats des tables de hachage de la variable « set » :\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valeurs de variable spécifiques au motif" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# pas de valeurs de variable spécifiques au motif" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valeurs de variable spécifiques au motif" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "AVERTISSEMENT : variable indéfinie « %.*s »" + +#: vmsfunctions.c:92 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() a échoué avec %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "AVERTISSEMENT : redirection vide\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "erreur interne : « %s » command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-warning, vous pourriez avoir besoin de réactiver le traitement de CTRL-Y " +"par DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "COMMANDE INTERNE [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "COMMANDE CD INTERNE %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "COMMANDE RM INTERNE %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Commande interne inconnue « %s »\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Erreur, commande vide\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Entrée redirigée depuis %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Erreur redirigée vers %s\n" + +#: vmsjobs.c:523 +#, c-format +msgid "Append output to %s\n" +msgstr "Sortie ajoutée à %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Sortie redirigée vers %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Ajoute %.*s et nettoie\n" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Exécution de %s à la place\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Erreur de lancement, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Chemins de Recherche VPATH\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Aucun chemin de recherche « vpath »." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u chemins de recherche « vpath ».\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Aucun chemin de recherche général (variable « VPATH »)." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Chemin de recherche général (variable « VPATH ») :\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() n'a pas pu lancer de processus (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sCeci est un logiciel libre ; consultez le code source pour connaître " +#~ "les conditions de copie.\n" +#~ "%sIl n'y a PAS de garantie ; ni pour une utilisation COMMERCIALE ni pour\n" +#~ "%sune ADÉQUATION À UN BESOIN PARTICULIER.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "« endef » superflu" + +#~ msgid "empty `override' directive" +#~ msgstr "directive « override » vide" + +#~ msgid "invalid `override' directive" +#~ msgstr "directive « override » incorrecte" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-warning, CTRL-Y va laisser des sous-processsus dans la nature.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Ne pas spécifier -j ou --jobs si sh.exe n'est pas disponible." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Réinitialisation de make en mode de traitement simple des tâches." + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Erreur de syntaxe, toujours à l'intérieur de « \" »\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "" +#~ "Réception du signal SIGCHLD ; %u processus fils dont le statut de\n" +#~ "sortie n'a pas été récupé.\n" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "pas de nom de fichier pour « %sinclude »" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "la cible « %s » a laissé un schéma de dépendance vide" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Pas de fichiers." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u fichiers dans %u tables de hachage.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# moyenne de %.3f fichiers par table, maximum de %u fichiers dans une " +#~ "table.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "RÉPERTOIRE" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Changer de RÉPERTOIRE avant de faire quoi que ce soit" + +#~ msgid "FLAGS" +#~ msgstr "FANIONS" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Suspension de processus pour permettre au déboggeur de se rattacher" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "" +#~ "Les variables d'environnement écrasent celles définies dans les makefiles" + +#~ msgid "FILE" +#~ msgstr "FICHIER" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Lit FICHIER en tant que makefile" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Recherche les makefiles inclus dans DIRECTORY" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "N'exécute pas de tâches multiples si la charge dépasse N" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "N'exécute pas les commandes ; elles sont juste affichées" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "Considère FILE comme étant très vieux et ne le refabrique pas" + +#~ msgid "Don't echo commands" +#~ msgstr "N'affiche pas les commandes" + +#~ msgid "Turns off -k" +#~ msgstr "Désactive -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Considère FILE comme étant infiniment récent" + +#~ msgid "Entering" +#~ msgstr "Entre dans" + +#~ msgid "Leaving" +#~ msgstr "Quitte" + +#~ msgid "# No variables." +#~ msgstr "# Pas de variables." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# moyenne de %.1f variables par table, maximum de %u dans une table.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# moyenne de %d.%d variables par table, maximum de %u dans une table.\n" + +#~ msgid "Error in lbr$ini_control, %d\n" +#~ msgstr "Erreur dans lbr$ini_control, %d\n" + +#~ msgid "Error looking up module %s in library %s, %d\n" +#~ msgstr "Erreur en recherchant le module %s dans la bibliothèque %s, %d\n" + +#~ msgid "Error getting module info, %d\n" +#~ msgstr "Erreur lors de l'obtention des informations du module, %d\n" + +#~ msgid "touch: " +#~ msgstr "touch: " + +#~ msgid " not" +#~ msgstr " non" + +#~ msgid "# Last modified %.24s (%0lx)\n" +#~ msgstr "# Dernière modification %.24s (%0lx)\n" + +#~ msgid "undefined" +#~ msgstr "indéfini" + +#~ msgid "file" +#~ msgstr "fichier" + +#~ msgid "environment override" +#~ msgstr "écrasement par l'environnement" + +#~ msgid "override" +#~ msgstr "écrasement" + +#~ msgid "the `word' function takes a one-origin index argument" +#~ msgstr "la fonction `word' prend un argument d'index à une seule origine" + +#~ msgid "implicit" +#~ msgstr "dépendance implicite" + +#~ msgid "rule" +#~ msgstr "règle de dépendance" + +#~ msgid "Trying %s dependency `%s'.\n" +#~ msgstr "Essai de la %s `%s'.\n" + +#~ msgid "Found dependency as `%s'.%s\n" +#~ msgstr "Dépendance trouvée en tant que `%s'.%s\n" + +#~ msgid "intermediate" +#~ msgstr "intermédiaire" + +#~ msgid " (ignored)" +#~ msgstr " (ignorée)" + +#~ msgid "Unknown%s job %d" +#~ msgstr "Tâche%s inconnue %d" + +#~ msgid " remote" +#~ msgstr " distante" + +#~ msgid "%s finished." +#~ msgstr "%s terminée." + +#~ msgid "losing" +#~ msgstr "perdant" + +#~ msgid "winning" +#~ msgstr "gagnant" + +#~ msgid "%sGNU Make version %s" +#~ msgstr "%sGNU Make version %s" + +#~ msgid "Unknown error 12345678901234567890" +#~ msgstr "Erreur inconnue 12345678901234567890" + +#~ msgid "User" +#~ msgstr "utilisateur" + +#~ msgid "Make" +#~ msgstr "make" + +#~ msgid "Child" +#~ msgstr "enfant" + +#~ msgid "Dependency `%s' does not exist.\n" +#~ msgstr "La dépendance `%s' n'existe pas.\n" + +#~ msgid "newer" +#~ msgstr "plus récente" + +#~ msgid "older" +#~ msgstr "plus ancienne" + +#~ msgid "exporting: Couldn't create return socket." +#~ msgstr "exportation : N'a pas pu créer la socket de retour." + +#~ msgid "exporting: " +#~ msgstr "exportation : " + +#~ msgid "exporting: %s" +#~ msgstr "exportation : %s" + +#~ msgid "Job exported to %s ID %u\n" +#~ msgstr "Tâche exportée vers %s ID %u\n" + +#~ msgid "Error getting load average" +#~ msgstr "Erreur lors de l'obtention de la charge moyenne" + +#~ msgid "1-minute: %f " +#~ msgstr "1 minute : %f " + +#~ msgid "5-minute: %f " +#~ msgstr "5 minutes : %f " + +#~ msgid "15-minute: %f " +#~ msgstr "15 minutes : %f " + +#~ msgid "digits occur in two different argv-elements.\n" +#~ msgstr "des chiffres apparaissent dans deux éléments différents de argv.\n" + +#~ msgid "option %c\n" +#~ msgstr "option %c\n" + +#~ msgid "option a\n" +#~ msgstr "option a\n" + +#~ msgid "option b\n" +#~ msgstr "option b\n" + +#~ msgid "option c with value `%s'\n" +#~ msgstr "option c ayant pour valeur `%s'\n" + +#~ msgid "?? getopt returned character code 0%o ??\n" +#~ msgstr "?? getopt a renvoyé le caractère de code 0%o ??\n" + +#~ msgid "non-option ARGV-elements: " +#~ msgstr "éléments de ARGV qui ne sont pas des options : " + +#~ msgid "option d with value `%s'\n" +#~ msgstr "option d ayant pour valeur `%s'\n" + +#~ msgid "%s: unknown signal" +#~ msgstr "%s : signal inconnu" + +#~ msgid "Signal 12345678901234567890" +#~ msgstr "Signal 12345678901234567890" + +#~ msgid "Signal %d" +#~ msgstr "Signal %d" diff --git a/po/ga.gmo b/po/ga.gmo new file mode 100644 index 0000000..94495a8 Binary files /dev/null and b/po/ga.gmo differ diff --git a/po/ga.po b/po/ga.po new file mode 100644 index 0000000..281f8f9 --- /dev/null +++ b/po/ga.po @@ -0,0 +1,2075 @@ +# Irish translations for make. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Kevin Patrick Scannell , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2006-04-22 16:02-0500\n" +"Last-Translator: Kevin Patrick Scannell \n" +"Language-Team: Irish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "rinneadh iarracht ar ghné gan tacaíocht a úsáid: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "ní féidir ball cartlainne a `touch'áil ar VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: Níl an chartlann `%s' ann" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: Níl `%s' ina cartlann bhailí" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: Níl a leithéid de bhall `%s' i `%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: Droch-chód aisfhillidh ó ar_member_touch ar `%s'" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"níorbh fhéidir le lbr$set_module an t-eolas modúil a bhaint amach, stádas = %" +"d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "theip ar lbr$ini_control le stádas = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "" +"ní féidir leabharlann `%s' a oscailt chun cuardach a dhéanamh ar an mball `%" +"s'" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Ball `%s'%s: %ld beart ag %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (is féidir go bhfuil an t-ainm teasctha)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Dáta %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mód = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Briseadh.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Is féidir gur ball bréige é `%s'; ní scriosadh" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Is féidir gur ball bréige é `%s'; ní scriosadh" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Comhad `%s' á scriosadh" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Comhad `%s' á scriosadh" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# orduithe le rith" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (insuite):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (ó `%s', líne %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Comhadlanna\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: níorbh fhéidir é a stat.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (eochair %s, am-m %d): ní féidir é a oscailt.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (gléas %d, i-nód [%d,%d,%d]): ní féidir é a oscailt.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (gléas %ld, i-nód %ld): níorbh fhéidir é a oscailt.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (eochair %s, am-m %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (gléas %d, i-nód [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (gléas %ld, i-nód %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Ná Déan" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " comhad, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "níl" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " rudaí neamhfhéideartha" + +#: dir.c:1075 +msgid " so far." +msgstr " go dtí seo." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " rudaí neamhfhéideartha i %lu comhadlann.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Déanann an athróg athchúrsach `%s' tagairt dó féin (sa deireadh)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "tagairt athróige gan chríochnú" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Sonraíodh orduithe le haghaidh comhaid `%s' ag %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" +"Aimsíodh orduithe le haghaidh `%s' trí chuardach ar rialacha intuigthe," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "ach anois is ionann iad na comhaid `%s' agus `%s'." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "" +"Déanfar neamhshuim ar orduithe le haghaidh `%s'; úsáidfear na cinn le " +"haghaidh `%s' ina n-ionad." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" +"ní féidir idirstad aonair `%s' a athainmnigh le hidirstad dúbailte `%s'" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "ní féidir idirstad dúbailte `%s' a athainmniú le hidirstad aonair `%s'" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Comhad idirmheánach `%s' á scriosadh" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Comhaid idirmheánacha á mbaint...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Stampa ama as raon; %s á úsáid ina ionad" + +#: file.c:804 +msgid "Current time" +msgstr "An t-am anois" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Ní sprioc é:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Comhad luachmhar (réamhriachtanas de .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Sprioc bhréige (réamhriachtanas de .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Sprioc líne na n-orduithe." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Makefile réamhshocraithe, nó ó MAKEFILES, nó -include/sinclude." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Rinneadh cuardach ar rialacha intuigthe." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Ní dhearna cuardach ar rialacha intuigthe." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Stoc patrúin intuigthe/statach: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Tá an comhad ina réamhriachtanas idirmheánach." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Déantar fosta:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Níor seiceáladh an t-am mionathraithe riamh." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Níl a leithéid de chomhad ann." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Is cianaosta an comhad seo." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Athraithe %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Nuashonraíodh an comhad." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Níor nuashonraíodh an comhad." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Tá orduithe ann atá ag rith faoi láthair (IS FABHT É SEO)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Tá orduithe spleáchais ag rith (IS FABHT É SEO)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# D'éirigh leis an nuashonrú." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Tá gá le nuashonrú (-q ceaptha)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Theip ar nuashonrú." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Luach neamhbhailí sa bhall `update_status'!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Luach neamhbhailí sa bhall `command_state'!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Comhaid" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# comhaid hais-tábla stait:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "tá an chéad argóint neamhuimhriúil leis an fheidhm `word'" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "caithfidh an chéad argóint leis an fheidhm `word' a bheith deimhneach" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "is neamhuimhriúil í an chéad argóint leis an fheidhm `wordlist'" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "is neamhuimhriúil í an dara hargóint leis an fheidhm `wordlist'" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: theip ar DuplicateHandle(In) (e=%ld)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: theip ar DuplicateHandle(Earr) (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "Theip ar CreatePipe() (e=%ld)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): theip ar process_init_fd()\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Baisc-chomhad sealadach %s á ghlanadh\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "easpa argóintí (%d) d'fheidhm `%s'" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "níl an fheidhm `%s' ar fáil ar an chóras seo" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "glao ar fheidhm `%s' gan chríochnú: `%c' ar iarraidh" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: Tá an rogha `%s' débhríoch\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha `--%s'\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha `%c%s'\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: tá argóint de dhíth i ndiaidh na rogha `%s'\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: rogha anaithnid `--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: rogha anaithnid `%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: rogha neamhcheadaithe -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: rogha neamhbhailí -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: tá argóint de dhíth i ndiaidh na rogha -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: Tá an rogha `-W %s' débhríoch\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha `-W %s'\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "ní féidir %ld beart a dháileadh le haghaidh hais-tábla: cuimhne ídithe" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Lód=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Ath-haiseáil=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Tuairteanna haiseála=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Ag déanamh cuardach ar riail intuigthe le haghaidh `%s'.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "" +"Ag déanamh cuardach ar riail intuigthe le haghaidh bhall cartlainne `%s'.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Athchúrsáil de bharr rialacha intuigthe á seachaint.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Ag baint triail as riail phatrúin le stoc `%.*s'.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Réamhriachtanas neamhfhéideartha rialach `%s' á dhiúltú.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Réamhriachtanas intuigthe neamhfhéideartha `%s' á dhiúltú.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Ag baint triail as an réamhriachtanas rialach `%s'.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Ag baint triail as an réamhriachtanas intuigthe `%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Aimsíodh réamhriachtanas `%s' mar VPATH `%s'\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Ag déanamh cuardach ar riail le comhad idirmheánach `%s'.\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Ní féidir comhad sealadach a chruthú\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Earráid 0x%x (rinneadh neamhshuim air)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Earráid 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Earráid %d (rinneadh neamhshuim)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Earráid %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (córdhumpa)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Ag fanacht le jabanna neamhchríochnaithe..." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Mac beo 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (cianda)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Mac caillteach á bhaint: 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Mac buaiteach á bhaint: 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Baisc-chomhad sealadach %s á ghlanadh\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Mac 0x%08lx PID %ld%s á dhealú ón slabhra.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "scríobh jabfhreastalaí" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Saoradh ceadchomhartha le haghaidh mac 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "theip ar process_easy(); níor tosaíodh próiseas (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"%d argóint sa tosú theipthe\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Ag cur mac 0x%08lx (%s) PID %ld%s ar an slabhra.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Fuarthas ceadchomhartha le haghaidh mac 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "léadh píopa na jabanna" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Níl gá leis an sprioc `%s' a athdhéanamh" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "ní féidir srianta lóid a chur i bhfeidhm ar an chóras oibriúcháin seo" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "ní féidir srian lóid a chur i bhfeidhm: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "níl aon hanla comhaid le fáil: níorbh fhéidir stdin a chóipeáil\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "níl aon hanla comhaid le fáil: níorbh fhéidir stdout a chóipeáil\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Níorbh fhéidir stdin a athchóiriú\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Níorbh fhéidir stdout a athchóiriú\n" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "ghin make mac le pid %ld, ag feitheamh le pid %ld fós\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Ní bhfuarthas an t-ordú" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Ní bhfuarthas an clár blaoisce" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: is féidir gur ídithe í cuimhne na timpeallachta" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "Athraíodh $SHELL (ba `%s' é, agus is `%s' é anois)\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Baisc-chomhad sealadach %s á chruthú\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (líne %d) Droch-chomhthéacs blaoisce (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Roghanna:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Déan neamhshuim (comhoiriúnacht)\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Déan gach sprioc, gan choinníollacha.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C COMHADLANN, --directory=COMHADLANN\n" +" Téigh go COMHADLANN roimh dhéanamh aon rud.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Taispeáin go leor eolas dífhabhtaithe.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=BRATACHA] Taispeáin eolas fabhtaithe de chineálacha " +"éagsúla.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Sáraíonn athróga timpeallachta makefileanna.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f COMHAD, --file=COMHAD, --makefile=COMHAD\n" +" Léigh COMHAD mar makefile.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Taispeáin an chabhair seo agus scoir.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Déan neamhshuim ar earráidí ó orduithe.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I COMHADLANN, --include-dir=COMHADLANN\n" +" Cuardaigh i gCOMHADLANN ar makefileanna " +"breise.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Ceadaigh N jab le chéile; éigríoch mura " +"gceaptar arg.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Lean ar aghaidh fiú nach féidir sprioc a " +"dhéanamh.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Ná tosaigh jabanna iomadúla mura bhfuil an lód " +"níos lú ná N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Úsáid an t-am modhnaithe is déanaí, ar an " +"nasc\n" +" siombalach nó ar an sprioc.\n" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Ná rith aon ordú; taispeáin torthaí mar dhea " +"amháin.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o COMHAD, --old-file=COMHAD, --assume-old=COMHAD\n" +" Caith le COMHAD mar cheann cianaosta; ná " +"hathdhéan é.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Taispeáin an bunachar sonraí inmheánach.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Ná rith aon ordú; stádas scortha = 0 mura gá " +"le nuashonrú.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Díchumasaigh na rialacha intuigthe insuite.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables Díchumasaigh na hathróga insuite.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ná déan macalla ar orduithe.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Múch -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Teagmhaigh spriocanna in ionad iad a " +"athdhéanamh.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Taispeáin eolas faoin leagan agus scoir.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Taispeáin an chomhadlann reatha.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Múch -w, fiú má tá sé i bhfeidhm go " +"hintuigthe.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W COMHAD, --what-if=COMHAD, --new-file=COMHAD, --assume-new=COMHAD\n" +" Caith le COMHAD mar cheann úrnua (go " +"héigríoch).\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Tabhair rabhadh má dhéantar tagairt d'athróg " +"gan sainmhíniú.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "ní féidir teaghrán folamh a úsáid mar ainm comhaid" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "sonrú anaithnid `%s' ar an leibhéal dífhabhtaithe" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Fuarthas idirbhriseadh/eisceacht (cód = 0x%lx, seoladh = 0x%lx)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Glaodh scagaire eisceachta gan láimhseáil ón chlár %s\n" +"CódEisceachta = %lx\n" +"BratachaEisceachta = %lx\n" +"SeoladhEisceachta = %lx\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Sárú rochtana: oibríocht scríofa ag seoladh %lx\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Sárú rochtana: oibríocht léimh ag seoladh %lx\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "tá find_and_set_shell ag socrú default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "shocraigh find_and_set_shell conair chuardaigh default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "cuirfear %s ar fionraí ar feadh tréimhse 30 soicind..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) críochnaithe. Ag gabháil ar aghaidh.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Sonraíodh Makefile ón ionchur caighdeánach faoi dhó." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (comhad sealadach)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (comhad sealadach)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Níl jabanna parailéalacha (-j) ar fáil ar an gcóras seo." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Á athshocrú le haghaidh jabanna aonair (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "earráid inmheánach: roghanna --jobserver-fds iomadúla" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "earráid inmheánach: teaghrán neamhbhailí --jobserver-fds `%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "rabhadh: -jN fórsáilte i bhfo-make: mód jabfhreastalaí á dhíchumasú." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "jabfhreastalaí dup" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"rabhadh: níl jabfhreastalaí ar fáil: ag baint úsáid as -j1. Cuir `+' leis " +"an máthair-riail." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "píopa na jabanna á chruthú" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "píopa an jabfhreastalaí á thúsú" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "ní thacaítear le naisc shiombalacha: -L á dhíchumasú." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Makefileanna á nuashonrú....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "is féidir go lúbfar an Makefile `%s'; ní athdhéanfar é.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Theip ar athdhéanamh an makefile `%s'." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Níor aimsíodh an makefile `%s' san áireamh." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Níor aimsíodh an makefile `%s'" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Níorbh fhéidir an chomhadlann oibre a athrú ar ais." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Á rith arís[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (comhad sealadach): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "tá níos mó ná aon sprioc amháin i .DEFAULT_GOAL" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Níor sonraíodh aon sprioc agus níor aimsíodh aon makefile" + +#: main.c:2272 +msgid "No targets" +msgstr "Níl aon sprioc ann" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Cinn sprice á nuashonrú....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "rabhadh: Clog ar sceabha. Is féidir go bhfuil an tógáil neamhiomlán." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Úsáid: %s [roghanna] [sprioc] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Tógadh an clár seo le haghaidh %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Tógadh an clár seo le haghaidh %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Seol tuairiscí fabhtanna chuig \n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "caithfidh tú teaghrán nach folamh a thabhairt mar argóint le `-%c'" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "caithfidh tú slánuimhir dheimhneach a thabhairt mar argóint le `-%c'" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sTógadh an clár seo le haghaidh %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sTógadh an clár seo le haghaidh %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Bunachar sonraí Make, priontáilte ar %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Críochnaíodh an bunachar sonraí Make seo ar %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Ag dul isteach i gcomhadlann anaithnid\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Ag dul amach as comhadlann anaithnid\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Ag dul isteach sa chomhadlann `%s'\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Ag dul amach as an gcomhadlann `%s'\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Ag dul isteach i gcomhadlann anaithnid\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Ag dul amach as comhadlann anaithnid\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Ag dul isteach sa chomhadlann `%s'\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Ag dul amach as an gcomhadlann `%s'\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Stop.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Earráid anaithnid %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "cuimhne fhíorúil ídithe" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: úsáideoir %lu (fíor %lu), grúpa %lu (fíor %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Rochtain túsaithe" + +#: misc.c:808 +msgid "User access" +msgstr "Rochtain úsáideora" + +#: misc.c:856 +msgid "Make access" +msgstr "Rochtain make" + +#: misc.c:890 +msgid "Child access" +msgstr "Rochtain mic" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "earráid sa scríobh: %s" + +#: misc.c:956 +msgid "write error" +msgstr "earráid sa scríobh" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Makefileanna á léamh...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Makefile `%s' á léamh" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (gan ceann sprice réamhshocraithe)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (conair chuardaigh)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (is cuma)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ná fairsing ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "comhréir neamhbhailí i gcoinníollach" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "tá orduithe ann roimh an chéad sprioc" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "riail ar iarraidh roimh orduithe" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "deighilteoir%s ar iarraidh" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (Ar mhian leat TÁB in ionad ocht spás?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "patrún sprice ar iarraidh" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "patrúin iomadúla sprice" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "níl aon `%%' sa phatrún sprice" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "`endif' ar iarraidh" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "ainm folamh athróige" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Téacs gan mhaith i ndiaidh treorach `endef'" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "`endef' ar iarraidh, `define' gan chríochnú" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Téacs gan mhaith i ndiaidh treorach `endef'" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Téacs gan mhaith i ndiaidh treorach `%s'" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "`%s' breise" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "ní cheadaítear ach aon `else' amháin le gach coinníollach" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Is míchumtha é an sainmhíniú athróige (le haghaidh aon sprioc amháin)" + +#: read.c:1855 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "ní féidir réamhriachtanais a shonrú i scripteanna ordaithe" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "rialacha intuigthe agus rialacha statacha measctha le chéile" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "rialacha intuigthe agus gnáthrialacha measctha le chéile" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "níl an sprioc `%s' comhoiriúnach leis an phatrún sprice" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "tá iontrálacha : agus :: araon ann don chomhad sprice `%s'" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "tá an sprioc `%s' i riail amháin níos mó ná uair amháin." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "rabhadh: ag sárú na n-orduithe le haghaidh na sprice `%s'" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "" +"rabhadh: ag déanamh neamhshuim ar sheanorduithe le haghaidh sprice `%s'" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" +"rabhadh: chonacthas carachtar NUL; ag déanamh neamhshuim ar an chuid eile " +"den líne" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Níl faic le déanamh i gcomhair `%s'." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "Níl gá le `%s' a nuashonrú." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Comhad `%s' á bhearradh.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sNíl aon riail chun an sprioc `%s' a dhéanamh%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "" +"%sNíl aon riail chun an sprioc `%s' a dhéanamh, riachtanach le haghaidh `%s'%" +"s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Comhad sprice `%s' idir lámha.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "" +"Rinneadh iarracht ar an chomhad `%s' a nuashonrú le déanaí, agus theip air.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Rinneadh scrúdú ar an chomhad `%s' cheana.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Comhad `%s' á nuashonrú fós.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Nuashonraíodh an comhad `%s'.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Níl a leithéid de chomhad `%s' ann.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Warning: comhad .LOW_RESOLUTION_TIME `%s' le stampa ama ardtaifeach" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Aimsíodh riail intuigthe le haghaidh `%s'.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Níor aimsíodh aon riail intuigthe le haghaidh `%s'.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Ag baint úsáid as orduithe réamhshocraithe le haghaidh `%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Tréigeadh an spleáchas ciorclach %s <- %s." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Críochnaíodh na réamhriachtanais den chomhad sprice `%s'.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Réamhriachtanais de `%s' á ndéanamh anois.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Ag tréigean an chomhaid sprice `%s'.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Ní dhearna an sprioc `%s' arís ós rud é go bhfuil earráidí ann." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "" +"Sonraíonn an réamhriachtanas `%s' ord rite amháin le haghaidh sprice `%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Níl an réamhriachtanas `%s' den sprioc `%s' ann.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Tá an réamhriachtanas `%s' níos nuaí ná an sprioc `%s'.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Tá an réamhriachtanas `%s' níos sine ná an sprioc `%s'.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Tá dhá idirstad ag an sprioc `%s' agus níl aon réamhriachtanas aice.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "" +"Níl aon ordú le haghaidh `%s' agus níor athraigh aon réamhriachtanas.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "`%s' á dhéanamh de bharr bratach --always-make.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Níl gá leis an sprioc `%s' a athdhéanamh" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; ag baint úsáid as ainm VPATH `%s'" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Caithfidh an sprioc `%s' a athdhéanamh.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Ag déanamh neamhshuim ar ainm VPATH `%s'.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Orduithe de `%s' á rith.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Theip ar athdhéanamh an sprioc-chomhaid `%s'.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "D'éirigh le hathdhéanamh an sprioc-chomhaid `%s'.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Tá gá leis an chomhad sprice `%s' a athdhéanamh leis an rogha -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Ag baint úsáid as orduithe réamhshocraithe le haghaidh `%s'.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Rabhadh: Tá an t-am mionathraithe den chomhad `%s' sa todhchaí" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "" +"Rabhadh: Tá an t-am mionathraithe den chomhad `%s' %.2g soicind sa todhchaí" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "Níl eilimint .LIBPATTERNS `%s' ina patrún" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Ní easpórtálfar Customs: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Rialacha Intuigthe" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Níl aon riail intuigthe." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u riail intuigthe, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " teirminéal." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FABHT: num_pattern_rules mícheart! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "comhartha anaithnid" + +#: signame.c:94 +msgid "Hangup" +msgstr "Croch suas" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Idirbhriseadh" + +#: signame.c:100 +msgid "Quit" +msgstr "Scoir" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Treoir Neamhcheadaithe" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Rianaigh/brisphointe" + +#: signame.c:111 +msgid "Aborted" +msgstr "Tobscortha" + +#: signame.c:114 +msgid "IOT trap" +msgstr "Gaiste IOT" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Gaiste EMT" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Eisceacht snámhphointe" + +#: signame.c:123 +msgid "Killed" +msgstr "Maraithe" + +#: signame.c:126 +msgid "Bus error" +msgstr "Busearráid" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Fabht deighilte" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Drochghlao ar an gcóras" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Píopa briste" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Clog aláraim" + +#: signame.c:141 +msgid "Terminated" +msgstr "Scortha" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Comhartha saincheaptha 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Comhartha saincheaptha 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Scoir an mhacphróiseas" + +#: signame.c:158 +msgid "Power failure" +msgstr "Cliseadh cumhachta" + +#: signame.c:161 +msgid "Stopped" +msgstr "Stoptha" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Stoptha (ionchur tty)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Stoptha (aschur tty)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Stoptha (comhartha)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Teorainn ama LAP sáraithe" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Uasmhéid na gcomhad sáraithe" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Am fíorúil caite" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Am próifíle caite" + +#: signame.c:188 +msgid "Window changed" +msgstr "Athraíodh an fhuinneog" + +#: signame.c:191 +msgid "Continued" +msgstr "Leanta" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Staid phráinneach A/I" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "A/I indéanta" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Acmhainn caillte" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Comhartha guaise" + +#: signame.c:219 +msgid "Information request" +msgstr "Iarratas ar eolas" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Níl comhphróiseálaí snámhphointe ar fáil" + +#: strcache.c:235 +#, fuzzy, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s líon na dteaghrán i strcache: %d\n" + +#: strcache.c:237 +#, fuzzy, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s líon na maolán strcache: %d\n" + +#: strcache.c:239 +#, fuzzy, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s méid strcache: iomlán = %d / uas = %d / íos = %d / meán = %d\n" + +#: strcache.c:241 +#, fuzzy, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s strcache saor: iomlán = %d / uas = %d / íos = %d / meán = %d\n" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# comhaid hais-tábla stait:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "réamhshocraithe" + +#: variable.c:1544 +msgid "environment" +msgstr "timpeallacht" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "timpeallacht le -e" + +#: variable.c:1553 +msgid "command line" +msgstr "líne na n-orduithe" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "treoir `override'" + +#: variable.c:1559 +msgid "automatic" +msgstr "uathoibríoch" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (ó `%s', líne %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# athróg tacar hais-tábla stait:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Athróga\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Luachanna Athróige sainiúil don phatrún" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Níl aon luach athróige atá sainiúil don phatrún." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u luach athróige atá sainiúil don phatrún" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "rabhadh: athróg gan sainmhíniú: `%.*s'" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "Theip ar sys$cuardach le %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Rabhadh: Atreorú folamh\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "earráid inmheánach: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-rabhadh, is féidir gur gá duit ionramháil CTRL-Y a athchumasú ó DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "INSUITE [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD INSUITE %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "RM INSUITE %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Ordú anaithnid insuite '%s'\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Earráid, ordú folamh\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Atreoraíodh ionchur ó %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Atreoraíodh earráidí go %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Atreoraíodh aschur go %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Atreoraíodh aschur go %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s á rith ina áit\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Earráid le linn sceitheadh, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Conairí Cuardaigh\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Níl aon chonair chuardaigh `vpath'." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u conair chuardaigh `vpath'.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Níl aon chonair ghinearálta cuardaigh (athróg `VPATH')." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Conair ghinearálta cuardaigh (athróg `VPATH'):\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "theip ar process_easy(); níor tosaíodh próiseas (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sIs saorbhogearra an ríomhchlár seo; féach ar an bhunchód le haghaidh\n" +#~ "%scoinníollacha cóipeála. Níl baránta ar bith ann; go fiú níl baránta " +#~ "ann\n" +#~ "%sd'INDÍOLTACHT nó FEILIÚNACHT D'FHEIDHM AR LEITH.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "`endef' breise" + +#~ msgid "empty `override' directive" +#~ msgstr "treoir `override' folamh" + +#~ msgid "invalid `override' directive" +#~ msgstr "treoir neamhbhailí `override'" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-rabhadh, fágfaidh CTRL-Y fo-phróisis gan ghlanadh.\n" diff --git a/po/gl.gmo b/po/gl.gmo new file mode 100644 index 0000000..c3ec093 Binary files /dev/null and b/po/gl.gmo differ diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..a4cabbc --- /dev/null +++ b/po/gl.po @@ -0,0 +1,2365 @@ +# Galician translation of GNU make. +# Copyright (C) 2000, 2002 Free Software Foundation, Inc. +# Jacobo Tarrio , 2000, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.80\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2002-10-05 14:46+0200\n" +"Last-Translator: Jacobo Tarrio \n" +"Language-Team: Galician \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "tentouse usar unha característica non soportada: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "a operación de tocar un membro do arquivo non está dispoñible en VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: O arquivo `%s' non existe" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: `%s' non é un arquivo válido" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: O membro `%s' non existe en `%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: Código de retorno incorrecto de ar_member_touch en `%s'" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"a chamada a lbr$set_module non puido extrae-la información do módulo, status " +"= %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "a chamada a lbr$ini_control fallou con status = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "non se pode abri-la biblioteca `%s' para busca-lo membro `%s'" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Membro `%s'%s: %ld bytes en %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (o nome pode quedar truncado)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modo = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Interrompido.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] O membro do arquivo `%s' pode non ser correcto; non borrado" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** O membro do arquivo `%s' pode non ser correcto; non borrado" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Borrando o ficheiro `%s'" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Borrando o ficheiro `%s'" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# comandos para executar" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (incluidas):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (de `%s', liña %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directorios\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: non se puido face-la operación de stat.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (clave %s, mtime %d): non se puido abrir.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): non se puido abrir.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (dispositivo %ld, inode %ld): non se puido abrir.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (clave %s, mtime %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (dispositivo %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Non" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " ficheiros, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "non" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " imposibles" + +#: dir.c:1075 +msgid " so far." +msgstr " ata aquí." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " imposibles en %lu directorios.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "A variable recursiva `%s' fai referencia a si mesma (ao final)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "referencia a variable non rematada" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Especificáronse comandos do ficheiro `%s' en %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" +"Atopáronse os comandos do ficheiro `%s' por busca de regras implícitas," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "pero agora considérase que `%s' é o mesmo ficheiro que `%s'." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "Os comandos de `%s' serán ignorados en favor dos de `%s'." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "non se pode renomear `%s' con dous puntos a `%s' con catro puntos" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "non se pode renomear `%s' con catro puntos a `%s' con dous puntos" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Borrando o ficheiro intermedio `%s'" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Borrando os ficheiros intermedios...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Marca de tempo fóra de rango; substituíndo %s" + +#: file.c:804 +msgid "Current time" +msgstr "Hora actual" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Non é un obxectivo:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Ficheiro precioso (prerrequisito de .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Obxectivo falso (prerrequisito de .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Obxectivo da liña de comando." + +#: file.c:935 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Un ficheiro de make por defecto ou de MAKEFILES." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Fíxose a busca de regras implícitas." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Non se fixo a busca de regras implícitas." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Raiz do patrón implícito/estático: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# O ficheiro é un prerrequisito intermedio." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Tamén se fai:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Nunca se comprobou o tempo de modificación." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# O ficheiro non existe." + +#: file.c:956 +msgid "# File is very old." +msgstr "# O ficheiro é moi antigo." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Última modificación: %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# O ficheiro foi actualizado." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# O ficheiro non foi actualizado." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Comandos que se están a executar agora (ISTO É UN ERRO)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Comandos de dependencias que se están a executar (ISTO É UN ERRO)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Actualizado con éxito." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Ten que ser actualizado (-q está estabrecido)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Non se puido actualizar." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# ¡Valor non válido no membro `update_status'!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# ¡Valor non válido no membro `command_state'!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Ficheiros" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# estatísticas da táboa hash de ficheiros:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "primeiro argumento da función `word' non numérico" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "o primeiro argumento da función `word' debe ser maior que 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "primeiro argumento da función `wordlist' non numérico" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "segundo argumento da función `wordlist' non numérico" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "process_easy: a chamada a DuplicateHandle(In) fallou (e=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "process_easy: a chamada a DuplicateHandle(Err) fallou (e=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "A chamada a CreatePipe() fallou (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): a chamada a process_init_fd() fallou\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Limpando o ficheiro de lotes temporal %s\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "Número de argumentos insuficiente (%d) na chamada á función `%s'" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "Non implementada nesta plataforma: función `%s'" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "chamada á función `%s' non rematada: falla `%c'" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: a opción `%s' é ambigua\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: a opción `--%s' non admite un argumento\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: a opción `%c%s' non admite un argumento\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: a opción `%s' precisa dun argumento\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opción `--%s' non recoñecida\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opción `%c%s' non recoñecida\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción non válida -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción non válida -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: a opción precisa dun argumento -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: a opción `-W %s' é ambigua\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: a opción `-W %s' non admite un argumento\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "non se poden reservar %ld bytes para a táboa hash: memoria esgotada" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Carga=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Colisións=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Buscando unha regra implícita para `%s'.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Buscando unha regra implícita membro do arquivo para `%s'.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitando a recursión de regras implícitas.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Probando a regra de patrón con raiz `%.*s'.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Rexeitando o prerrequisito imposible `%s'.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Rexeitando o prerrequisito implícito imposible `%s'.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Probando o prerrequisito `%s'.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Probando o prerrequisito implícito `%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Atopouse a o prerrequisito `%s' coma VPATH `%s'\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Buscando unha regra co ficheiro intermedio `%s'.\n" + +#: job.c:335 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (ficheiro temporal)" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Erro 0x%x (ignorado)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Erro 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Erro %d (ignorado)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Erro %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (memoria envorcada)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Agardando por traballos non rematados...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Proceso fillo vivo 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (remoto)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Colleitando o proceso fillo perdedor 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Colleitando o proceso fillo gañador 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Limpando o ficheiro de lotes temporal %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Eliminando o proceso fillo 0x%08lx PID %ld%s da cadea.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "write jobserver" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Liberouse un elemento para o proceso fillo 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() non puido lanza-lo proceso (e=%d)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Contáronse %d argumentos no lanzamento que fallou\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Poñendo o proceso fillo 0x%08lx (%s) PID %ld%s na cadea.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Obtívose un elemento para o proceso fillo 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "lectura do cano de traballos" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Non é preciso reface-lo obxectivo `%s'" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "non se poden impoñer límites de carga neste sistema operativo" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "non se pode impoñer un límite de carga: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"make colleitou un proceso fillo de pid %d, ainda se agarda polo pid %d\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Comando non atopado" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Intérprete de comandos non atopado" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, fuzzy, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "O valor de $SHELL cambiou (antes era `%s', agora `%s')" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Creando un ficheiro por lotes temporal %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (liña %d) Contexto do intérprete de comandos incorrecto (!unixy && !" +"batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Opcións:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorado por compatibilidade.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Facer tódolos obxectivos incondicionalmente.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORIO, --directory=DIRECTORIO\n" +" Cambiar ao DIRECTORIO antes de facer nada.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Amosar moita información de depuración.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=MODIFICADORES] Amosar varios tipos de información de " +"depuración.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" As variables de ambiente substitúen aos " +"ficheiros\n" +" de make.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FICHEIRO, --file=FICHEIRO, --makefile=FICHEIRO\n" +" Le-lo FICHEIRO coma ficheiro de make.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Amosar esta mensaxe e saír.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignora-los erros dos comandos.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIRECTORIO, --include-dir=DIRECTORIO\n" +" Busca-los ficheiros de make incluídos\n" +" no directorio.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Admitir N traballos á vez; infinitos sen\n" +" un argumento.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Continuar cando no se poidan facer\n" +" algúns obxectivos.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Non iniciar varios traballos con carga\n" +" superior a N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Non executar ningún comando; só amosalos.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o FICHEIRO, --old-file=FICHEIRO, --assume-old=FICHEIRO\n" +" Trata-lo FICHEIRO coma moi antigo e non " +"refacelo.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Amosa-la base de datos interna de make.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Non executar ningún comando; o estado de\n" +" saída di se está actualizado.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Desactiva-las regras implícitas incluidas.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Desactiva-los valores das variables " +"incluidos.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Non amosa-los comandos.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Desactiva -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Toca-los obxectivos no canto de os refacer.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Amosa-lo número de versión de make e saír.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Amosa-lo directorio actual.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Desactivar -w, incluso se se activou\n" +" implicitamente.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W FICHEIRO, --what-if=FICHEIRO, --new-file=FICHEIRO, --assume-" +"new=FICHEIRO\n" +" Trata-lo FICHEIRO coma infinitamente novo.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Avisar cando se faga referencia a\n" +" unha variable non definida.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "a cadea baleira non é válida coma nome de ficheiro" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "especificación de nivel de depuración descoñecido `%s'" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: Atrapouse unha Interrupción/Excepción (código = 0x%x, enderezo = 0x%x)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Filtro de excepcións non manexadas chamado dende o programa %s\n" +"ExceptionCode = %x\n" +"ExceptionFlags = %x\n" +"ExceptionAddress = %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Violación de acceso: operación de escritura no enderezo %x\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Violación de acceso: operación de lectura no enderezo %x\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell estabrecendo default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell busca de camiños estabrece default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s está suspendido durante 30 segundos..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "rematouse sleep(30). Continuando.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "O ficheiro de make da entrada estándar foi especificado dúas veces." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (ficheiro temporal)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (ficheiro temporal)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Os traballos en paralelo (-j) non están soportados nesta plataforma." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Reiniciando para entrar no modo de un traballo (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "erro interno: opcións --jobserver-fds múltiples" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "erro interno: cadea --jobserver-fds non válida `%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"aviso: -jN forzado no submake: desactivando o modo de servidor de traballos." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"aviso: o servidor de traballos non está dispoñible: usando -j1. Engada `+' á " +"regra do make pai." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "creando o cano de traballos" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "inicializa-lo cano do servidor de traballos" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Actualizando os ficheiros de make....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "O ficheiro de make `%s' podería causar un lazo; non se refai.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Non se puido reface-lo ficheiro de make `%s'." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Non se atopou o ficheiro de make incluido `%s'." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Non se atopou o ficheiro de make `%s'" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Non se puido voltar ao directorio orixinal." + +#: main.c:2102 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "Re-executando:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (ficheiro temporal)" + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Non se especificaron obxectivos e non se atopou un ficheiro de make" + +#: main.c:2272 +msgid "No targets" +msgstr "Non hai obxectivos" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Actualizando os obxectivos meta....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"aviso: Detectáronse inconsistencias de reloxo. A operación pode quedar " +"incompleta." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uso: %s [opcións] [obxectivo] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Este programa compilou para %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Este programa compilou para %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Informe dos erros no programa a .\n" +"Informe dos erros na traducción a .\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "a opción `-%c' precisa dun argumento integral positivo" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "a opción `-%c' precisa dun argumento integral positivo" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"Este programa compilou para %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"Este programa compilou para %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Base de datos de Make, imprimida en %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Base de datos de Make rematada en %s\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Entrando nun directorio descoñecido" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Saíndo dun directorio descoñecido" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Entrando no directorio `%s'\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Saíndo do directorio `%s'\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Entrando nun directorio descoñecido" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Saíndo dun directorio descoñecido" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Entrando no directorio `%s'\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Saíndo do directorio `%s'\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Detido.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Erro %d descoñecido" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "memoria virtual esgotada" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: usuario %lu (real %lu), grupo %lu (real %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Acceso inicializado" + +#: misc.c:808 +msgid "User access" +msgstr "Acceso de usuario" + +#: misc.c:856 +msgid "Make access" +msgstr "Acceso de make" + +#: misc.c:890 +msgid "Child access" +msgstr "Acceso de fillo" + +#: misc.c:954 +#, fuzzy, c-format +msgid "write error: %s" +msgstr "Erros redirixidos a %s\n" + +#: misc.c:956 +#, fuzzy +msgid "write error" +msgstr "write jobserver" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Lendo os ficheiros de make...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Lendo o ficheiro de make `%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (non hai un obxectivo por defecto)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (camiño de busca)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (non importa)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (non hai expansión de ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "sintaxe non válida no condicional" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "os comandos comezan antes do primeiro obxectivo" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "falla unha regra antes dos comandos" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "falla un separador%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (¿se cadra unha tabulación no canto de oito espacios?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "falla un patrón obxectivo" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "patróns de obxectivo múltiples" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "o patrón obxectivo non contén `%%'" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "falla `endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "nome de variable baleiro" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Texto superfluo trala directiva `endef'" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "falla `endef', `define' sen rematar" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Texto superfluo trala directiva `endef'" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Texto superfluo trala directiva `%s'" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "`%s' superfluo" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "só un `else' por condicional" + +#: read.c:1797 +#, fuzzy +msgid "Malformed target-specific variable definition" +msgstr "Definición dunha variable por obxectivo mal formada" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "regrás de patrón implícitas e estáticas mesturadas" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "regras implícitas e normais mesturadas" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "o obxectivo `%s' non coincide co patrón do obxectivo" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "o ficheiro obxectivo `%s' ten entradas : e ::" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "o obxectivo `%s' aparece máis dunha vez na mesma regra." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "aviso: ignorando os comandos do obxectivo `%s'" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "aviso: ignóranse os comandos antigos do obxectivo `%s'" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "aviso: viuse un carácter NUL; ignórase o resto da liña" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Non hai nada que facer para `%s'" + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s' está actualizado." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Podando o ficheiro `%s'.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sNon hai unha regra para face-lo obxectivo `%s'%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sNon hai unha regra para face-lo obxectivo `%s', que precisa `%s'%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Considerando o ficheiro obxectivo `%s'.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Hai pouco probouse a actualiza-lo ficheiro `%s' e non se puido.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "O ficheiro `%s' xa fora considerado.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Ainda se está actualizando o ficheiro `%s'.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Rematouse de actualiza-lo ficheiro `%s'.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "O ficheiro `%s' non existe.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Aviso: o ficheiro `%s' de .LOW_RESOLUTION_TIME ten unha marca de tempo " +"de alta resolución" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Atopouse unha regra implícita de `%s'.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Non se atopou unha regra implícita para `%s'.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Usando os comandos por defecto para `%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "A dependencia circular %s <- %s foi eliminada." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Rematáronse os prerrequisitos do ficheiro obxectivo `%s'.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Estan a se face-los prerrequisitos de `%s'.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Abandonando no ficheiro obxectivo `%s'.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Non se refai o obxectivo `%s' a causa dos erros." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "O prerrequisito `%s' é só-orde para o obxectivo `%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "O prerrequisito `%s' do obxectivo `%s' non existe.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "O prerrequisito `%s' é máis novo có obxectivo `%s'.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "O prerrequisito `%s' é máis vello có obxectivo `%s'.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "O obxectivo `%s' ten catro puntos e non ten prerrequisitos.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Non hai comandos de `%s', e non cambiaron os prerrequisitos.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Facendo `%s' debido á marca de sempre-facer.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Non é preciso reface-lo obxectivo `%s'" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; usando o nome de VPATH `%s'" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Debe refacerse o obxectivo `%s'.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Ignorando o nome VPATH `%s'.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Estanse a executa-los comandos de `%s'.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Non se puido reface-lo ficheiro obxectivo `%s'.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "O ficheiro obxectivo `%s' foi feito de novo con éxito.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "O ficheiro obxectivo `%s' precisa refacerse con -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Usando os comandos por defecto para `%s'.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Aviso: O ficheiro `%s' ten unha data de modificación no futuro" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Aviso: O ficheiro `%s' ten unha data de modificación %.2g s. no futuro" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "O elemento de .LIBPATTERNS `%s' non é un patrón" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "A Aduana non exporta: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Regras Implícitas" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Non hai regras implícitas." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u regras implícitas, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminal." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ERRO: ¡num_pattern_rules é incorrecto! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "sinal descoñecido" + +#: signame.c:94 +msgid "Hangup" +msgstr "Colgar" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Interrompido" + +#: signame.c:100 +msgid "Quit" +msgstr "Saír" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Instrucción Ilegal" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Trampa de trazado/punto de detención" + +#: signame.c:111 +msgid "Aborted" +msgstr "Abortado" + +#: signame.c:114 +msgid "IOT trap" +msgstr "Trampa de IOT" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Trampa EMT" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Excepción de coma flotante" + +#: signame.c:123 +msgid "Killed" +msgstr "Matado" + +#: signame.c:126 +msgid "Bus error" +msgstr "Erro do bus" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Fallo de segmento" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Chamada ao sistema incorrecta" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Cano rompido" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Temporizador" + +#: signame.c:141 +msgid "Terminated" +msgstr "Rematado" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Sinal definido polo usuario 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Sinal definido polo usuario 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "O proceso fillo rematou" + +#: signame.c:158 +msgid "Power failure" +msgstr "Fallo de suministro eléctrico" + +#: signame.c:161 +msgid "Stopped" +msgstr "Detido" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Detido (entrada de consola)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Detido (saída de consola)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Detido (sinal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Límite de tempo de CPU superado" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Límite de tamaño de ficheiros superado" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Temporizador virtual esgotado" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "O temporizador esgotouse" + +#: signame.c:188 +msgid "Window changed" +msgstr "A fiestra cambiou" + +#: signame.c:191 +msgid "Continued" +msgstr "Continuado" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Condición de E/S urxente" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "A E/S é posible" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Recurso perdido" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Sinal de perigo" + +#: signame.c:219 +msgid "Information request" +msgstr "Petición de información" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "O co-procesador de coma flotante non está dispoñible" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# estatísticas da táboa hash de ficheiros:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "por defecto" + +#: variable.c:1544 +msgid "environment" +msgstr "ambiente" + +#: variable.c:1547 +msgid "makefile" +msgstr "ficheiro de make" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "ambiente baixo -e" + +#: variable.c:1553 +msgid "command line" +msgstr "liña de comandos" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "directiva `override'" + +#: variable.c:1559 +msgid "automatic" +msgstr "automático" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (de `%s', liña %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# estatísticas da táboa hash de conxunto de variables:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: variable.c:1627 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valores de variables específicos do patrón" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Non hai valores específicos do patrón." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valores de variables específicos do patrón" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "aviso: variable non definida `%.*s'" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "a chamada a sys$search fallou con %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Aviso: Redirección baleira\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "erro interno: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-aviso, pode que teña que reactiva-lo manexo de CTRL-Y dende o DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "BUILTIN RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Comando incluido descoñecido '%s'\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Erro, comando baleiro\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Entrada redirixida de %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Erros redirixidos a %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Saída redirixida a %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Saída redirixida a %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Executando %s no canto\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Erro ao lanzar, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Camiños de Busca VPATH\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Non hai camiños de busca `vpath'" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u camiños de busca `vpath'.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Non hai un camiño de busca xeral (variable `VPATH')." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Camiño de busca xeral (variable `VPATH'):\n" +"# " + +#~ msgid "create_child_process: DuplicateHandle(In) failed (e=%d)\n" +#~ msgstr "" +#~ "create_child_process: a chamada a DuplicateHandle(In) fallou (e=%d)\n" + +#~ msgid "create_child_process: DuplicateHandle(Err) failed (e=%d)\n" +#~ msgstr "" +#~ "create_child_process: a chamada a DuplicateHandle(Err) fallou (e=%d)\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Erro de sintaxe, ainda dentro de '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Recibiuse un sinal SIGCHLD; %u procesos fillos non colleitados.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-aviso, CTRL-Y deixará subprocesos ceibos.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Non especifique -j ou --jobs se sh.exe non está dispoñible." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Reiniciando make para entrar no modo de un traballo." + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sIsto é software libre; vexa o código fonte polas condicións de copia.\n" +#~ "%sNON hai garantía; nin sequera de COMERCIABILIDADE ou APTITUDE PARA\n" +#~ "%sUN FIN DETERMINADO.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "`endef' superfluo" + +#~ msgid "empty `override' directive" +#~ msgstr "directiva `override' baleira" + +#~ msgid "invalid `override' directive" +#~ msgstr "directiva `override' non válida" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "non hai un home de ficheiro en `%sinclude'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "o obxectivo `%s' deixa o patrón prerrequisito baleiro" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Non hai ficheiros." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u ficheiros en %u baldes hash.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# %.3f ficheiros de media por balde, máximo de %u ficheiros nun balde.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIRECTORIO" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Entrar no DIRECTORIO antes de facer nada" + +#~ msgid "FLAGS" +#~ msgstr "MODIFICADORES" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Suspende-lo proceso para poder conectar un depurador" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "" +#~ "As variables de ambiente teñen prioridade sobre os ficheiros de make" + +#~ msgid "FILE" +#~ msgstr "FICHEIRO" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Le-lo FICHEIRO coma un ficheiro de make" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Busca-los ficheiros de make incluidos no DIRECTORIO" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Non comezar traballos múltiples se a carga non é inferior a N" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "Non executar ningún comando; só amosalos" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "Considerar que o FICHEIRO é moi vello, e non o refacer" + +#~ msgid "Don't echo commands" +#~ msgstr "Non amosa-los comandos" + +#~ msgid "Turns off -k" +#~ msgstr "Desactiva -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Considerar que o FICHEIRO é infinitamente novo" + +#~ msgid "Entering" +#~ msgstr "Entrando" + +#~ msgid "Leaving" +#~ msgstr "Saindo" + +#~ msgid "# No variables." +#~ msgstr "# Non hai variables." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# %.1f variables de media por balde, máximo de %u nun balde.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# %d.%d variables de media por balde, máximo de %u nun balde.\n" + +#~ msgid "the `word' function takes a positive index argument" +#~ msgstr "a función `word' toma un argumento índice positivo" + +#~ msgid " (ignored)" +#~ msgstr " (ignorado)" + +#~ msgid " not" +#~ msgstr " non" + +#~ msgid " remote" +#~ msgstr " remoto" + +#~ msgid " with arg %s" +#~ msgstr " co argumento %s" + +#~ msgid "%s finished." +#~ msgstr "%s rematou." + +#~ msgid "%s: unknown signal" +#~ msgstr "%s: sinal descoñecido" + +#~ msgid "%sGNU Make version %s" +#~ msgstr "%sGNU Make versión %s" + +#~ msgid "1-minute: %f " +#~ msgstr "1 minuto: %f " + +#~ msgid "15-minute: %f " +#~ msgstr "15 minutos: %f " + +#~ msgid "5-minute: %f " +#~ msgstr "5 minutos: %f " + +#~ msgid "?? getopt returned character code 0%o ??\n" +#~ msgstr "?? getopt devolveu o código do carácter 0%o ??\n" + +#~ msgid "Child" +#~ msgstr "Fillo" + +#~ msgid "Dependency `%s' does not exist.\n" +#~ msgstr "A dependencia `%s' non existe.\n" + +#~ msgid "Error %ld" +#~ msgstr "Erro %ld" + +#~ msgid "Error getting load average" +#~ msgstr "Erro ao obte-la carga media" + +#~ msgid "Error mallocing for FAB\n" +#~ msgstr "Erro ao reservar memoria para FAB\n" + +#~ msgid "Error mallocing for NAM\n" +#~ msgstr "Erro ao reservar memoria para NAM\n" + +#~ msgid "Error mallocing for direct\n" +#~ msgstr "Erro ao reservar memoria para direct\n" + +#~ msgid "Error mallocing for searchspec\n" +#~ msgstr "Erro ao reservar memoria para searchspec\n" + +#~ msgid "ExceptionAddress = %x\\r\n" +#~ msgstr "ExceptionAddress = %x\\r\n" + +#~ msgid "ExceptionCode = %x\\r\n" +#~ msgstr "ExceptionCode = %s\\r\n" + +#~ msgid "ExceptionFlags = %x\\r\n" +#~ msgstr "ExceptionFlags = %x\\r\n" + +#~ msgid "Job exported to %s ID %u\n" +#~ msgstr "Traballo exportado a %s ID %u\n" + +#~ msgid "MyExecute: Cannot allocate space for calling a command" +#~ msgstr "MyExecute: Non se pode reservar espacio para chamar un comando" + +#~ msgid "Trying %s dependency `%s'.\n" +#~ msgstr "Probando a dependencia %s `%s'.\n" + +#~ msgid "Unknown error 12345678901234567890" +#~ msgstr "Erro 12345678901234567890 descoñecido" + +#~ msgid "Unknown%s job %d" +#~ msgstr "Traballo%s %d descoñecido" + +#~ msgid "User" +#~ msgstr "Usuario" + +#~ msgid "arg with white space or doublequotes: %s\n" +#~ msgstr "argumento con espacios en branco ou comiñas dobres: %s\n" + +#~ msgid "digits occur in two different argv-elements.\n" +#~ msgstr "aparecen díxitos en dous elementos de argv distintos.\n" + +#~ msgid "empty string arg: %s\n" +#~ msgstr "argumento de cadea baleiro: %s\n" + +#~ msgid "environment override" +#~ msgstr "supli-lo ambiente" + +#~ msgid "execve: " +#~ msgstr "execve: " + +#~ msgid "execvp: " +#~ msgstr "execvp: " + +#~ msgid "expand_function: unable to launch process (e=%d)\n" +#~ msgstr "expand_function: non se puido lanza-lo proceso (e=%d)\n" + +#~ msgid "exporting: " +#~ msgstr "exportando: " + +#~ msgid "exporting: %s" +#~ msgstr "exportando: %s" + +#~ msgid "exporting: Couldn't create return socket." +#~ msgstr "exportando: Non se puido crea-lo socket de retorno." + +#~ msgid "getcwd: " +#~ msgstr "getcwd: " + +#~ msgid "getwd: %s" +#~ msgstr "getwd: %s" + +#~ msgid "implicit" +#~ msgstr "implícita" + +#~ msgid "intermediate" +#~ msgstr "intermedia" + +#~ msgid "losing" +#~ msgstr "que perde" + +#~ msgid "never" +#~ msgstr "nunca" + +#~ msgid "newer" +#~ msgstr "máis novo" + +#~ msgid "non-option ARGV-elements: " +#~ msgstr "elementos ARGV que non son opcións: " + +#~ msgid "older" +#~ msgstr "máis vello" + +#~ msgid "option %c\n" +#~ msgstr "opción %c\n" + +#~ msgid "option %s" +#~ msgstr "opción %s" + +#~ msgid "option a\n" +#~ msgstr "opción a\n" + +#~ msgid "option b\n" +#~ msgstr "opción b\n" + +#~ msgid "option c with value `%s'\n" +#~ msgstr "opción c co valor `%s'\n" + +#~ msgid "option d with value `%s'\n" +#~ msgstr "opción d co valor `%s'\n" + +#~ msgid "original arg: %s\n" +#~ msgstr "argumento orixinal: %s\n" + +#~ msgid "override" +#~ msgstr "suplir" + +#~ msgid "plain arg: %s\n" +#~ msgstr "argumento simple: %s\n" + +#~ msgid "process_begin: CreateProcess(%s, %s, ...) failed.\n" +#~ msgstr "process_begin: a chamada a CreateProcess(%s, %s, ...) fallou.\n" + +#~ msgid "process_easy: DuplicateHandle(Out) failed (e=%d)\n" +#~ msgstr "process_easy: a chamada a DuplicateHandle(Out) fallou (e=%d)\n" + +#~ msgid "read" +#~ msgstr "lectura" + +#~ msgid "rule" +#~ msgstr "regra" + +#~ msgid "touch %s" +#~ msgstr "tocar %s" + +#~ msgid "undefined" +#~ msgstr "non definido" + +#~ msgid "unlink: " +#~ msgstr "unlink: " + +#~ msgid "winning" +#~ msgstr "que gaña" + +#~ msgid "write" +#~ msgstr "escritura" diff --git a/po/he.gmo b/po/he.gmo new file mode 100644 index 0000000..5e8d924 Binary files /dev/null and b/po/he.gmo differ diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..7befe70 --- /dev/null +++ b/po/he.po @@ -0,0 +1,2131 @@ +# Hebrew messages for GNU Make +# Copyright (C) 2002 Free Software Foundation, Inc. +# Eli Zaretskii , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.79.1\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2002-03-30 21:33+0300\n" +"Last-Translator: Eli Zaretskii \n" +"Language-Team: Hebrew \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "úëîúð äððéàù `%s' äðåëúá ùåîéù ïåéñð" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "VMS úëøòîá ïåéëøàá øáà ìù äòù/êéøàú éåðéùá äëéîú ïéà" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "íéé÷ åðéà `%s' ïåéëøà õáå÷ :touch" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "ïé÷ú ïåéëøà õáå÷ åðéà `%s' :touch" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "`%s' øáà ìéëî åðéà `%s' ïåéëøà :touch" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "`%s' øåáò ïé÷ú-àì ãå÷ äøéæçä ar_member_touch :touch" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "%d ñåèèñ ,lib$rset_module é\"ò ìåãåî ìò òãéî úôéìùá ïåìùë" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "%d ñåèèñ íò ìùëð lbr$ini_control" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "(`%s' äéøôñ) `%s' øáà øåáò äéøôñ úçéúôá äì÷ú" + +# These are not translated, since they belong to a test program. +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Member `%s'%s: %ld bytes at %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (name might be truncated)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Date %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Break. ***\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] ÷çîéé àì ;ïé÷ú-éúìá úåéäì ìåìò `%s' ïåéëøà øáà ***" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** ÷çîéé àì ;ïé÷ú-éúìá úåéäì ìåìò `%s' ïåéëøà øáà ***" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] `%s' õáå÷ ÷çåî ***" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** `%s' õáå÷ ÷çåî ***" + +# I decided to retain the English text of what Make prints under -p, +# since it is notoriously hard to get right in right-to-left languages, +# and because its primary use is for programmers who write Makefiles. +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# commands to execute" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (built-in):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (from `%s', line %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directories\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: could not be stat'd.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (key %s, mtime %d): could not be opened.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (device %ld, inode %ld): could not be opened.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (key %s, mtime %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "No" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " files, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "no" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " impossibilities" + +#: dir.c:1075 +msgid " so far." +msgstr " so far." + +#: dir.c:1092 +#, fuzzy, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilities in %u directories.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "(øáã ìù åôåñá) åîöòì äééðôäì íøåâ `%s' éáéñøå÷ø äðúùî" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "äëìäë úîééúñî äðéà äðúùîì äééðôä" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr ",`%s' õáå÷ øåáò úåãå÷ô åðúéð %s õáå÷á %lu äøåùá" + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr ",íéùøåôî-éúìá íéììëá ùåôéç é\"ò åàöîð `%s' õáå÷ øåáò úåãå÷ô" + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr ".õáå÷ åúåàì äúò íéáùçð `%s' ïäå `%s' ïä íìåàå" + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr ".`%s' øåáò åìà ìò úåôéãò `%s' øåáò úåãå÷ô" + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "`%s' íéããåá íééúåãå÷ðî `%s' íéìåôë íééúåãå÷ðì êåôäì ïúéð àì" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "`%s' íéìåôë íééúåãå÷ðî `%s' íéããåá íééúåãå÷ðì êåôäì ïúéð àì" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** `%s' íééðéá õáå÷ ÷çåî ***" + +#: file.c:396 +#, fuzzy +msgid "Removing intermediate files...\n" +msgstr "*** `%s' íééðéá õáå÷ ÷çåî ***" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "øúåîä íåçúì õåçî äðéäù ,%s ìù ïîæä úîéúç úà %s-á óéìçî" + +#: file.c:804 +msgid "Current time" +msgstr "úëøòî ïåòù" + +# See the comment above about translations of text printed under -p. +#: file.c:924 +msgid "# Not a target:" +msgstr "# Not a target:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Precious file (prerequisite of .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Phony target (prerequisite of .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Command-line target." + +#: file.c:935 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# A default or MAKEFILES makefile." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Implicit rule search has been done." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Implicit rule search has not been done." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Implicit/static pattern stem: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# File is an intermediate prerequisite." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Also makes:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Modification time never checked." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# File does not exist." + +#: file.c:956 +msgid "# File is very old." +msgstr "# File is very old." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Last modified %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# File has been updated." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# File has not been updated." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Commands currently running (THIS IS A BUG)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Dependencies commands running (THIS IS A BUG)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Successfully updated." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Needs to be updated (-q is set)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Failed to be updated." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Invalid value in `update_status' member!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Invalid value in `command_state' member!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Files" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "øôñî åðéà `word' úééö÷ðåôì ïåùàø èðîåâøà" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "éáåéç úåéäì áééç `word' úééö÷ðåôì ïåùàø èðîåâøà" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "øôñî åðéà `wordlist' úééö÷ðåôì ïåùàø èðîåâøà" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "øôñî åðéà `wordlist' úééö÷ðåôì éðù èðîåâøà" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) failed (e=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) failed (e=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() failed (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() failed\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "`%s' éðîæ batch õáå÷ ÷ìñî\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "÷ôñî åðéàù (%d) íéèðîåâøà øôñî íò äàø÷ð `%s' äéö÷ðåô" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "åæ úëøòîá úùîåîî äðéà `%s' äéö÷ðåô" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "`%s' äéö÷ðåôì äàéø÷á `%c' øñç" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s úéðëú øåáò éòîùî-ãç åðéà `%s' ïééôàî\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `--%s' ïééôàî\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `%c%s' ïééôàî\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà áééçî `%s' ïééôàî\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s úéðëú øåáò `--%s' ääåæî-éúìá ïééôàî\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s úéðëú øåáò `%c%s' ääåæî-éúìá ïééôàî\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: é÷åç-éúìá ïééôàî -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s úéðëú øåáò éåâù ïééôàî -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: èðîåâøà áééçî ïééôàî -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s úéðëú øåáò éòîùî-ãç åðéà `-W %s' ïééôàî\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `-W %s' ïééôàî\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr ".`%s' øåáò ùøåôî-éúìá ììë ùôçî\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr ".`%s' øåáò ïåéëøà éøáàì ùøåôî-éúìá ììë ùôçî\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr ".úùøåôî-éúìá äéñøå÷øî òðîð\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr ".`%.*s' ùøåù íò úéðáú ììë äñðî\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr ".úéøùôà-éúìá äðéäù íåùî `%s' íã÷ úùéøã äçåã\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr ".úéøùôà-éúìá äðéäù íåùî `%s' úùøåôî-éúìá íã÷ úùéøã äçåã\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr ".`%s' íã÷ úùéøã ììë äñðî\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr ".`%s' úùøåôî-éúìá íã÷ úùéøã äñðî\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "`%s' íã÷ úùéøãë VPATH `%s' éúàöî\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr ".`%s' éðîæ õáå÷ íò ììë ùôçî\n" + +#: job.c:335 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (temporary file)" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] 0x%x äì÷úî éúîìòúä ***" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] 0x%x äì÷ú ***" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] %d äì÷úî éúîìòúä" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] %d äì÷ú" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (core õáå÷á íùøð ïåøëæä ïëåú)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ...åîééúñð íøèù úåãåáòì ïéúîî" + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "äöø 0x%08lx (%s) PID=%ld %s úá-úéðëú\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr "(ú÷çåøî)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "äìùëðù 0x%08lx PID=%ld %s úá-úéðëú óñåà\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "äçéìöäù 0x%08lx PID=%ld %s úá-úéðëú óñåà\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "`%s' éðîæ batch õáå÷ ÷ìñî\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr ".úåãåáò úøùøùî 0x%08lx PID=%ld %s úá-úéðëú ÷éçøî\n" + +# Here and elsewhere leading strings passed to perror are not translated, +# since they will be followed by an error message in English. +#: job.c:920 +msgid "write jobserver" +msgstr "write jobserver" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr ".øøçåù 0x%08lx (%s) úá-úéðëú øåáò ïåîéñàä\n" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "(e=%d) úéðëú-úú øåâéùá ìùëð process_easy()\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"ìùëðù øåâéùá åðîð íéèðîåâøà %d\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr ".úåãåáò úøùøùì 0x%08lx (%s) PID=%ld %s úá-úéðëú óøöî\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr ".0x%08lx (%s) úá-úéðëú øåáò ïåîéñà ìá÷úä\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "read jobs pipe" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "`%s' äøèî ùãçî úåðáì êøåö ïéà" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "åæ úëøòîá ñîåò úåìáâî úåôëì ïúéð àì" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "cannot enforce load limit: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "äôñàð pid %d úá-úéðëú ,pid %d-ì äëçî ïééãò\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "äàöîð àì åæ äãå÷ô :%s" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "äàöîð àì shell úãå÷ô :%s" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, fuzzy, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "(`%s' äéä íãå÷ ,`%s' åéùëò) äðúùä $SHELL ìù åëøò" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "`%s' éðîæ batch õáå÷ øöåé\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"(!unixy && !batch_mode_shell) shell-mode úòéá÷á äì÷ú :%s õáå÷ ìù %d äøåù\n" + +#: main.c:303 +msgid "Options:\n" +msgstr " :íéðééôàî\n" + +#: main.c:304 +#, fuzzy +msgid " -b, -m Ignored for compatibility.\n" +msgstr "úåîéàú ïòîì èîùåî" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:311 +#, fuzzy +msgid " -d Print lots of debugging information.\n" +msgstr "úåàéâù éåôéð úáåèì òãéî ìù òôù âöä" + +#: main.c:313 +#, fuzzy +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "úåàéâù éåôéð úáåèì òãéî ìù íéðåù íéâåñ âöä" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:323 +#, fuzzy +msgid " -h, --help Print this message and exit.\n" +msgstr "úéðëúäî àöå äæ äøæò êñî âöä" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:330 +#, fuzzy +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "äìáâî ïéà èðîåâøà àìì ;úéðîæ-åá úåãåáò N-î øúåé àì" + +#: main.c:332 +#, fuzzy +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "äéðáì úåðúéð ïðéà úåøèîäî äîë íà åìéôà êùîä" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:345 +#, fuzzy +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "Make ìù éîéðô íéðåúð ñéñá âöä" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "úðëãåòî äøèî íàá øîåà äàéöé ãå÷ ;úåãå÷ô õéøú ìà" + +#: main.c:349 +#, fuzzy +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "íéùøåôî-éúìá íéðáåî íéììë ìøèð" + +#: main.c:351 +#, fuzzy +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "íéðúùî ìù úåðáåî úåøãâä ìøèð" + +#: main.c:353 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" + +#: main.c:358 +#, fuzzy +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "ïúåðáì íå÷îá úåøèî ìù ïîæ úîéúç ïëãò" + +#: main.c:360 +#, fuzzy +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "úéðëúäî àöå Make ìù àñøéâ øôñî âöä" + +#: main.c:362 +#, fuzzy +msgid " -w, --print-directory Print the current directory.\n" +msgstr "úéçëåð äé÷éú íù âöä" + +#: main.c:364 +#, fuzzy +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "ùøåôîá ïéåö àåä íà åìéôà -w ìèá" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:369 +#, fuzzy +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "øãâåä àìù äðúùîì äééðôä äø÷îá äøäæà âöä" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "õáå÷ íùë úìá÷úî äðéà ä÷éø úæåøçî" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "úåàéâù éåôéðì òãéî ìù `%s' øëåî-éúìá ïééôàî" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s úéðëúá (code = 0x%x, addr = 0x%x) äâéøç åà ä÷éñô\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"%s úéðëú êåúî àø÷ð ìåôéè àìì úåâéøç ïðñî\n" +"ExceptionCode = %x\n" +"ExceptionFlags = %x\n" +"ExceptionAddress = %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "%x úáåúëì äáéúë :ïåøëæì äùéâ úì÷ú\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "%x úáåúëî äàéø÷ :ïåøëæì äùéâ úì÷ú\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell setting default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell path search set default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr ".úåéðù 30 ìù %s úééäùä" + +# Pay attention: this is written to the _right_ of the previous string, +# but should look like a single sentence together with it. +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr " äîééúñð\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr ".úçà íòôî øúåé ïúéð éð÷ú èì÷ õåøòî Makefile" + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (temporary file)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (temporary file)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr ".åæ úëøòîá êîúð åðéà (-j) éìéá÷î òåöéá" + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr ".(-j1) éúøãñ ïôåàá åòöåáé úåãå÷ô" + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "íéáåøî --jobserver-fds éðééôàî :úéîéðô äðëú úì÷ú" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "--jobserver-fds ïééôàîá `%s' äéåâù úæåøçî :úéîéðô äðëú úì÷ú" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "jobserver ïôåà ìèáî ;-jN áééçî Make-úú :äøäæà" + +#: main.c:1750 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +".Make ìù áàä ììëì `+' óñåä .-j1-á ùåîéù äùòéé ;ïéîæ åðéà jobserver :äøäæà" + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "creating jobs pipe" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "init jobserver pipe" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "...makefile éöá÷ ïëãòî\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr ".ùãçî åøöééìî òðîð ;úéôåñðéà äàìåì øåöéì ìåìò `%s' Makefile\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr ".`%s' makefile ìù ùãçî-äøéöéá äì÷ú" + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr ".àöîð àì `%s' ììëåî makefile" + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "àöîð àì `%s' Makefile" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr ".úéøå÷îä äé÷éúì øåæçì ïúéð àì" + +#: main.c:2102 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "Re-executing:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (temporary file): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "makefile éöá÷ åàöîð àìå úåøèî ïåéö ïéà" + +#: main.c:2272 +msgid "No targets" +msgstr "úåøèî ïéà" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "...ãòé úåøèî ïëãòî\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr ".äîìù àì úåéäì äìåìò äéðáä .ïåòù úùéìâ äúìâúð :úåøéäæ" + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "%s [íéðééôàî] [äøèî] ... :ùåîéù ïôåà\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" + +#: main.c:2481 +#, fuzzy, c-format +msgid "Report bugs to \n" +msgstr "" +"\n" +".-ì äì÷ú éçååéã çåìùì àð\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "éáåéçå íìù èðîåâøà áééçî `-%c' ïééôàî" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "éáåéçå íìù èðîåâøà áééçî `-%c' ïééôàî" + +#: main.c:3054 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "" + +#: main.c:3056 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make data base, printed on %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Finished Make data base on %s\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "an unknown directory" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "an unknown directory" + +#: main.c:3242 +#, fuzzy, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "directory `%s'\n" + +#: main.c:3245 +#, fuzzy, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "directory `%s'\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "an unknown directory" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "an unknown directory" + +#: main.c:3257 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "directory `%s'\n" + +#: main.c:3260 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "directory `%s'\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Stop.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Unknown error %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "éìàåèøéåä ïåøëæä øîâð" + +#: misc.c:708 +#, fuzzy, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s access: user %lu (real %lu), group %lu (real %lu)\n" + +#: misc.c:729 +#, fuzzy +msgid "Initialized access" +msgstr "Initialized" + +#: misc.c:808 +msgid "User access" +msgstr "" + +#: misc.c:856 +msgid "Make access" +msgstr "" + +#: misc.c:890 +msgid "Child access" +msgstr "" + +#: misc.c:954 +#, fuzzy, c-format +msgid "write error: %s" +msgstr "%s-ì úåàéâù úééðôä\n" + +# Here and elsewhere leading strings passed to perror are not translated, +# since they will be followed by an error message in English. +#: misc.c:956 +#, fuzzy +msgid "write error" +msgstr "write jobserver" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "...makefile éöá÷ àøå÷\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Reading makefile `%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (no default goal)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (search path)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (don't care)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (no ~ expansion)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "éàðú ìù éåâù øéáçú" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "äðåùàø äøèî éðôì úåìéçúî úåãå÷ô" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "ïäéðôì ììë àìì úåãå÷ô" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "%sãéøôî øñç" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr "(?íéçååø 8 íå÷îá TAB-ì úðååëúä íàä) " + +#: read.c:1163 +msgid "missing target pattern" +msgstr "äøèî úéðáú ïéà" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "úåáåøî äøèî úåéðáú" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "`%%' àìì äøèî úéðáú" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "øñç `endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "÷éø äðúùî íù" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "`endef' úàøåä éøçà øúåéî èñ÷è" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "íåéñ àìì `define' úàøåä ,øñç `endef'" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "`endef' úàøåä éøçà øúåéî èñ÷è" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "`%s' úàøåä éøçà øúåéî èñ÷è" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "øúåéî `%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "éàðú ìëì ãéçé `else' ÷ø øúåî" + +#: read.c:1797 +#, fuzzy +msgid "Malformed target-specific variable definition" +msgstr "äøèîì éôéöôñ äðúùî ìù äéåâù äøãâä" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "íéùøåôî-éúìáå íééèèñ úéðáú éììë ìù áåáøò" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "íéùøåôî-éúìáå íéìéâø íéììë ìù áåáøò" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "ãòéä úéðáú úà úîàåú äðéà `%s' äøèî" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr ":: ïäå : âåñî ïä íéììë ùé `%s' äøèî õáå÷ì" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr ".ììë åúåàá úçà íòôî øúåé äòéôåî `%s' äøèî" + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "`%s' äøèî øåáò úåãå÷ô ñøåã :úåøéäæ" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "`%s' äøèî øåáò úåîãå÷ úåãå÷ôî íìòúî :úåøéäæ" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "äçðæð äøåùä úøúé ;NUL åú éúùâô :äøäæà" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr ".`%s øåáò úåùòì äî ïéà" + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr ".éðëãò øáë `%s'" + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr ".`%s' øåáò úåéåìú óøâ õö÷î\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%s`%s'%s äøèî úééðáì íéììë ïéà" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%säúééðáì íéììë ïéà êà ,`%s' úùøåã `%s'%s äøèî" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr ".`%s' äøèî õáå÷ ïçåá\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr ".`%s' õáå÷ ïåëãòá éúìùëðå éúéñéð ïîæî àì\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr ".ïë-éðôì ïçáð øáë `%s' õáå÷\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr ".`%s' õáå÷ ïëãòî ïééãò\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr ".`%s' õáå÷ ïëãòì éúîééñ\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr ".íéé÷ åðéà `%s' õáå÷\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr ".`%s' øåáò ùøåôî-éúìá ììë éúàöî\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr ".`%s' øåáò íéùøåôî-éúìá íéììë åàöîð àì\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr ".`%s' øåáò ìãçî úøéøá úåãå÷ôá ùîúùî\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr ".%s <- %s úéìâòî ìåìú èéîùî" + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr ".`%s' äøèî õáå÷ ìù íã÷-úåùéøã íò éúîééñ\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr ".äéðáá `%s' ìù íã÷ä úåùéøã\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr ".`%s' äøèî õáå÷ éáâì íééãé éúîøä\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr ".úåàéâù á÷ò ùãçî äúðáð àì `%s' äøèî" + +#: remake.c:727 +#, fuzzy, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr ".`%s' íã÷ä úùéøãî äùãç `%s' äøèî\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr ".íéé÷ åðéàù `%s' éàðúë úùøåã `%s' äøèî\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr ".`%s' íã÷ä úùéøãî äðùé `%s' äøèî\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr ".`%s' íã÷ä úùéøãî äùãç `%s' äøèî\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr ".íã÷ úåùéøã àììå íéìåôë íééúåãå÷ð íò äðéä `%s' äøèî\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr ".äùòîì äúðúùä àì íã÷ úùéøã óàå `%s' øåáò úåãå÷ô ïéà\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "`%s' äøèî ùãçî úåðáì êøåö ïéà" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr " (`%s' :VPATH õáå÷ íù)" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr ".`%s' äøèî ùãçî úåðáì áééç\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " .`%s' VPATH íùî íìòúî\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr ".`%s' øåáò úåãå÷ô õéøî\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr ".ùãçî `%s' úåðáì ïåéñð ìùëð\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr ".`%s' ùãçî úééðáá äçìöä\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr ".-q íò úåðáéäì êéøö `%s' äøèî õáå÷\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr ".`%s' øåáò ìãçî úøéøá úåãå÷ôá ùîúùî\n" + +#: remake.c:1357 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "*** `%s' õáå÷ øåáò (%s > %s) ãéúòá åðéä ïåøçà éåðéù ïîæ :äøäæà ***" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "*** `%s' õáå÷ øåáò (%s > %s) ãéúòá åðéä ïåøçà éåðéù ïîæ :äøäæà ***" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "úéðáú åðéà .LIBPATTERNS ìù `%s' èðîìà" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "%s àöééî åðéà Customs\n" + +#: rule.c:499 +#, fuzzy +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# No implicit rules." + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# No implicit rules." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implicit rules, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminal." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: num_pattern_rules wrong! %u != %u" + +# It's no use to try to translate the signal names. +#: signame.c:86 +msgid "unknown signal" +msgstr "unknown signal" + +#: signame.c:94 +msgid "Hangup" +msgstr "Hangup" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Interrupt" + +#: signame.c:100 +msgid "Quit" +msgstr "Quit" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Illegal Instruction" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Trace/breakpoint trap" + +#: signame.c:111 +msgid "Aborted" +msgstr "Aborted" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT trap" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT trap" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Floating point exception" + +#: signame.c:123 +msgid "Killed" +msgstr "Killed" + +#: signame.c:126 +msgid "Bus error" +msgstr "Bus error" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Segmentation fault" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Bad system call" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Broken pipe" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Alarm clock" + +#: signame.c:141 +msgid "Terminated" +msgstr "Terminated" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "User defined signal 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "User defined signal 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Child exited" + +#: signame.c:158 +msgid "Power failure" +msgstr "Power failure" + +#: signame.c:161 +msgid "Stopped" +msgstr "Stopped" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Stopped (tty input)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Stopped (tty output)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Stopped (signal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "CPU time limit exceeded" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "File size limit exceeded" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Virtual timer expired" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Profiling timer expired" + +#: signame.c:188 +msgid "Window changed" +msgstr "Window changed" + +#: signame.c:191 +msgid "Continued" +msgstr "Continued" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Urgent I/O condition" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O possible" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Resource lost" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Danger signal" + +#: signame.c:219 +msgid "Information request" +msgstr "Information request" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Floating point co-processor not available" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" + +# These are printed under -p, so they are left in English. +#: variable.c:1541 +msgid "default" +msgstr "default" + +#: variable.c:1544 +msgid "environment" +msgstr "environment" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "environment under -e" + +#: variable.c:1553 +msgid "command line" +msgstr "command line" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "`override' directive" + +#: variable.c:1559 +msgid "automatic" +msgstr "automatic" + +#: variable.c:1570 +#, fuzzy, c-format +msgid " (from `%s', line %lu)" +msgstr " (from `%s', line %lu):\n" + +#: variable.c:1612 +#, fuzzy +msgid "# variable set hash-table stats:\n" +msgstr "# %u variables in %u hash buckets.\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variables\n" + +#: variable.c:1627 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Pattern-specific variable values" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# No pattern-specific variable values." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u pattern-specific variable values" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "`%.*s' øãâåî-éúìá äðúùî :úåøéäæ" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "%d íò ìùëð sys$search\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "ä÷éø äééðôä :úåøéäæ\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "command_state `%s' :úéîéðô äðëú úì÷ú" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr ".DCL-î CTRL-Y-á ìåôéè øåùôéàá êøåö úåéäì ìåìò :úåøéäæ\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "BUILTIN RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "úøëåî äðéà '%s'úéðáåî äãå÷ô\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "ä÷éø äãå÷ô :äì÷ú\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "%s-î èì÷ úééðôä\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "%s-ì úåàéâù úééðôä\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "%s-ì èìô úééðôä\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "%s-ì èìô úééðôä\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s õéøî úàæ íå÷îá\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "%d :úá-úéðëú úìòôäá äì÷ú\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Search Paths\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# No `vpath' search paths." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u `vpath' search paths.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# No general (`VPATH' variable) search path." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# No files." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# average %.3f files per bucket, max %u files in one bucket.\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "'\"' êåúá ïééãò ,øéáçú úàéâù\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr ".åôñàð íøèù úá-úåéðëú %u ;SIGCHLD ìá÷úä\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr ".úåìéòô úá-úåéðëú øéàùäì ìåìò CTRL-Y :úåøéäæ\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIRECTORY" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "äãåáò úìéçú éðôì DIRECTORY-ì äé÷éú äðù" + +#~ msgid "FLAGS" +#~ msgstr "FLAGS" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "äéìà äôðîä øåáéç êøåöì úéðëúä á÷ò" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "makefile-á íéðúùî íéñøåã äáéáñ éðúùî" + +#~ msgid "FILE" +#~ msgstr "FILE" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "makefile-ë FILE àø÷" + +#~ msgid "Ignore errors from commands" +#~ msgstr "úåéðëú-úúá úåàéâùî íìòúä" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "DIRECTORY-á íéììëð makefile éöá÷ ùôç" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "N-ì úçúî ñîåòä íà àìà úåáåøî úåãåáò ìéçúú ìà" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "íúåà ñôãä ÷ø ;ììë úåãå÷ô õéøú ìà" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "ùãçî åúåà äðáú ìàå ,ïùé ãàî äéä åìéàë FILE-á âäð" + +#~ msgid "Don't echo commands" +#~ msgstr "úåòöåáî úãå÷ô âéöú ìà" + +#~ msgid "Turns off -k" +#~ msgstr "-k ìèáî" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "øùôàù ùãç éëä äéä FILE åìéàë âäð" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr ".ïéîæ åðéà sh.exe íà --jobs åà -j-á êåîúì ïúéð àì" + +#~ msgid "Resetting make for single job mode." +#~ msgstr ".éúøãñ ïôåàá åòöåáé úåãå÷ô" + +#~ msgid "" +#~ ", by Richard Stallman and Roland McGrath.\n" +#~ "%sBuilt for %s\n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s\tFree Software Foundation, Inc.\n" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ "\n" +#~ "%sReport bugs to .\n" +#~ "\n" +#~ msgstr "" +#~ ", by Richard Stallman and Roland McGrath.\n" +#~ "%s %s øåáò äúðáð\n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s\tFree Software Foundation, Inc.\n" +#~ "%s .øå÷î éöá÷á ïééò ä÷úòä úåéåëæì ;úéùôç äðëú éäåæ\n" +#~ "%s äîàúä åà úåøéçñ øåáò àì åìéôà ;úåéøçà áúëá äååìî äðéà åæ úéðëåú\n" +#~ "%s .éäùìë úéìëúì\n" +#~ "\n" +#~ "%s -ì äì÷ú éçååéã çåìùì àð\n" +#~ "\n" + +#~ msgid "Entering" +#~ msgstr "Entering" + +#~ msgid "Leaving" +#~ msgstr "Leaving" + +#~ msgid "extraneous `endef'" +#~ msgstr "øúåéî `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "ä÷éø `override' úàøåä" + +#~ msgid "invalid `override' directive" +#~ msgstr "äéåâù `override' úàøåä" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "õáå÷ íù àìì `%sinclude' úàøåä" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "ä÷éø íã÷ä úùéøã úéðáú úà äøéàùî `%s' äøèî" + +#~ msgid "# No variables." +#~ msgstr "# No variables." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# average of %.1f variables per bucket, max %u in one bucket.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# average of %d.%d variables per bucket, max %u in one bucket.\n" diff --git a/po/hr.gmo b/po/hr.gmo new file mode 100644 index 0000000..a3d3307 Binary files /dev/null and b/po/hr.gmo differ diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 0000000..5806881 --- /dev/null +++ b/po/hr.po @@ -0,0 +1,2152 @@ +# Translation of GNU make. +# Copyright (C) 2002 Free Software Foundation, Inc. +# Hrvoje Niksic , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.80\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2003-10-12 18:01+0200\n" +"Last-Translator: Hrvoje Niksic \n" +"Language-Team: Croatian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-2\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "poku¹aj kori¹tenja nepodr¾ane moguænosti: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "touch dijela arhive nije rapolo¾iv na VMS-u" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: Arhiva `%s' ne postoji" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: `%s' nije valjana arhiva" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: èlan `%s' ne postoji u `%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: Neispravan povratni kod iz ar_member_touch na `%s'" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module nije izdvojio informacije o modulu, status = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control nije uspio sa statusom = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "ne mogu otvoriti biblioteku `%s' da naðem èlan `%s'" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "èlan `%s'%s: %ld bajtova na %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (ime je mo¾da odrezano)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Prekid.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Èlan arhive '%s' mogao bi biti bezvezan; nije obrisan" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Èlan arhive '%s' mogao bi biti bezvezan; nije obrisan" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Bri¹em spis `%s'" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Bri¹em spis `%s'" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# naredbe za izvr¹avanje" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (ugraðeno):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (iz `%s', redak %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Direktoriji\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: ne mo¾e se statati.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (tipka %s, mtime %d): nije ga se moglo otvoriti.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (device %d, inode [%d,%d,%d]): nije ga se moglo otvoriti.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (device %ld, inode %ld): nije ga se moglo otvoriti.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (tipka %s, mtime %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Nijedan" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " spis, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "nijedna" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " nemoguænost" + +#: dir.c:1075 +msgid " so far." +msgstr " do sad." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " nemoguænosti u %lu direktorija.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Rekurzivna varijabla `%s' pokazuje (na kraju) na sebe" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "nedovr¹ena referenca na varijablu" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Naredbe su naznaèene za spis `%s' na %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "Naredbe za spis `%s' naðene su implicitnim pretra¾ivanjem propisa," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "ali `%s' se sada smatra istim spisom kao i `%s'." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "Naredbe za `%s' ignorirat æe se u korist onih za `%s'." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "ne mogu preimenovati `%s' s jednom dvotoèkom u `%s' s dvije dvotoèke" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "ne mogu preimenovati `%s' s dvije dvotoèke u `%s' s jednom dvotoèkom" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Bri¹em posredni spis `%s'" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Bri¹em posredne spise...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Vremenska oznaka van granica; zamjenjujem s %s" + +#: file.c:804 +msgid "Current time" +msgstr "Trenutno vrijeme" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Nije meta:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Vrijedan spis (prerekvizit mete .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# La¾na meta (prerekvizit mete .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Meta na komandnoj liniji." + +#: file.c:935 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Podrazumijevani ili MAKEFILES makefile." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Implicitna pretraga propisa je izvr¹ena." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Implicitna pretraga propisa nije izvr¹ena." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Korijen implicitnog/statièkog uzorka: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Spis je posredni prerekvizit." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Takoðer proizvodi:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Vrijeme promjene nikada nije provjereno." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Spis ne postoji." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Spis je vrlo star." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Zadnja promjena %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Spis je a¾uriran." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Spis nije a¾uriran." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Naredbe koje se trenutno izvr¹avaju (OVO JE BUG)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Ovisnosti izmeðu naredbi koje se izvr¹avaju (OVO JE BUG)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Uspje¹no a¾uriran." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Treba ga a¾urirati (-q je postavljen)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Nije ga se a¾uriralo." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Neispravna vrijednost u elementu `update_status'!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Neispravna vrijednost u elementu `command_state'!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Spisi" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistike hash tablice spisa\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "prvi argument funkcije `word' nije broj" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "prvi argument funkcije `word' mora biti veæi od 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "drugi argument funkcije `wordllist' nije broj" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "drugi arument funkcije `wordlist' nije broj" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) je zakazao (e=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) je zakazao (e=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() je zakazao (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() je zakazao\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Èistim privremeni batch spis %s.\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "Nedovoljan broj argumenata (%d) funkciji `%s'" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "Neimplementirano na ovoj platformi: funkcija `%s'" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "nedovr¹en poziv funkciji `%s': nedostaje `%c'" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opcija `%s' je vi¹eznaèna\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: uz opciju `--%s' ne ide argument\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: opcija `%c%s' ne dopu¹ta argument\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: opcija `%s' zahtijeva argument\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: nepoznata opcija `--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: nepoznata opcija `%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: nedopu¹tena opcija -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: neispravna opcija -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opcija tra¾i argument -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opcija `-W %s' je vi¹eznaèna\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: opcija `-W %s' ne dopu¹ta argument\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "ne mogu alocirati %ld bajtova za hash tablicu; memorija iscrpljena" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Optereæenje=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Preraspodjela=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Kolizije=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Tra¾im implicitni propis za `%s'.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Tra¾im implicitni propis za `%s' koji pripada elementu arhive.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Izbjegavam rekurziju implicitnog propisa.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Poku¹avam propis uzorka s korijenom `%.*s'.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Odbacujem nemoguæe pravilo prerekvizita `%s'.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Odbacujem nemoguæ prerekvizit `%s'.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Poku¹avam s propisom prerekvizita `%s'.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Poku¹avam s implicitnim prerekvizitom `%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Na¹ao prerekvizit `%s' kao VPATH `%s'\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Tra¾im propis s posrednim spisom `%s'.\n" + +#: job.c:335 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite(privremeni spis)" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Gre¹ka 0x%x (ignorirana)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Gre¹ka 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Gre¹ka %d (ignorirana)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Gre¹ka %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (izbaèen core)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** èekam na nedovr¹ene poslove...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "®ivo dijete 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (udaljen)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "®anjem proma¹eno dijete 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "®anjem uspje¹no dijete 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Èistim privremeni batch spis %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Uklanjam dijete 0x%08lx PID %ld%s iz lanca.\n" + +# ©to bi ovdje trebalo iæi? +#: job.c:920 +msgid "write jobserver" +msgstr "write jobserver" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Otpustio token za dijete 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() nije uspio pokrenuti proces (e=%d)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Prebrojao %d argumenata u neuspjelom pokretanju\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Smje¹tam dijete 0x%08lx (%s) PID %ld%s u lanac.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Preuzeo token za dijete 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "read jobs pipe" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Nema potrebe ponovo izraditi metu `%s'" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "" +"ne mogu silom primijeniti ogranièenje loada na ovom operativnom sustavu" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "ne mogu silom primijeniti ogranièenje loada: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make je po¾njeo dijete pid %d, jo¹ uvijek èeka na pid %d\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Naredba nije naðena" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Ljuskin program nije naðen" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, fuzzy, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL se promijenio (prije `%s', sad `%s')" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Stvaram privremeni batch spis %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (redak %d) Lo¹ kontekst ljuske (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Opcije:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorira se zbog kompatibilnosti\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Bezuvjetno proizvedi sve mete.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Prijeði u DIREKTORIJ prije no ¹to i¹ta " +"obavi¹.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Ispi¹i puno podataka za debugiranje.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGOVI] Ispi¹i razne vrste informacija za " +"debugiranje.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Varijable iz okoline imaju veæu va¾nost od\n" +" makefileova.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f SPIS, --file=SPIS, --makefile=SPIS\n" +" Proèitaj SPIS kao makefile.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Ispi¹i ovu poruku i izaði.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Zanemari gre¹ke od naredbi.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIREKTORIJ, --include-dir=DIREKTORIJ\n" +" Potra¾i u DIREKTORIJU ukljuèene makefileove.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Dopusti N istovremenih poslova; bez argumenta\n" +" ih dopusti beskonaèno.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Nastavi s radom ako se neke mete ne mogu " +"izraditi.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Ne pokreæi vi¹estruke poslove, osim ako pri\n" +" optereæenju ispod N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Nemoj zapravo pokrenuti nijednu naredbu;\n" +" samo ih ispi¹i.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o SPIS, --old-file=SPIS, --assume-old=SPIS\n" +" Smatraj da je SPIS vrlo star i nemoj ga\n" +" ponovo napraviti.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Ispi¹i makeovu internu bazu.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Ne pokreæi naredbe; izlazni status oznaèava\n" +" je li sve a¾urirano.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules Onemoguæi ugraðene implicitne propise.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Onemoguæi ugraðene vrijednosti varijabli.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Ne ispisuj naredbe.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Iskljuèuje -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Dodirni mete umjesto da ih ponovo izraðuje¹.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Ispi¹i verziju makea i izaði.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Ispi¹i trenutni direktorij.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Iskljuèi -w, èak i ako je implicitno " +"ukljuèen.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W SPIS, --what-if=SPIS, --new-file=SPIS, --assume-new=SPIS\n" +" Smatraj SPIS beskonaèno novim.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Upozori kad se referencira nedefinirana " +"varijabla.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "prazan string nije valjan naziv spisa" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "nepoznata naznaka nivoa debuga `%s'" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Prekid/Iznimka uhvaæena (code = 0x%x, addr = 0x%x)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Filter neobraðene iznimke pozvan iz programa %s\n" +"ExceptionCode = %x\n" +"ExceptionFlags = %x\n" +"ExceptionAddress = %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Pristupni prekr¹aj: operacija pisanja na adresi %x\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Pristupni prekr¹aj: operacija èitanja na adresi %x\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell postavljam default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell pretraga staze postavljam default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s se zaustavlja na 30 sekundi..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "gotov sa sleep(30). Nastavljam.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile sa standardnog ulaza naveden dvaput." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (privremeni spis)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite(privremeni spis)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Paralelni poslovi (-j) nisu podr¾ani na ovoj platformi." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Resetiram na mod jednog posla (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "interna gre¹ja: vi¹estruko pojavljivanje opcije --jobserver-fds" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "interna gre¹ka: neispravan --jobserver-fds string `%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "upozorenje: -jN se forsira u pod-makeu: onemoguæujem jobserver mod." + +# Treba li ovo prevesti? +#: main.c:1750 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"upozorenje: jobserver nedostupan: koristim -j1. Dodaj `+' na roditeljev " +"make propis." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "kreiram pipe za posao" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "prevesti?" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "A¾uriram makefileove....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Makefile `%s' bi mogao upasti u petlju; ne izgraðujem ga ponovo.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Nisam uspio ponovo izgraditi makefile `%s'." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Ukljuèeni makefile `%s' ne mo¾e se naæi." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Makefile `%s' ne mo¾e se naæi" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Nisam se mogao vratiti u prvotni direktorij." + +#: main.c:2102 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "Ponovo izvr¹avam:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (privremeni spis): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Nijedna meta nije navedena, niti je ijedan makefile pronaðen" + +#: main.c:2272 +msgid "No targets" +msgstr "Nema meta" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "A¾uriram ciljne mete....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"upozorenje: uoèena je nepravilnost sata. Izgradnja bi mogla biti nedovr¹ena." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uporaba: %s [opcije] [meta] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Program sastavljen za %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Program sastavljen za %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Uoèene gre¹ke prijavite na adresu .\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "opcija `-%c' tra¾i pozitivan cjelobrojni argument" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "opcija `-%c' tra¾i pozitivan cjelobrojni argument" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"Program sastavljen za %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"Program sastavljen za %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Makeova baza, ispisana na %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Kraj Makeove baze na %s\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Ulazim u nepoznat direktorij" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Izlazim iz nepoznatog direktorija" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Ulazim u direktorij `%s'\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Izlazim iz direktorija `%s'\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Ulazim u nepoznat direktorij" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Izlazim iz nepoznatog direktorija" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Ulazim u direktorij `%s'\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Izlazim iz direktorija `%s'\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Zaustavi.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Nepoznata gre¹ka %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "prividna memorija potro¹ena" + +# Da prevedem ovo? +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: user %lu (real %lu), group %lu (real %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Inicijaliziran pristup" + +#: misc.c:808 +msgid "User access" +msgstr "Korisnièki pristup" + +#: misc.c:856 +msgid "Make access" +msgstr "Makeov pristup" + +#: misc.c:890 +msgid "Child access" +msgstr "Pristup djeteta" + +#: misc.c:954 +#, fuzzy, c-format +msgid "write error: %s" +msgstr "Preusmjerio gre¹ke u %s\n" + +# ©to bi ovdje trebalo iæi? +#: misc.c:956 +#, fuzzy +msgid "write error" +msgstr "write jobserver" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Èitam makefileove...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Èitam makefile `%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (nema podrazumijevanog cilja)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (staza za pretra¾ivanje)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (nije va¾no)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (bez ekspanzije ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "neispravna sintaksa uvjeta" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "naredbe poèinju prije prve mete" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "nedostaje propis prije naredbi" + +# Grr, ¾ivjela engleska mno¾ina! I ¹to sad da radim s onim %s-om? +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "nedostaju separatori-%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (jeste li mislili na TAB umjesto 8 razmaka?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "nedostaje uzorak mete" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "vi¹estruki uzorci meta" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "uzorak mete ne sadr¾i `%%'" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "nedostaje `endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "prazno ime varijable" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Suvi¹an tekst nakon direktive `endef'" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "nedostaje `endef', nedovr¹en `define'" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Suvi¹an tekst nakon direktive `endef'" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Suvi¹an tekst nakon direktive `%s'" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "suvi¹an `%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "samo jedan `else' po uvjetu" + +#: read.c:1797 +#, fuzzy +msgid "Malformed target-specific variable definition" +msgstr "Izoblièena definicija o meti ovisne varijable" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "pomije¹ani implicitni i statièki propisi uzorka" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "pomije¹ani implicitni i normalni propisi" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "meta `%s' ne odgovara uzorku mete" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "spis meta `%s' ima unose i kod : i kod ::" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "meta `%s' zadan vi¹e nego jednom u istom propisu." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "upozorenje: poni¹tavam postojeæe naredbe za metu `%s'" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "upozorenje: ignoriram stare naredbe za metu `%s'" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "upozorenje: NUL znak uoèen; ostatak retka se zanemaruje" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Ni¹ta za napraviti za `%s'." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s' je a¾uriran." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Èistim spis `%s'.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sNema propisa za izradu mete `%s'%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sNema propisa za izradu mete `%s', kojeg tra¾i `%s'%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Uzimam u razmatranje spis metu `%s'.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Nedavno bezuspje¹no poku¹ao a¾urirati spis `%s'\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Spis `%s' veæ je bio uzet u razmatranje.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Jo¹ uvijek a¾uriram spis `%s'.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Zavr¹io s a¾uriranjem spisa `%s'.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Spis `%s' ne postoji.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Upozorenje: .LOW_RESOLUTION_TIME spis `%s' ima vremensku oznaku visoke " +"rezolucije" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Na¹ao implicitni propis za `%s'.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Nijedan implicitni propis nisam na¹ao za `%s'.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Koristim podrazumijevane naredbe za `%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Kru¾na ovisnost %s <- %s ispu¹tena." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Zavr¹eni prerekviziti spisa mete `%s'.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Prerekviziti `%s' su u izradi.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Odustajem od spisa mete `%s'.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Meta `%s' nije ponovo izraðen zbog gre¹aka." + +# Nisam siguran da sam ovo ispravno shvatio. +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Prerekvizit `%s' slu¾i samo za redosljed pri meti `%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Prerekvizit `%s' mete `%s' ne postoji.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Prerekvizit `%s' noviji je od mete `%s':\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Prerekvizit `%s' stariji je od mete `%s'.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Meta `%s' je dvotoèka, a nema prerekvizita.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Nema naredbi za `%s', a nijedan prerekvizit nije promijenjen.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Proizvodim `%s' zbog opcije always-make.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Nema potrebe ponovo izraditi metu `%s'" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; koristim VPATH imena `%s'" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Moram ponovo izgraditi metu `%s'.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Ignoriram VPATH imena `%s'.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Naredbe od `%s' se izvr¹avaju.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Nije uspjela ponovna izrada spisa mete `%s'.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Uspje¹no ponovno izradio spis metu `%s'.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Spis meta `%s' treba ponovnu izradu zbog -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Koristim podrazumijevane naredbe za `%s'.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Upozorenje: Spis `%s' ima vrijeme promjene u buduænosti" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Upozorenje: Spis `%s' ima vrijeme promjene %.2g s u buduænosti" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "Element .LIBPATTERNS `%s' nije uzorak" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs neæe eksportirati: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Implicitni Propisi" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Nema implicitnih propisa." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implicitnih propisa, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " zavr¹ni." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: pogre¹an num_pattern_rules! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "nepoznat signal" + +#: signame.c:94 +msgid "Hangup" +msgstr "Izgubljena veza" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Prekid" + +#: signame.c:100 +msgid "Quit" +msgstr "Prestanak" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Nedopu¹tena instrukcija" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Zamka za slijed/prekidnu toèku" + +#: signame.c:111 +msgid "Aborted" +msgstr "Otkazan" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT zamka" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT zamja" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Iznimka floating pointa" + +#: signame.c:123 +msgid "Killed" +msgstr "Ubijen" + +#: signame.c:126 +msgid "Bus error" +msgstr "Sabirnièka gre¹ka" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Segmentacijska gre¹ka" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Nevaljan sistemski poziv" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Prekinut kanal" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Budilica" + +#: signame.c:141 +msgid "Terminated" +msgstr "Terminiran" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Korisnièki definiran signal 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Korisnièki definiran signal 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Dijete iza¹lo" + +#: signame.c:158 +msgid "Power failure" +msgstr "Nestalo struje" + +#: signame.c:161 +msgid "Stopped" +msgstr "Zaustavljen" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Zaustavljen (unosom s TTY-ja)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Zaustavljen (outputom s TTY-ja)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Zaustavljen (signalom)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "prekoraèeno ogranièenje CPU vremena" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Prekoraèeno ogranièenje velièine spisa" + +# Kako prevesti "virtual timer"? +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Virtualna ¹toperica istekla" + +# Kako prevesti "profiling timer"? +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Profajlerska ¹toperica istekla" + +#: signame.c:188 +msgid "Window changed" +msgstr "Promijenjen prozor" + +#: signame.c:191 +msgid "Continued" +msgstr "Nastavljen" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Hitno stanje I/O-a" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O moguæ" + +# Jesu li ova dva signala vic ili ¹to? U svakom sluèaju, ovo su samo +# descriptioni. Za svaki sluèaj, nisam ih dirao. +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Izgubljen resurs" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Signal za opasnost" + +#: signame.c:219 +msgid "Information request" +msgstr "Zahtjev za informacijom" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Aritmetièki koprocesor nije dostupan." + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistike hash tablice spisa\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "podrazumijevano" + +#: variable.c:1544 +msgid "environment" +msgstr "okoli¹" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "okoli¹ pod -e" + +#: variable.c:1553 +msgid "command line" +msgstr "komandna linija" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "direktiva `override'" + +#: variable.c:1559 +msgid "automatic" +msgstr "automatsko" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (iz `%s', redak %lu):" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# hash table statistike varijabli:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Varijable\n" + +#: variable.c:1627 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Uzorcima svojstvene vrijednosti varijabli" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Nema uzorcima svojstvenih vrijednosti varijabli." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u uzorcima svojstvenih vrijednosti varijabli" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "upozorenje: nedefinirana varijabla `%.*s'" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search je zatajila s %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Upozorenje: Prazno preusmjeravanje\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "unutra¹nja gre¹ka: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-upozorenje, mo¾da æete morati ponovo omoguæiti obradu CTRL-Y iz DCL-a.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "UGRAÐEN [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "UGRAÐEN CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "UGRAÐEN RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Nepoznata ugraðena naredba `%s'\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Gre¹ka, prazna naredba\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Preusmjerio ulaz iz %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Preusmjerio gre¹ke u %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Preusmjerio izlaz u %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Preusmjerio izlaz u %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Umjesto toga, izvr¹avam %s\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Gre¹ka pri pokretanju, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH staze za pretra¾ivanje\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Nema `vpath' staza za pretra¾ivanje." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u `vpath' staza za pretra¾ivanje.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Nema opæe (iz varijable `VPATH') staze za pretra¾ivanje." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Opæa (iz varijable `VPATH') staza za pretra¾ivanje:\n" +"# " + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Gre¹ka u sintaksi, jo¹ uvijek unutar '\"'\n" + +# Nepo¾etene ili nepo¾njete? +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Dobio SIGCHLD; %u nepo¾etene djece.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-upozorenje, CTRL-Y æe ostaviti potproces(e) na ¾ivotu.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Nemojte koristiti -j ili --jobs ako sh.exe nije dostupan." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Resetiram make u mod jednog posla." + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sOvaj program je slobodan; u izvornom kodu nalaze se uvjeti kopiranja.\n" +#~ "%sNema NIKAKVOG jamstva, èak ni za PROIZVODNOST ili UPOTREBLJIVOST ZA\n" +#~ "%sPOJEDINU SVRHU.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "suvi¹an `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "prazna direktiva `ovverride'" + +#~ msgid "invalid `override' directive" +#~ msgstr "neispravna direktiva `override'" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "nedostaje naziv spisa za `%sinclude'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "meta `%s' ostavlja prerekvizitni uzorak praznim" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Nijedan spis." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u spisa u %u raspr¹enih d¾epova.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# prosjeèno %.3f spisa po d¾epu, maks. %u spisa u jednom d¾epu.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIREKTORIJ" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Promijeni u DIREKTORIJ prije nego ¹to i¹ta napravi¹" + +#~ msgid "FLAGS" +#~ msgstr "ZASTAVICE" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Zaustavi proces tako da se debugger mo¾e zakaèiti" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Varijable iz okoli¹a imaju veæu va¾nost od makefilea" + +#~ msgid "FILE" +#~ msgstr "SPIS" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Proèitaj SPIS kao makefile" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Pretra¾i DIREKTORIJ za ukljuèenim makefileovima" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Ne pokreæi vi¹estruke poslove osim ako je optereæenje ispod N" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "Nemoj zapravo pokrenuti nijednu naredbu; samo ih ispi¹i" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "Pretpostavi da je SPIS vrlo star i nemoj ga ponovo napraviti" + +#~ msgid "Don't echo commands" +#~ msgstr "Ne ispisuj naredbe" + +#~ msgid "Turns off -k" +#~ msgstr "Iskljuèuje -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Smatraj SPIS beskonaèno novim" + +#~ msgid "Entering" +#~ msgstr "Ulazim u" + +#~ msgid "Leaving" +#~ msgstr "Izlazim iz" + +#~ msgid "# No variables." +#~ msgstr "# Nema varijabli." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# prosjeèno %.1f varijabli po d¾epu, maks. %u u jednom d¾epu.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# prosjeèno %d.%d varijabli po d¾epu, maks. %u u jednom d¾epu.\n" diff --git a/po/id.gmo b/po/id.gmo new file mode 100644 index 0000000..5ef2ce3 Binary files /dev/null and b/po/id.gmo differ diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..3ccb143 --- /dev/null +++ b/po/id.po @@ -0,0 +1,2164 @@ +# Pesan Bahasa Indonesia untuk GNU make +# Copyright (C) 2006 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Arif E. Nugroho , 2006, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2009-01-31 18:30+0700\n" +"Last-Translator: Arif E. Nugroho \n" +"Language-Team: Indonesian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "usaha untuk menggunakan layanan yang tidak didukung: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "touch anggota archive tidak tersedia di VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: Archive `%s' tidak ada" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: `%s' bukan archive yang valid" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: Anggota `%s' tidak terdapat dalam `%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: Kode kembali tidak baik dari ar_member_touch pada `%s'" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module gagal untuk mengekstrak info module, status = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control gagal dengan status = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "tidak dapat membuka perpustakaan `%s' untuk melihat anggota `%s'" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Anggota `%s'%s: %ld bytes pada %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (nama mungkin akan di potong)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Tanggal %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Berhenti.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Anggota archive `%s' mungkin palsu: tidak dihapus" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Anggota archive `%s' mungkin palsu; tidak dihapus" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Menghapus berkas `%s'" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Menghapus berkas `%s'" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# perintah untuk dijalankan" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (bawaan):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (dari `%s', baris %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Direktori\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: tidak dapat melihat statistik.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (kunci %s, mtime %d): tidak dapat dibuka.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (perangkat %d, inode [%d,%d,%d]): tidak dapat dibuka.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (perangkat %ld, inode %ld): tidak dapat dibuka.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (kunci %s, mtime %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (perangkat %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (perangkat %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Tidak" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " berkas, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "tidak" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " tidak mungkin" + +#: dir.c:1075 +msgid " so far." +msgstr " sejauh ini." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " tidak mungkin dalam direktori %lu.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Variabel rekursif `%s' menunjuk pada dirinya sendiri" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "referensi variabel tidak diselesaikan" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Perintah di spesifikasikan untuk berkas `%s' di %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "Perintah untuk berkas `%s' ditemukan dalam pencarian aturan implisit," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "" +"tetapi `%s' sekarang dipertimbangkan sebagai berkas yang sama dengan `%s'." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "Perintah untuk `%s' akan diabaikan untuk menghargai `%s'." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "tidak dapat mengubah nama dari kolon-tunggal `%s' ke kolon-ganda `%s'" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "tidak dapat mengubah nama kolon-ganda `%s' menjadi kolon-tunggal `%s'" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Menghapus berkas sementara `%s'" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Menghapus berkas sementara...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Timestamp diluar jangkauan; digantikan dengan %s" + +#: file.c:804 +msgid "Current time" +msgstr "Waktu saat ini" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Bukan sebuah target:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Berkas sebelumnya (dibutuhkan oleh .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Phony target (dibutuhkan oleh .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Baris-perintah target." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Merupakan baku, MAKEFILES atau -include/sinclude makefile." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Pencarian aturan implisit sudah selesai." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Pencarian aturan implisit belum selesai." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Pola implisit atau statis stem: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Berkas merupakan dibutuhkan untuk sementara." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Juga membuat:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Waktu ubah sudah diperiksa." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Berkas tidak ada." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Berkas sudah sangat tua." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Terakhir dimodifikasi %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Berkas sudah diperbarui." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Berkas belum diperbarui." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Perintah sedang berjalan (INI MERUPAKAN SEBUAH BUG)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Perintah ketergantungan sedang berjalan (INI MERUPAKAN SEBUAH BUG)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Sukses memperbarui." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Perlu untuk diupdate (-q diset)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Gagal untuk mengupdate." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Nilai yang salah dalam anggota `update_status' !" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Nilai yang salah dalam anggota `command_state' !" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Berksa" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# berkas statistik hash-table:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "argumen pertama untuk fungsi `word' bukan numerik" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "argumen pertama untuk fungsi `word' harus lebih besar dari 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "argumen pertama untuk fungsi `wordlist' bukan numerik" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "argumen kedua dari fungsi `wordlist' bukan numerik" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) gagal (e=%ld)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) gagal (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() gagal (e=%ld)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() gagal\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Membersihkan berkas batch sementara %s\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "Jumlah dari argumen (%d) untuk fungsi `%s' tidak mencukupi" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "Tidak terimplementasi dalam platform ini: fungsi `%s'" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "fungsi `%s' tidak diselesaikan: hilang `%c'" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opsi `%s' merupakan ambigu\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: opsi `--%s' tidak memperbolehkan argumen\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: opsi `%c%s' tidak memperbolehkan argumen\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: opsi `%s' membutuhkan sebuah argumen\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opsi tidak dikenali `--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opsi tidak dikenali `%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opsi tidak legal -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opsi tidak valid -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opsi membutuhkan sebuah argumen -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opsi `-W %s' merupakan opsi ambigu\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: opsi `-W %s' tidak memperbolehkan sebuah argumen\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"tidak dapat mengalokasikan %ld bytes untuk tabel hash; kehabisan memory" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Beban=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Tabrakan=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Mencari aturan implisit untuk `%s'.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Mencari aturan implisit untuk anggota-archive pada `%s'.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Menghindari aturan implisit rekursi.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Mencoba aturan pola dengan stem `%.*s'.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Menolak persyaratan aturan yang tidak mungkin `%s'.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Menolak persyaratan implisit yang tidak mungkin `%s'.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Mencoba persyaratan dari aturan `%s'.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Mencoba persyaratan implisit `%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Menemukan persyaratan `%s' sebagai VPATH `%s'\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Mencari aturan dengan berkas sementara `%s'.\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Tidak dapat membuat berkas sementara\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Error 0x%x (diabaikan)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Error 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Error %d (diabaikan)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Error %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (core di-dump)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Menunggu pekerjaan yang belum selesai...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Proses anak yang masih berjalan 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (remote)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Reaping anak hilang 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Reaping winning child 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Membersihkan berkas batch sementara %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Menghilangkan proses anak 0x%08lx PID %ld%s dari rantai.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "menulis jobserver" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Melepaskan token dari proses anak 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() gagal untuk menjalankan proses (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Terhitung %d argumen gagal untuk dijalankan\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Meletakkan proses anak 0x%08lx (%s) PID %ld%s pada rantai proses.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Memperoleh token untuk proses anak 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "membaca pipa pekerjaan" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Tidak perlu membuat lagi target `%s'" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "tidak dapat memaksa mencapai batas beban pada sistem operasi ini" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "tidak dapat memaksa mencapai batas beban: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "tidak ada lagi file handles: tidak dapat menggandakan stdin\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "tidak ada lagi file handles: tidak dapat menggandakan stdout\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Tidak dapat mengembalikan stdin\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Tidak dapat mengembalikan stdout\n" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make reaped child pid %ld, tetap menunggu untuk pid %ld\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Perintah tidak ada" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Shell program tidak ditemukan" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: mungkin kehabisan ruang environment" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL berubah (sebelumnya `%s', sekarang `%s')\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Membuat berkas batch sementara %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (baris %d) shell context tidak baik (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Opsi:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Diabaikan untuk kompatibilitas.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Membuat semua target secara tidak " +"kondisional.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORI, --directory=DIREKTORI\n" +" Pindah ke DIREKTORI sebelum melakukan apapun.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Menampilkan banyak informasi debug.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGS] Menampilkan berbagai tipe informasi debug.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Variabel lingkungan memaksa makefiles.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f BERKAS, --file=BERKAS, --makefile=BERKAS\n" +" Baca BERKAS sebagai sebuah makefile.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Tampilkan pesan ini dan keluar.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" +" -i, --ignore-errors Abaikan kesalahan dari perintah yang " +"dijalankan.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIREKTORI, --include-dir=DIREKTORI\n" +" Cari di DIREKTORI untuk makefile yang " +"disertakan.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Ijinkan N kerja secara bersamaan. Kerja tidak " +"terhingga jika tidak diberikan argumen.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Tetap jalan ketika target tidak dapat dibuat.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Jangan menjalankan multiple pekerjaan kecuali " +"beban dibawah N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Gunakan waktu mtime terbaru diantara symlinks " +"dan target.\n" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Jangan menjalankan perintah apapun; tampilkan " +"saja apa yang akan dikerjakan.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o FILE, --old-file=BERKAS, --assume-old=BERKAS\n" +" Pertimbangkan BERKAS sudah sangat tua dan " +"jangan membuatnya lagi.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Tampilkan basis data internal make.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Tidak menjalankan perintah. Mengeluarkan " +"status saja dan mengatakan up to date.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Aturan implisit bawaan tidak digunakan.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Non-aktifkan konfigurasi variabel bawaan.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Jangan menampilkan perintah.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Matikan opsi -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Sentuh target dari pada membuat kembali.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Tampilkan versi dari make dan keluar.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Tampilkan directory saat ini.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Matikan opsi -w, walaupun opsi ini diaktifkan " +"secara implisit.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W FILE, --what-if=BERKAS, --new-file=BERKAS, --assume-new=BERKAS\n" +" Pertimbangkan BERKAS sebagai sebuah berkas " +"baru.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Peringatkan akan adanya variabel yang tidak " +"terdefinisi yang direferensikan.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "`string' kosong tidak valid sebagai nama file" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "spesifikasi tingkat debug tidak diketahui `%s'" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Interupsi/Exception diterima (kode = 0x%lx, alamat = 0x%lx)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Exception filter tidak dapat diatasi dari program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = %lx\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Akses dilanggar: operasi tulis pada alamat %lx\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Akses dilanggar: operasi baca pada alamat %lx\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell diset pada default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell jalur pencarian di set pada default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s dihentikan selama 30 detik..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "selesai tidur(30). Melanjutkan.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile dari standard input dispesifikasikan dua kali." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (berkas sementara)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (berkas sementara)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Parallel jobs (-j) tidak didukung dalam platform ini." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Mereset kembali ke mode satu job (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "internal error: opsi --jobserver-fds lebih dari satu" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "internal error: tidak valid --jobserver-fds string `%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"Peringatan: -jN dipaksakan dalam submake: non-aktifkan mode server pekerja." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "dup server pekerja" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"Peringatan: server pekerja tidak ada: menggunakan -j1. Tambahkan `+' pada " +"aturan make paling atas." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "membuat pipa pekerjaan" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "inisiasi pipa server pekerja" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "Symbolic links tidak didukung: menonaktifkan opsi -L." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Memperbarui makefiles....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Makefile `%s' mungkin berupa loop; tidak membuat lagi.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Gagal membuat lagi makefile `%s'." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Makefile yang dimasukan `%s' tidak ditemukan." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Makefile `%s' tidak ditemukan" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Tidak dapat kembali ke direktori asal." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Menjalankan kembali[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (berkas sementara): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL berisi lebih dari satu target" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Target tidak dispesifikasikan dan tidak ditemukan makefile" + +#: main.c:2272 +msgid "No targets" +msgstr "Tidak ada targets" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Memperbarui tujuan target....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"Peringatan: Clock skew terdeteksi. Pembuatan anda mungkin tidak sempurna" + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Penggunaan: %s [opsi] [target] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Program ini dibuat untuk %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Program ini dibuat untuk %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Laporkan bugs kepada \n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "opsi `-%c' membutuhkan sebuah argument string yang tidak kosong" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "opsi `-%c' membutuhkan sebuah argument `string' yang tidak kosong" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sAplikasi ini dibuat untuk %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sAplikasi ini dibuat untuk %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Membuat basis data, ditampilkan %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Selesai membuat basis data %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Memasuki sebuah direktori yang tidak diketahui\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Meninggalkan sebuah direktori yang tidak diketahui\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Memasuki direktori `%s'\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Meninggalkan direktori `%s'\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Memasuki sebuah direktori yang tidak diketahui\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Meninggalkan sebuah direktori yang tidak diketahui\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Memasuki direktori `%s'\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Meninggalkan direktori `%s'\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Berhenti.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Kesalahan tidak diketahui %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "Kehabisan memori maya" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: pengguna %lu (ril %lu), grup %lu (ril %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Akses terinisialisasi" + +#: misc.c:808 +msgid "User access" +msgstr "Akses pengguna" + +#: misc.c:856 +msgid "Make access" +msgstr "Buat akses" + +#: misc.c:890 +msgid "Child access" +msgstr "Akses anak" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "error menulis: %s" + +#: misc.c:956 +msgid "write error" +msgstr "error menulis" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Membaca makefiles...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Membaca makefile `%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (tidak terdapat tujuan baku)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (jalur pencarian)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (tidak peduli)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (tidak terdapat ekspansi tilde ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "sintak salah dalam kondisional" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "perintah dijalankan sebelum target pertama" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "hilang aturan sebelum menjalankan perintah" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "pemisah %s hilang" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (apakah yang anda maksud TAB dari pada 8 buah spasi?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "pola target hilang" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "pola target banyak" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "pola target tidak memiliki `%%'" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "hilang `endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "nama variabel kosong" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Kelebihan text sesudah `endef' directive" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "hilang `endef', tidak diselesaikan `define'" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Kelebihan text sesudah `endef' directive" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Kelebihan text sesudah `%s' directive" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "kelebihan `%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "hanya satu `else' dalam setiap kondisi" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Definisi variable target-specific memiliki format yang salah" + +#: read.c:1855 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "persyaratan tidak dapat didefinisikan dalam script perintah" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "aturan pola implisit dan static tercampur" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "aturan implisit dan aturan normal tercampur" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "target `%s' tidak cocok dengan pola target" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "target berkas `%s' keduanya memiliki masukan : dan ::" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "target `%s' memberikan lebih dari sekali dalam aturan sama." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "Peringatan: memaksa perintah untuk target `%s'" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "Peringatan: menghiraukan perintah lama untuk target `%s'" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "Peringatan: karakter NUL terlihat; baris selanjutnya dihiraukan" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Tidak ada yang harus dilakukan untuk `%s'." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s' sudah baru." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Pruning file `%s'.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sTidak terdapat aturan untuk membuat target `%s'%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "" +"%sTidak terdapat aturan untuk membuat target `%s', dibutuhkan oleh `%s'%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Mempertimbangkan berkas target `%s'.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Baru saja dicoba dan gagal untuk memperbarui berkas `%s'.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Berkas `%s' baru saja dipertimbangkan.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Sedang memperbarui berkas `%s'.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Selesai memperbarui berkas `%s'.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Berkas `%s' tidak ada.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Peringatan: .LOW_RESOLUTION_TIME berkas `%s' memiliki sebuah penanda " +"waktu dengan resolusi tinggi" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Ditemukan sebuah aturan implisit untuk `%s'.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Tidak terdapat aturan implisit untuk membuat `%s'.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Menggunakan perintah baku untuk `%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Ketergantungan %s <- %s melingkar dijatuhkan." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Selesai melakukan semua persyaratan untuk berkas target `%s'.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Persyaratan untuk membuat `%s' sedang dibuat.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Menyerah untuk membuat target berkas `%s'.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Target `%s' tidak dibuat lagi karena ada errors." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Persyaratan untuk `%s' adalah order-only untuk target `%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Persyaratan untuk `%s' untuk target `%s' tidak ada.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Persyaratan untuk `%s' lebih baru dari pada target `%s'.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Persyaratan untuk `%s' lebih tua dari pada target `%s'.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Target `%s' merupakan kolon-ganda dan tidak memiliki syarat.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Tidak ada perintah untuk `%s' dan persyaratan tidak berubah.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Membuat `%s' karena adanya tanda always-make.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Tidak perlu membuat lagi target `%s'" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; menggunakan nama VPATH `%s'" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Harus membuat lagi target `%s'.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Mengabaikan nama VPATH `%s'.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Perintah dari `%s' sedang dijalankan.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Gagal membuat lagi target berkas `%s'.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Sukses membuat kembali target berkas `%s'.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Target berkas `%s' dibutuhkan untuk membuat kembali dengan opsi -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Menggunakan perintah baku untuk `%s'.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Peringatan: Berkas `%s' memiliki waktu modifikasi dimasa depan" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Peringatan: Berkas `%s' memiliki waktu modifikasi %.2g s kedepan" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNS elemen `%s' bukan merupakan sebuah pattern" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Custom tidak akan men-export: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Aturan implisit." + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Tidak ada aturan implisit." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u aturan implisit, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminal." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: num_pattern_rules salah! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "sinyal tidak diketahui" + +#: signame.c:94 +msgid "Hangup" +msgstr "Hangup" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Interupsi" + +#: signame.c:100 +msgid "Quit" +msgstr "Berhenti" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Instruksi Tidak Legal" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Penangkap trace/breakpoint" + +#: signame.c:111 +msgid "Aborted" +msgstr "Dibatalkan" + +#: signame.c:114 +msgid "IOT trap" +msgstr "Penangkap IOT" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Penangkap EMT" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Eksepsi titik pecahan" + +#: signame.c:123 +msgid "Killed" +msgstr "Terbunuh" + +#: signame.c:126 +msgid "Bus error" +msgstr "Bus error" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Kesalahan segmentasi" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Panggilan sistem buruk" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Pipa rusak" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Alarm" + +#: signame.c:141 +msgid "Terminated" +msgstr "Dimatikan" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Sinyal definisi pengguna 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Sinyal definisi pengguna 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Proses anak berakhir" + +#: signame.c:158 +msgid "Power failure" +msgstr "Listrik bermasalah" + +#: signame.c:161 +msgid "Stopped" +msgstr "Dihentikkan" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Dihentikan (masukkan tty)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Dihentikan (keluaran tty)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Dihentikan (sinyal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Batas waktu CPU telah terlampaui" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Batas maksimal ukuran berkas terlampaui" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Pewaktu maya habis" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Pewaktu profiling habis" + +#: signame.c:188 +msgid "Window changed" +msgstr "Jendela berubah" + +#: signame.c:191 +msgid "Continued" +msgstr "Dilanjutkan" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Kondisi I/O penting" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O mungkin" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Resource hilang" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Sinyal bahaya" + +#: signame.c:219 +msgid "Information request" +msgstr "Permintaan informasi" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "co-processor titik pecahan tidak tersedia" + +#: strcache.c:235 +#, fuzzy, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s # dari string dalam strcache: %d\n" + +#: strcache.c:237 +#, fuzzy, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s # dari buffer strcache: %d\n" + +#: strcache.c:239 +#, fuzzy, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "besar %s strcache: total = %d / mak = %d / min = %d / rata-rata = %d\n" + +#: strcache.c:241 +#, fuzzy, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s strcache free: total = %d / mak = %d / min = %d / rata-rata = %d\n" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# berkas statistik hash-table:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "baku" + +#: variable.c:1544 +msgid "environment" +msgstr "lingkungan" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "lingkungan dibawah opsi -e" + +#: variable.c:1553 +msgid "command line" +msgstr "baris perintah" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "`override' direktif" + +#: variable.c:1559 +msgid "automatic" +msgstr "otomatis" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (dari `%s', baris %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# statistik variable set hash-table:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabel\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Nilai Variabel Pola-Spesifik" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Tidak terdapat nilai variabel pola-spesifik" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u nilai variabel pola-spesifik" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "peringatan: variabel `%.*s' tidak terdefinisi" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search gagal dengan kode %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Peringatan: redirection kosong\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "kesalahan internal: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-warning, kamu mungkin telah mengaktifkan pengontrolan CTRL-Y dari DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BAWAAN [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BAWAAN CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "BAWAAN RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Perintah bawaan '%s' tidak diketahui\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Error, perintah kosong\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Meneruskan masukan dari %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Meneruskan error ke %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Meneruskan output ke %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Meneruskan output ke %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Menjalankan perintah %s\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Gagal spawning, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Jalur Pencarian\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Tidak ada `vpath' dalam jalur pencarian." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u `vpath' jalur pencarian.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Tidak ada (`VPATH' variabel) umum dalam jalur pencarian." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Jalur pencarian umum untuk variabel `VPATH':\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() gagal untuk menjalankan proses (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sIni adalah piranti lunak bebas; lihat kode program untuk syarat " +#~ "penyalinan.\n" +#~ "%sTIDAK TERDAPAT GARANSI; bahkan untuk PENJUALAN atau \n" +#~ "%sKESESUAIAN UNTUK TUJUAN TERTENTU.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "kelebihan `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "directive `override' kosong" + +#~ msgid "invalid `override' directive" +#~ msgstr "directive `override' tidak valid" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-warning, CTRL-Y akan meninggalkan sub-process(es).\n" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Tidak terdapat files." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u files dalam %u hash buckets.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# rata - rata %.3f files per bucket, maksimal %u files dalam satu " +#~ "bucket.\n" + +#~ msgid "the `word' function takes a positive index argument" +#~ msgstr "fungsi `word' mengambil sebuah argumen index yang positif" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Sintak error, masih didalam '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Mendapat sinyal SIGCHLD; %u unreaped childern.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIREKTORI" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Pindah ke DIRECTORY sebelum melakukan sesuatu." + +#~ msgid "FLAGS" +#~ msgstr "FLAGS" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Proses dihentikan untuk memberikan kesempatan debugger" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Variabel environment digunakan dalam makefiles" + +#~ msgid "FILE" +#~ msgstr "FILE" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Baca FILE sebagai sebuah makefile" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Cari DIREKTORI untuk makefiles yang dibutuhkan" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Tidak melakukan banyak jobs jika beban lebih dari N." + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "" +#~ "Jangan menjalankan perintah apapun. Hanya tampilkan saja apa yang akan " +#~ "dilakukan" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "" +#~ "Anggap FILE sudah sangat tua dan jangan dibuat kembali file tersebut" + +#~ msgid "Don't echo commands" +#~ msgstr "Jangan menampilkan perintah yang dijalankan" + +#~ msgid "Turns off -k" +#~ msgstr "Matikan opsi -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Pertimbangkan FILE sebagai file yang baru." + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Jangan menspesifikasi -j atau --jobs jika sh.exe tidak ada." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Mereset kembali make pada mode job tunggal." + +#~ msgid "Entering" +#~ msgstr "Memasuki" + +#~ msgid "Leaving" +#~ msgstr "Meninggalkan" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "tidak terdapat nama file untuk `%s include'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "target `%s' meninggalkan persyaratan pola kosong" + +#~ msgid "# No variables." +#~ msgstr "# Tidak ada variabel." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# rata - rata dari %.1f variabel per bucket, maksimal %u dalam satu " +#~ "bucket.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# rata - rata dari %d.%d variabel per bucket, maksimal %u dalam satu " +#~ "bucket.\n" diff --git a/po/insert-header.sin b/po/insert-header.sin new file mode 100644 index 0000000..b26de01 --- /dev/null +++ b/po/insert-header.sin @@ -0,0 +1,23 @@ +# Sed script that inserts the file called HEADER before the header entry. +# +# At each occurrence of a line starting with "msgid ", we execute the following +# commands. At the first occurrence, insert the file. At the following +# occurrences, do nothing. The distinction between the first and the following +# occurrences is achieved by looking at the hold space. +/^msgid /{ +x +# Test if the hold space is empty. +s/m/m/ +ta +# Yes it was empty. First occurrence. Read the file. +r HEADER +# Output the file's contents by reading the next line. But don't lose the +# current line while doing this. +g +N +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/it.gmo b/po/it.gmo new file mode 100644 index 0000000..f232b0c Binary files /dev/null and b/po/it.gmo differ diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..df0ce15 --- /dev/null +++ b/po/it.po @@ -0,0 +1,2089 @@ +# Italian messages for GNU Make. +# Copyright (C) 2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Francesco Groccia , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2009-07-23 12:54+0200\n" +"Last-Translator: Francesco Groccia \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "tentativo di usare una funzionalità non supportata: «%s»" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "impossibile modificare la data di un membro di un archivio su VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: l'archivio «%s» non esiste" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: «%s» non è un archivio valido" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: il membro «%s» non esiste in «%s»" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: codice di ritorno errato da ar_member_touch su «%s»" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"lbr$set_module fallito per estrarre informazioni del modulo, stato = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control fallito con lo stato = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "impossibile aprire la libreria «%s» per cercare il membro «%s»" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Membro «%s»%s: %ld byte a %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (il nome potrebbe essere troncato)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modo = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Interruzione.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "" +"*** [%s] L'archivio membro «%s» potrebbe essere inesistente; non eliminato" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** L'archivio membro «%s» potrebbe essere inesistente; non eliminarlo" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Eliminazione del file «%s»" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Eliminazione del file «%s»" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# comandi da eseguire" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (comando interno):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (da «%s», riga %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Directory\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: impossibile eseguire stat.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (key %s, mtime %d): impossibile aprirlo.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (device %d, inode [%d,%d,%d]): impossibile aprirlo.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (device %ld, inode %ld): impossibile aprirlo.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (key %s, mtime %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "No" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " file, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "no" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " impossibilità" + +#: dir.c:1075 +msgid " so far." +msgstr " finora." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilità nelle directory %lu.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "La variabile ricorsiva «%s» si autoreferenzia (finalmente)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "riferimento della variabile non terminato" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Sono stati specificati dei comandi per il file «%s» a %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" +"Sono stati trovati dei comandi per il file «%s» mediante una regola di " +"ricerca implicita," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "ma il file «%s» adesso viene considerato lo stesso di «%s»." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "I comandi per «%s» saranno ignorati in favore di quelli per «%s»." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" +"impossibile rinominare la regola \"single-colon\" «%s» con la regola \"double-" +"colon\" «%s»" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" +"impossibile rinominare la regola \"double-colon\" «%s» con la regola \"single-" +"colon\" «%s»" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Eliminazione del file intermedio «%s»" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Rimozione dei file intermedi...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Intervallo errato per la marcatura temporale; sostituzione di %s" + +#: file.c:804 +msgid "Current time" +msgstr "Ora corrente" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Non è un obiettivo:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# File \"precious\" (prerequisito di .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Obiettivo \"phony\" (prerequisito di .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Obiettivo a riga di comando." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Makefile predefiniti oppure un makefile -include/sinclude." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Regola di ricerca implicita completate." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Regola di ricerca implicita non completate." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Radice del pattern implicita/statica: «%s»\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Il file è un prerequisito intermedio." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Inoltre, genera:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Ora di modifica mai controllata." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Il file non esiste." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Il file è molto vecchio." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Ultima modifica %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Il file è stato aggiornato." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Il file non è stato aggiornato." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Comandi correntemente in esecuzione (QUESTO È UN BUG)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Dipendenze dei comandi in esecuzione (QUESTO È UN BUG)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Aggiornato con successo." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Richiede di essere aggiornato (-q è impostato)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Aggiornamento non riuscito." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Valore non valido nel membro «update_status»" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Valore non valido nel membro «command_state»" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# File" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistiche della tabella di hash dei file:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "primo argomento non numerico per la funzione word" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "il primo argomento per la funzione word deve essere maggiore di 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "primo argomento non numerico per la funzione wordlist" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "secondo argomento non numerico per la funzione wordlist" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) fallita (e=%ld)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) fallita (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() fallita (e=%ld)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() fallita\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Pulitura del file batch temporaneo %s\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "numero di argomenti non sufficienti (%d) per la funzione «%s»" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "non implementata su questa architettura: funzione «%s»" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "chiamata non terminata per la funzione «%s»: «%c» mancante" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: l'opzione «%s» è ambigua\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: l'opzione «--%s» non ammette un argomento\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: l'opzione «%c%s» non ammette un argomento\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: l'opzione «%s» richiede un argomento\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: «--%s» opzione sconosciuta\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: «%c%s» opzione sconosciuta\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opzione non valida -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opzione non valida -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: l'opzione richiede un argomento -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: l'opzione «-W %s» è ambigua\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: l'opzione «-W %s» non ammette un argomento\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "impossibile allocare %ld byte per la tabella hash: memoria esaurita" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Load=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Collisioni=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Ricerca di una regola implicita per «%s».\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "" +"Ricerca di una regola implicita per «%s» usando il nome dell'archivio " +"membro.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Viene evitata la ricorsione della regola implicita.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Viene tentata la regola del pattern con radice «%.*s».\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Viene rifiutata la regola prerequisita \"impossible\" «%s».\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Viene rifiutato il prerequisito implicito \"impossible\" «%s».\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Viene tentata la regola prerequisita «%s».\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Viene tentato il prerequisito implicito «%s».\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Trovato il prerequisito «%s» come VPATH «%s»\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Ricerca di una regola con il \"file intermedio\" «%s».\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Impossibile creare il file temporaneo\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Errore 0x%x (ignorato)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Errore 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Errore %d (ignorato)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Errore %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (core dumped)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Attesa dei processi non terminati...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Processo figlio vivo 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (remoto)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Interruzione del processo figlio perdente 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Interruzione del processo figlio vincente 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Pulitura del file batch temporaneo %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" +"Rimozione del processo figlio 0x%08lx PID %ld%s dalla catena di esecuzione.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "write jobserver" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Token rilasciato per il processo figlio 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() fallita all'avvio del processo (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Contati %d argomenti nell'avvio fallito\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" +"Inserimento del processo figlio 0x%08lx (%s) PID %ld%s sulla catena di " +"esecuzione.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Token ottenuto per il processo figlio 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "lettura della pipe dei processi" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "L'obiettivo «%s» non necessita di essere rigenerato" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "impossibile applicare i limiti di carico su questo sistema operativo" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "impossibile applicare il limite di carico: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "nessun altro file gestito: impossibile duplicare lo standard input\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "nessun altro file gestito: impossibile duplicare lo standard output\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Impossibile ripristinare lo standard input\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Impossibile ripristinare lo standard output\n" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"make ha interrotto il processo figlio con pid %ld, in attesa ancora del " +"processo con pid %ld\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: comando non trovato" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: shell non trovata" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: lo spazio dell'ambiente potrebbe essere esaurito" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL cambiata (era «%s», adesso è «%s»)\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Creazione del file batch temporaneo %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (riga %d) Contesto della shell errato (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Opzioni:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorato per compatibilità.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Genera tutti gli obbiettivi " +"incondizionatamente\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Cambia in DIRECTORY prima di fare qualunque " +"cosa.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Mostra informazioni di debug.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGS] Mostra diversi tipi di informazioni di debug.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Le variabili d'ambiente sovrascrivono i " +"makefile.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Legge FILE come un makefile.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Mostra questo messaggio ed esce.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignora gli errori dei comandi.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Cerca DIRECTORY per i makefile inclusi.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Permette N processi in una volta; infiniti " +"processi senza argomento.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Continua l'esecuzione quando alcuni obbiettivi " +"non possono essere creati.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Non avvia processi multipli a meno che il " +"carico di lavoro è sotto N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Usa il più recente mtime tra i collegamenti " +"simbolici e l'obiettivo.\n" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Non esegue alcun comando; li mostra " +"solamente.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Considera FILE come molto vecchio e non " +"riesegue make.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Mostra il database interno di make.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Non avvia alcun comando; lo stato di uscita " +"dice se è aggiornato.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Disabilita le regole implicite integrate.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Dsabilita le impostazioni delle variabili " +"integrate.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Non visualizza i comandi.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Disattiva l'opzione -k.\n" + +# # touch = in questo contesto è simile alla funzione del comando 'touch' +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Aggiorna la marcatura temporale degli " +"obbiettivi senza ricrearli.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Mostra il numero di versione di make ed esce.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Mostra la directory corrente.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Disattiva l'opzione -w, anche se è stata " +"attivata implicitamente.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Considera FILE come infinitamente nuovo.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Avvisa quando una variabile non definita viene " +"referenziata.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "testo vuoto non valido come nome di file" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "livello di debug specificato sconosciuto «%s»" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: interruzione/eccezione ricevuta (codice = 0x%lx, indirizzo = 0x%lx)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Filtro eccezione non gestita chiamata dal programma %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = %lx\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Violazione accesso: operazione di scrittura all'indirizzo %lx\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Violazione accesso: operazione di lettura all'indirizzo %lx\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell impostazione default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"find_and_set_shell impostazione del percorso di ricerca default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s viene sospeso per 30 secondi..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) eseguito. Continuazione.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Il Makefile dallo standard input è stato specificato due volte." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (file temporaneo)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (file temporaneo)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Processi paralleli (-j) non supportati su questa piattaforma." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Reimposto alla modalità a singolo processo (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "errore interno: opzioni multiple per --jobserver-fds" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "errore interno: testo non valido per --jobserver-fds «%s»" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"attenzione: -jN forzata nel submake: disattivazione della modalità jobserver." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "jobserver duplicato" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"attenzione: jobserver non disponibile: viene usato -j1. Aggiungere «+» alla " +"regola make superiore." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "creazione pipe dei processi" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "inizializzazione della pipe della modalità jobserver" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" +"Collegamenti simbolici non supportati: disabilitazione dell'opzione -L." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Aggiornamento dei makefile....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Il makefile «%s» potrebbe ciclare all'infinito; non viene ricreato.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Riesecuzione del makefile «%s» non riuscita." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Il makefile «%s» incluso non è stato trovato." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Il makefile «%s» non è stato trovato." + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Impossibile ritornare alla directory originale." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Riesecuzione[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (file temporaneo): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL contiene più di un obiettivo" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Nessun obiettivo specificato e nessun makefile trovato" + +#: main.c:2272 +msgid "No targets" +msgstr "Nessun obiettivo" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Aggiornamento degli obbiettivi....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"attenzione: Rilevato un tempo alterato. La costruzione potrebbe essere " +"incompleta." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uso: %s [opzioni] [obiettivo] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Questo programma è stato compilato per %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Questo programma è stato compilato per %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Segnalare i bug all'indirizzo \n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "l'opzione «-%c» richiede un argomento di testo non vuoto" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "l'opzione «-%c» richiede un argomento intero positivo" + +# # anche se manca il verbo "to be" per la forma passiva inglese, traduco in italiano come ci fosse +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sQuesto programma è stato compilato per %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%s Questo programma è stato compilato per %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +# # «%s» è un tipo ctime(3) +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Generazione del database delle informazioni, creato il %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Fine generazione del database il %s\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: entrata directory sconosciuta\n" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: uscita directory sconosciuta\n" + +#: main.c:3242 +#, fuzzy, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: entrato nella directory «%s»\n" + +#: main.c:3245 +#, fuzzy, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: uscito dalla directory «%s»\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: entrata nella directory sconosciuta\n" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: uscita dalla directory sconosciuta" + +#: main.c:3257 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: entrata nella directory «%s»\n" + +#: main.c:3260 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: uscita dalla directory «%s»\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Stop.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Errore %d sconosciuto" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "memoria virtuale esaurita" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: utente %lu (reale %lu), gruppo %lu (reale %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Accesso inizializzato" + +#: misc.c:808 +msgid "User access" +msgstr "Accesso utente" + +#: misc.c:856 +msgid "Make access" +msgstr "Accesso Make" + +#: misc.c:890 +msgid "Child access" +msgstr "Accesso processo figlio" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "errore in scrittura: %s" + +#: misc.c:956 +msgid "write error" +msgstr "errore in scrittura" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Lettura dei makefile...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Lettura del makefile «%s»" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (nessun obiettivo predefinito)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (percorso di ricerca)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (ignora)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (nessuna sostituzione per il carattere «~»)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "sintassi non valida nella condizione" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "i comandi iniziano prima del primo obiettivo" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "regola assente prima dei comandi" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "separatore %s assente" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (si intendeva dire un carattere tabulatore invece di otto spazi?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "obiettivo del pattern assente" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "obiettivo dei pattern multiplo" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "obiettivo del pattern non contiene «%%»" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "«endif» assente" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "nome della variabile vuoto" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Testo estraneo dopo la direttiva «endef»" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "«endef» assente, «define» non terminato" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Testo estraneo dopo la direttiva «endef»" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Testo estraneo dopo la direttiva «%s»" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "«%s» estraneo" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "un solo «else» per condizione" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Definizione della variabile \"target-specific\"" + +#: read.c:1855 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "i prerequisiti non possono essere definiti nei comandi degli script" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "regole del pattern implicite e statiche miste" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "regole implicite e normali miste" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "l'obiettivo «%s» non coincide con l'obiettivo pattern" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "l'obiettivo file «%s» ha entrambe le voci : e ::" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "l'obiettivo «%s» è stato passato più di una volta nella stessa regola." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "attenzione: sovrascrittura dei comandi per l'obiettivo «%s»" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "attenzione: scarto dei vecchi comandi per l'obiettivo «%s»" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" +"attenzione: è stato letto il carattere NUL; il resto della riga viene " +"ignorato" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Nessuna operazione da eseguire per «%s»." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "«%s» è aggiornato." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Il file «%s» è stato tagliato.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sNessuna regola per generare l'obiettivo «%s»%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sNessuna regola per generare l'obiettivo «%s», necessario per «%s»%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Considerato il file obiettivo «%s».\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "" +"L'aggiornamento del file «%s» è stato provato recentemente e non è riuscito.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Il file «%s» è stato già esaminato.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Aggiornamento ancora in corso del file «%s».\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Aggiornamento del file «%s» terminato.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Il file «%s» non esiste.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Attenzione: il file .LOW_RESOLUTION_TIME «%s» ha un'alta risoluzione " +"della marcatura temporale" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Trovata una regola implicita per «%s».\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Nessuna regola implicita trovata per «%s».\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Uso dei comandi predefiniti per «%s».\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Dipendenza circolare %s <- %s scartata." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Prerequisiti del file obiettivo «%s» terminati.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "I prerequisiti di «%s» vengono generati.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Abbandono del file obiettivo «%s».\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "L'obiettivo «%s» non è stato rigenerato a causa degli errori." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Il prerequisito «%s» è solo per l'obiettivo «%s».\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Il prerequisito «%s» dell'obiettivo «%s» non esiste.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Il prerequisito di «%s» è più nuovo dell'obiettivo «%s».\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Il prerequisito «%s» è più vecchio dell'obiettivo «%s».\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "L'obiettivo «%s» è \"double-colon\" e non ha alcun prerequisito.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Nessun comando per «%s» e nessun prerequisito attualmente cambiato.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Generazione di «%s» a causa dell'opzione \"always-make\".\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "L'obiettivo «%s» non necessita di essere rigenerato" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; uso del nome VPATH «%s»" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "L'obiettivo «%s» deve essere rigenerato.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Ignoro il nome VPATH «%s».\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "I comandi di «%s» vengono eseguiti.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Rigenerazione del file obiettivo «%s» non riuscita.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "File obiettivo «%s» rigenerato correttamente.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Il file obiettivo «%s» deve essere rigenerato con l'opzione -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Uso dei comandi predefiniti per «%s».\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Attenzione: il file «%s» ha il tempo di modifica nel futuro" + +# # penso che la stringa "%.2g s" sia "%.2g is" +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Attenzione: il file «%s» ha il tempo di modifica %.2g per il futuro" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "l'elemento .LIBPATTERNS «%s» non è un pattern" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Le personalizzazioni non saranno esportate: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Regole implicite" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Nessuna regola implicita." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u regole implicite, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminale." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "BUG: num_pattern_rules errato! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "segnale sconosciuto" + +#: signame.c:94 +msgid "Hangup" +msgstr "Riaggancia" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Interrompi" + +#: signame.c:100 +msgid "Quit" +msgstr "Esci" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Istruzione illegale" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Intercetta traccia/punto di rottura" + +#: signame.c:111 +msgid "Aborted" +msgstr "Annullato" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT trap" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT trap" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Eccezione virgola mobile" + +#: signame.c:123 +msgid "Killed" +msgstr "Ucciso" + +#: signame.c:126 +msgid "Bus error" +msgstr "Errore del bus" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Errore di segmentazione" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Chiamata di sistema errata" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Pipe interrotta" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Allarme" + +#: signame.c:141 +msgid "Terminated" +msgstr "Terminato" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Segnale 1 definito dall'utente" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Segnale 2 definito dall'utente" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Processo figlio uscito" + +#: signame.c:158 +msgid "Power failure" +msgstr "Blackout" + +#: signame.c:161 +msgid "Stopped" +msgstr "Fermato" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Fermato (tty input)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Fermato (tty output)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Fermato (segnale)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Limite di tempo della CPU superato" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Limite della dimensione dei file superato" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Timer virtuale scaduto" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Profiling timer scaduto" + +#: signame.c:188 +msgid "Window changed" +msgstr "Finestra cambiata" + +#: signame.c:191 +msgid "Continued" +msgstr "Continua" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Condizioni I/O urgenti" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O possibile" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Risorsa persa" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Segnale di pericolo" + +#: signame.c:219 +msgid "Information request" +msgstr "Richiesta informazioni" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Co-processore virgola mobile non disponibile" + +#: strcache.c:235 +#, fuzzy, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s # di stringhe in strcache: %d\n" + +#: strcache.c:237 +#, fuzzy, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s # di buffer strcache: %d\n" + +#: strcache.c:239 +#, fuzzy, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s dimensione strcache: totale = %d / massima = %d / minima = %d / media = %" +"d\n" + +#: strcache.c:241 +#, fuzzy, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s strcache libera: totale = %d / massima = %d / minima = %d / media = %d\n" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistiche della tabella di hash dei file:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "predefinito" + +#: variable.c:1544 +msgid "environment" +msgstr "ambiente" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "ambiente sotto l'opzione -e" + +#: variable.c:1553 +msgid "command line" +msgstr "riga di comando" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "direttiva «override»" + +#: variable.c:1559 +msgid "automatic" +msgstr "automatico" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (da «%s», riga %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# impostazione variabile delle statistiche della tabella di hash:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabili\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valori variabile \"pattern-specific\"" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Nessun valore per la variabile \"pattern-specific\"." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valori della variabile \"pattern-specific\"" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "attenzione: variabile «%.*s» non definita" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search fallita con %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Attenzione: Redirezione vuota\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "errore interno: «%s» command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-attenzione, potresti riabilitare la gestione di CTRL+Y dalla DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "BUILTIN RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Comando interno «%s» sconosciuto\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Errore, comando vuoto\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Input rediretto da %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Errore rediretto a %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Output rediretto a %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Output rediretto a %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s verrà invece eseguito\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Error spawning, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Percorsi di ricerca VPATH\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Nessun percorso di ricerca «vpath»." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# percorsi di ricerca «vpath» %u.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Nessun percorso di ricerca generale (variabile \"VPATH\")." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Percorso di ricerca generale (variabile \"VPATH\"):\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() fallita all'avvio del processo (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sQuesto è software libero; vedere il codice sorgente per le condizioni " +#~ "di utilizzo.\n" +#~ "%sNON c'è garanzia; neanche di COMMERCIABILITÀ o IDONEITÀ\n" +#~ "%sPER UN PARTICOLARE SCOPO.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "«endef» estraneo" + +#~ msgid "empty `override' directive" +#~ msgstr "direttiva «override» vuota" + +#~ msgid "invalid `override' directive" +#~ msgstr "direttiva «override» non valida" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "" +#~ "-attenzione, CTRL+Y lascierà il sottoprocesso (o i sottoprocessi).\n" diff --git a/po/ja.gmo b/po/ja.gmo new file mode 100644 index 0000000..990a70f Binary files /dev/null and b/po/ja.gmo differ diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..1791f48 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,2086 @@ +# Japanese message for make 3.80 +# Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc. +# GOTO Masanori , 2003-2004. +# Daisuke Yamashita , 2001. +# Thanks to NISHIJIMA Takanori +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.80\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2004-05-18 00:47+0900\n" +"Last-Translator: GOTO Masanori \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=EUC-JP\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤µ¡Ç½¤ò»È¤ª¤¦¤È¤·¤Æ¤¤¤Þ¤¹: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "VMS ¤Ç¤Ï½ñ¸Ë¤Î¥á¥ó¥Ð¤ò touch ¤¹¤ëµ¡Ç½¤¬¤¢¤ê¤Þ¤»¤ó" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: ½ñ¸Ë `%s' ¤¬¤¢¤ê¤Þ¤»¤ó" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: `%s' ¤ÏÀµ¾ï¤Ê½ñ¸Ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: ¥á¥ó¥Ð `%s' ¤Ï `%s' Æâ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: `%s' ¤Ø¤Î ar_member_touch ¤«¤é°Û¾ï¤ÊÃͤ¬ÊÖ¤ê¤Þ¤·¤¿" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module ¤¬¥â¥¸¥å¡¼¥ë¾ðÊó¤ÎÃê½Ð¤Ë¼ºÇÔ¤·¤Þ¤·¤¿. ¾õÂÖ = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control ¤¬¼ºÇÔ¤·¤Þ¤·¤¿. ¾õÂÖ = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "¥é¥¤¥Ö¥é¥ê `%s' ¤ò³«¤±¤º, ¥á¥ó¥Ð `%s' ¤Î¸¡º÷¤¬¤Ç¤­¤Þ¤»¤ó" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "¥á¥ó¥Ð `%s'%s: %ld ¥Ð¥¤¥È at %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (̾Á°¤¬ÀÚ¤êµÍ¤á¤é¤ì¤¿¤«¤â)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " ÆüÉÕ %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** ÃæÃÇ.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] ½ñ¸Ë¥á¥ó¥Ð `%s' ¤Ï¿ʬµ¶Êª¤Ç¤¹ ¡½ ºï½ü¤·¤Þ¤»¤ó¤Ç¤·¤¿" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** ½ñ¸Ë¥á¥ó¥Ð `%s' ¤Ï¿ʬµ¶Êª¤Ç¤¹ ¡½ ºï½ü¤·¤Þ¤»¤ó¤Ç¤·¤¿" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] ¥Õ¥¡¥¤¥ë `%s' ¤òºï½ü¤·¤Þ¤¹" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** ¥Õ¥¡¥¤¥ë `%s' ¤òºï½ü¤·¤Þ¤¹" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# ¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (¥Ó¥ë¥È¥¤¥ó):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (`%s', %lu ¹ÔÌܤ«¤é):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# ¥Ç¥£¥ì¥¯¥È¥ê\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: ¾õÂÖ¤òÄ´¤Ù¤é¤ì¤Þ¤»¤ó¤Ç¤·¤¿.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (key %s, mtime %d): ³«¤±¤Þ¤»¤ó¤Ç¤·¤¿.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (device %d, inode [%d,%d,%d]): ³«¤±¤Þ¤»¤ó¤Ç¤·¤¿.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (device %ld, inode %ld): ³«¤±¤Þ¤»¤ó¤Ç¤·¤¿.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (key %s, mtime %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (device %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (device %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "0" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " ¸Ä¤Î¥Õ¥¡¥¤¥ë, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "0" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " ¸Ä¤ÎŬÍÑÉÔǽ¥Õ¥¡¥¤¥ë̾" + +#: dir.c:1075 +msgid " so far." +msgstr " (¤³¤³¤Þ¤Ç¤Ë)." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " ¸Ä¤ÎŬÍÑÉÔǽ¥Õ¥¡¥¤¥ë̾ (%lu ¸Ä¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ).\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "ºÆµ¢ÅªÊÑ¿ô `%s' ¤¬(ºÇ½ªÅª¤Ë)¤½¤ì¼«¿È¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "½ªÃ¼¤Î¤Ê¤¤ÊÑ¿ô»²¾È" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "¥Õ¥¡¥¤¥ë `%s' ¤Ø¤Î¥³¥Þ¥ó¥É¤¬ %s:%lu ¤Ç»ØÄꤵ¤ì¤Þ¤·¤¿." + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "¥Õ¥¡¥¤¥ë `%s' ¤Ø¤Î¥³¥Þ¥ó¥É¤Ï°ÅÌۥ롼¥ë¤Îõº÷¤Ç¸«¤Ä¤«¤ê¤Þ¤·¤¿," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "¤·¤«¤·º£¤Ï `%s' ¤È `%s' ¤ÏƱ¤¸¥Õ¥¡¥¤¥ë¤È¸«¤Ê¤µ¤ì¤Þ¤¹." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "`%s' ¤Ø¤Î¥³¥Þ¥ó¥É¤Ï, `%s' ¤òÁª¤Ö¤³¤È¤Çº£¸å̵»ë¤µ¤ì¤Þ¤¹." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "¥·¥ó¥°¥ë¥³¥í¥ó `%s' ¤«¤é¥À¥Ö¥ë¥³¥í¥ó `%s' ¤Ë̾Á°¤òÊѤ¨¤é¤ì¤Þ¤»¤ó" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "¥À¥Ö¥ë¥³¥í¥ó `%s' ¤«¤é¥·¥ó¥°¥ë¥³¥í¥ó `%s' ¤Ë̾Á°¤òÊѤ¨¤é¤ì¤Þ¤»¤ó" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Ãæ´Ö¥Õ¥¡¥¤¥ë `%s' ¤òºï½ü¤·¤Þ¤¹" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Ãæ´Ö¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Æ¤¤¤Þ¤¹...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: ¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬Èϰϳ°¤Ç¤¹ -- Âå¤ê¤Ë %s ¤È¤·¤Þ¤¹" + +#: file.c:804 +msgid "Current time" +msgstr "¸½ºß»þ¹ï" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# ¥¿¡¼¥²¥Ã¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# ÆÃÊÌ°·¤¤¤Î¥Õ¥¡¥¤¥ë (.PRECIOUS ¤ÎɬÍ×¾ò·ï)" + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# µ¿»÷¥¿¡¼¥²¥Ã¥È (.PHONY ¤ÎɬÍ×¾ò·ï)" + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# ¥³¥Þ¥ó¥É¥é¥¤¥ó¥¿¡¼¥²¥Ã¥È." + +#: file.c:935 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# ¥Ç¥Õ¥©¥ë¥È¤Þ¤¿¤Ï MAKEFILES ¥á¥¤¥¯¥Õ¥¡¥¤¥ë." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# °ÅÌۥ롼¥ë¤Îõº÷¤¬¹Ô¤ï¤ì¤Þ¤·¤¿." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# °ÅÌۥ롼¥ë¤Îõº÷¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¤Ç¤·¤¿." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# °ÅÌÛ/ÀÅŪ¥Ñ¥¿¡¼¥ó¸ì´´: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# ¥Õ¥¡¥¤¥ë¤ÏÃæ´ÖɬÍ×¾ò·ï¤Ç¤¹." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# ¤µ¤é¤Ë make:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# ½¤Àµ»þ¹ï¤¬¥Á¥§¥Ã¥¯¤µ¤ì¤ë¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# ¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó." + +#: file.c:956 +msgid "# File is very old." +msgstr "# ¥Õ¥¡¥¤¥ë¤¬Èó¾ï¤Ë¸Å¤¤¤Ç¤¹." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# ºÇ½ª½¤Àµ %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# ¥Õ¥¡¥¤¥ë¤Ï¹¹¿·¤µ¤ì¤Æ¤¤¤Þ¤¹." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# ¥Õ¥¡¥¤¥ë¤Ï¹¹¿·¤µ¤ì¤Æ¤¤¤Þ¤»¤ó." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# ¥³¥Þ¥ó¥É¤¬¸½ºß¼Â¹ÔÃæ¤Ç¤¹ (*¤³¤ì¤Ï¥Ð¥°¤Ç¤¹*)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# °Í¸´Ø·¸¥³¥Þ¥ó¥É¤¬¼Â¹ÔÃæ¤Ç¤¹ (*¤³¤ì¤Ï¥Ð¥°¤Ç¤¹*)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# ¹¹¿·¤ËÀ®¸ù¤·¤Þ¤·¤¿." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# ¹¹¿·¤¬É¬ÍפǤ¹ (-q ¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Þ¤¹)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# ¹¹¿·¤Ë¼ºÇÔ¤·¤Þ¤·¤¿." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# `update_status' ¥á¥ó¥Ð¤Ë̵¸ú¤ÊÃÍ!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# `command_state' ¥á¥ó¥Ð¤Ë̵¸ú¤ÊÃÍ!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# ¥Õ¥¡¥¤¥ë" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# ¥Õ¥¡¥¤¥ë¥Ï¥Ã¥·¥å¥Æ¡¼¥Ö¥ë¤Î¾õÂÖ:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "Èó¿ôÃͤÎÂè°ì°ú¿ô¤¬ `word' ´Ø¿ô¤ËÍ¿¤¨¤é¤ì¤Þ¤·¤¿" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "`word' ´Ø¿ô¤Ø¤ÎÂè°ì°ú¿ô¤Ï 0 ¤è¤êÂ礭¤¯¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "Èó¿ôÃͤÎÂè°ì°ú¿ô¤¬ `wordlist' ´Ø¿ô¤ËÍ¿¤¨¤é¤ì¤Þ¤·¤¿" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "Èó¿ôÃͤÎÂèÆó°ú¿ô¤¬ `wordlist' ´Ø¿ô¤ËÍ¿¤¨¤é¤ì¤Þ¤·¤¿" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) ¤¬¼ºÇÔ (e=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) ¤¬¼ºÇÔ (e=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() ¤¬¼ºÇÔ (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() ¤¬¼ºÇÔ\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "°ì»þŪ¤Ê¥Ð¥Ã¥Á¥Õ¥¡¥¤¥ë %s ¤ò¾Ãµî¤·¤Þ¤¹\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "°ú¿ô¤Î¿ô(%d)¤¬´Ø¿ô `%s' ¤Ë¤È¤Ã¤ÆÉÔ½½Ê¬¤Ç¤¹" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "¤³¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó: ´Ø¿ô `%s'" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "½ªÃ¼¤¬¤Ê¤¤´Ø¿ô¸Æ¤Ó½Ð¤· `%s': `%c' ¤¬¤¢¤ê¤Þ¤»¤ó" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤ÏÛ£Ëæ¤Ç¤¹\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `--%s' ¤Ï°ú¿ô¤ò¼è¤ê¤Þ¤»¤ó\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `%c%s' ¤Ï°ú¿ô¤ò¼è¤ê¤Þ¤»¤ó\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤Ë¤Ï°ú¿ô¤¬É¬ÍפǤ¹\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ǧ¼±¤Ç¤­¤Ê¤¤¥ª¥×¥·¥ç¥ó `--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ǧ¼±¤Ç¤­¤Ê¤¤¥ª¥×¥·¥ç¥ó `%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ÉÔÀµ¤Ê¥ª¥×¥·¥ç¥ó ¡½ %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ̵¸ú¤Ê¥ª¥×¥·¥ç¥ó ¡½ %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¤Ë¤Ï°ú¿ô¤¬É¬ÍפǤ¹ ¡½ %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤ÏÛ£Ëæ¤Ç¤¹\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤Ï°ú¿ô¤ò¼è¤ê¤Þ¤»¤ó\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"¥Ï¥Ã¥·¥å¥Æ¡¼¥Ö¥ëÍÑ %ld ¥Ð¥¤¥È¤Î³ä¤êÅö¤Æ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: ¥á¥â¥ê¤ò»È¤¤²Ì¤¿¤·¤Þ¤·" +"¤¿" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Load=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Collisions=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "`%s' ¤Î¤¿¤á¤Î°ÅÌۥ롼¥ë¤òõ¤·¤Þ¤¹.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "`%s' ¤Î¤¿¤á¤Î½ñ¸Ë¥á¥ó¥Ð°ÅÌۥ롼¥ë¤òõ¤·¤Þ¤¹.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "°ÅÌۥ롼¥ë¤ÎºÆµ¢¤ò²óÈò¤·¤Þ¤¹.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "¸ì´´ `%.*s' ¤È¤Î¥Ñ¥¿¡¼¥ó¥ë¡¼¥ë¤ò»î¤·¤Þ¤¹.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "ŬÍÑÉÔǽ¤Ê¥ë¡¼¥ë¤ÎɬÍ×¾ò·ï `%s' ¤òµÑ²¼¤·¤Þ¤¹.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "ŬÍÑÉÔǽ¤Ê°ÅÌÛ¤ÎɬÍ×¾ò·ï `%s' ¤òµÑ²¼¤·¤Þ¤¹.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "¥ë¡¼¥ë¤ÎɬÍ×¾ò·ï `%s' ¤ò»î¤·¤Þ¤¹.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "°ÅÌÛ¤ÎɬÍ×¾ò·ï `%s' ¤ò»î¤·¤Þ¤¹.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "VPATH `%2$s' ¤È¤·¤ÆɬÍ×¾ò·ï `%1$s' ¤ò¸«¤Ä¤±¤Þ¤·¤¿\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Ãæ´Ö¥Õ¥¡¥¤¥ë `%s' ¤Î¥ë¡¼¥ë¤òõ¤·¤Þ¤¹.\n" + +#: job.c:335 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (°ì»þ¥Õ¥¡¥¤¥ë)" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] ¥¨¥é¡¼ 0x%x (̵»ë¤µ¤ì¤Þ¤·¤¿)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] ¥¨¥é¡¼ 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] ¥¨¥é¡¼ %d (̵»ë¤µ¤ì¤Þ¤·¤¿)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] ¥¨¥é¡¼ %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (¥³¥¢¥À¥ó¥×¤·¤Þ¤·¤¿)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ̤´°Î»¤Î¥¸¥ç¥Ö¤òÂԤäƤ¤¤Þ¤¹...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "À¸Â¸»Ò¥×¥í¥»¥¹ 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (¥ê¥â¡¼¥È)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "¼º¤Ã¤¿»Ò¥×¥í¥»¥¹ 0x%08lx PID %ld %s ¤ò²ó¼ý¤·¤Þ¤¹\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "À®¸ù¤·¤¿»Ò¥×¥í¥»¥¹ 0x%08lx PID %ld %s ¤ò²ó¼ý¤·¤Þ¤¹\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "°ì»þŪ¤Ê¥Ð¥Ã¥Á¥Õ¥¡¥¤¥ë %s ¤òÊÒÉÕ¤±¤Þ¤¹\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "¥Á¥§¥¤¥ó¤«¤é»Ò¥×¥í¥»¥¹ 0x%08lx PID %ld%s ¤òºï½ü¤·¤Þ¤¹.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "¥¸¥ç¥Ö¥µ¡¼¥Ð¤Ø¤Î write" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "»Ò¥×¥í¥»¥¹ 0x%08lx (%s) ¤Î°õ¤ò²òÊü¤·¤Þ¤·¤¿.\n" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() ¤¬¼ºÇÔ¤·¥×¥í¥»¥¹µ¯Æ°¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿ (e=%d)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"µ¯Æ°¤Î¼ºÇÔ¤Ç %d ¸Ä¤Î°ú¿ô¤¬¥«¥¦¥ó¥È¤µ¤ì¤Þ¤·¤¿\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "¥Á¥§¥¤¥ó¤Ë»Ò¥×¥í¥»¥¹ 0x%08lx (%s) PID %ld%s ¤ò¼è¤ê¹þ¤ß¤Þ¤·¤¿.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "»Ò¥×¥í¥»¥¹ 0x%08lx (%s) ¤Ë°õ¤¬¤Ä¤±¤é¤ì¤Þ¤·¤¿.\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "¥¸¥ç¥Ö¤Î¥Ñ¥¤¥×¤Î read" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "¥¿¡¼¥²¥Ã¥È `%s' ¤òºÆ make ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "¤³¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤Ç¤Ï¥·¥¹¥Æ¥àÉé²ÙÀ©¸Â¤ò²Ã¤¨¤é¤ì¤Þ¤»¤ó" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "¥·¥¹¥Æ¥àÉé²ÙÀ©¸Â¤Î²Ý¤¹¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make ¤Ï pid %d ¤Î»Ò¥×¥í¥»¥¹¤ò²ó¼ý¤·, pid %d ¤òÂÔ¤Á³¤±¤Þ¤¹\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: ¥³¥Þ¥ó¥É¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: ¥·¥§¥ë¥×¥í¥°¥é¥à¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, fuzzy, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL ¤¬Êѹ¹¤µ¤ì¤Þ¤·¤¿ (Á°¤Ï `%s', º£¤Ï `%s')" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "°ì»þŪ¤Ê¥Ð¥Ã¥Á¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤·¤Þ¤¹\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (%d ¹ÔÌÜ) ÉÔÀµ¤Ê¥·¥§¥ë¥³¥ó¥Æ¥­¥¹¥È (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "¥ª¥×¥·¥ç¥ó:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m ¸ß´¹À­¤Î¤¿¤á¤Î¤â¤Î¤Ç, ̵»ë¤µ¤ì¤ë.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make ̵¾ò·ï¤ËÁ´¥¿¡¼¥²¥Ã¥È¤ò make ¤¹¤ë.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" make ³«»ÏÁ°¤Ë¥Ç¥£¥ì¥¯¥È¥ê DIRECTORY ¤Ø°ÜÆ°¤¹" +"¤ë.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d ¥Ç¥Ð¥Ã¥°¾ðÊó¤òÂçÎ̤Ëɽ¼¨¤¹¤ë.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr " --debug[=FLAGS] ÍÍ¡¹¤Ê¥¿¥¤¥×¤Î¥Ç¥Ð¥Ã¥°¾ðÊó¤òɽ¼¨¤¹¤ë.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" ´Ä¶­ÊÑ¿ô¤¬ makefile Ãæ¤Îµ­½Ò¤ËÍ¥À褹¤ë\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" FILE ¤ò makefile ¤È¤·¤ÆÆɤ߹þ¤à\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help ¤³¤Î¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Æ½ªÎ»¤¹¤ë.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors ¥³¥Þ¥ó¥É¤«¤éÊÖ¤µ¤ì¤¿¥¨¥é¡¼¤ò̵»ë¤¹¤ë.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +" ¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ë makefile ¤òõº÷¤¹¤ë " +"DIRECTORY.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] °ìÅÙ¤Ë N ¸Ä¤Þ¤Ç¤Î¥¸¥ç¥Ö¤òµö²Ä; ̵°ú¿ô¤À¤È¥¸¥ç¥Ö" +"¿ôÀ©¸Â¤Ê¤·.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going ¤¢¤ë¥¿¡¼¥²¥Ã¥È¤¬ make ¤Ç¤­¤Ê¤¯¤Æ¤â¼Â¹Ô¤ò³¤±" +"¤ë.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Éé²Ù ¤¬ N ̤Ëþ¤Ç¤Ê¤¤¸Â¤êÊ£¿ô¤Î¥¸¥ç¥Ö¤ò³«»Ï¤·¤Ê" +"¤¤.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" ¥³¥Þ¥ó¥É¤ò¼ÂºÝ¤Ë¼Â¹Ô¤·¤Ê¤¤; ɽ¼¨¤¹¤ë¤Î¤ß.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" FILE ¤ò¤È¤Æ¤â¸Å¤¤¤â¤Î¤È¸«¤Ê¤·¤Æ, ºÆ make ¤·¤Ê" +"¤¤.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base make ¤ÎÆâÉô¥Ç¡¼¥¿¥Ù¡¼¥¹¤òɽ¼¨¤¹¤ë.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Ê¤¤; ¹¹¿·ºÑ¤Ç¤¢¤ë¤«¤É¤¦¤«¤ò½ª" +"λ¥¹¥Æ¡¼¥¿¥¹¤ÇÄÌÃÎ.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules ¥Ó¥ë¥È¥¤¥ó¤Î°ÅÌۥ롼¥ë¤ò̵¸ú¤Ë¤¹¤ë.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables ¥Ó¥ë¥È¥¤¥ó¤ÎÊÑ¿ôÀßÄê¤ò̵¸ú¤Ë¤¹¤ë.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet ¥³¥Þ¥ó¥Éɽ¼¨¤ò¥¨¥³¡¼¤·¤Ê¤¤.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" -k ¥ª¥×¥·¥ç¥ó¤ò¥ª¥Õ¤Ë¤¹¤ë.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch ¥¿¡¼¥²¥Ã¥È¤òºÆ make ¤¹¤ëÂå¤ï¤ê¤Ë¥¿¥Ã¥Á¤¹¤ë.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version make ¤Î¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òɽ¼¨¤·¤Æ½ªÎ»¤¹¤ë.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory ¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¤òɽ¼¨¤¹¤ë.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory -w ¤ò¥ª¥Õ¤Ë¤¹¤ë. °ÅÌÛ¤ËÍ­¸ú¤Ê¾ì¹ç¤Ç¤â¥ª¥Õ¤Ë¤¹" +"¤ë.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" FILE ¤ò¤¤¤Ä¤Ç¤âºÇ¿·¤È¤·¤Æ¸«¤Ê¤¹.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables ̤ÄêµÁ¤ÎÊÑ¿ô¤¬»²¾È¤µ¤ì¤¿¤È¤­¤Ë·Ù¹ð¤òȯ¤¹¤ë.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "¶õ¤Îʸ»úÎó¤Ï¥Õ¥¡¥¤¥ë̾¤È¤·¤Æ¤Ï̵¸ú¤Ç¤¹" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "ÉÔÌÀ¤Ê¥Ç¥Ð¥Ã¥°¥ì¥Ù¥ë»ØÄê `%s'" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: ³ä¤ê¹þ¤ß/Îã³°¤òÊ᪤·¤Þ¤·¤¿ (code = 0x%x, addr = 0x%x)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"¥Ï¥ó¥É¥ë¤µ¤ì¤Ê¤«¤Ã¤¿Îã³°¥Õ¥£¥ë¥¿¤¬¥×¥í¥°¥é¥à %s ¤«¤é¸Æ¤Ð¤ì¤Þ¤·¤¿\n" +"Îã³°¥³¡¼¥É = %x\n" +"Îã³°¥Õ¥é¥° = %x\n" +"Îã³°¥¢¥É¥ì¥¹ = %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "¥¢¥¯¥»¥¹Êݸî°ãÈ¿: ¥¢¥É¥ì¥¹ %x ¤Ç¤Î½ñ¤­¹þ¤ßÁàºî\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "¥¢¥¯¥»¥¹Êݸî°ãÈ¿: ¥¢¥É¥ì¥¹ %x ¤Ç¤ÎÆɤ߹þ¤ßÁàºî\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell ¤Ï default_shell = %s ¤ËÀßÄꤷ¤Þ¤¹\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell ¥Ñ¥¹Ãµº÷¤Ç default_shell = %s ¤Ë¥»¥Ã¥È¤·¤Þ¤·¤¿\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s ¤Ï 30 ÉôÖÄä»ß¤·¤Þ¤¹..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) ¤¬½ª¤ï¤ê¤Þ¤·¤¿. ³¤±¤Þ¤¹.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "ɸ½àÆþÎϤ«¤é¤Î makefile ¤¬Æó²ó»ØÄꤵ¤ì¤Þ¤·¤¿." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (°ì»þ¥Õ¥¡¥¤¥ë)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (°ì»þ¥Õ¥¡¥¤¥ë)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "ÊÂÎ󥸥ç¥Ö (-j) ¤Ï¤³¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "ñ°ì¥¸¥ç¥Ö (-j1) ¥â¡¼¥É¤Ë¥ê¥»¥Ã¥È¤·¤Þ¤¹." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "ÆâÉô¥¨¥é¡¼: Ê£¿ô¤Î --jobserver-fds ¥ª¥×¥·¥ç¥ó" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "ÆâÉô¥¨¥é¡¼: ̵¸ú¤Ê --jobserver-fds ʸ»úÎó `%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"·Ù¹ð: Éû¼¡ make ¤Ç -jN ¤ò¶¯À©»ØÄꤷ¤Þ¤·¤¿: jobserver ¥â¡¼¥É¤ò̵¸ú¤Ë¤·¤Þ¤¹." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"·Ù¹ð: jobserver ¤¬ÍøÍÑÉÔ²Ä: -j1 ¤ò»È¤¤, ¿Æ make ¥ë¡¼¥ë¤Ë `+' ¤òÄɲä·¤Þ¤·¤ç¤¦" + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "¥¸¥ç¥Ö¥Ñ¥¤¥×ºîÀ®Ãæ" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "jobserver ¥Ñ¥¤¥×¤Î½é´ü²½" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "makefile ¤Î¹¹¿·Ãæ....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "makefile `%s' ¼«¸ÊºÆµ¢¤Î¤ª¤½¤ì ¡½ ºÆ make ¤·¤Þ¤»¤ó.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "makefile `%s' ¤ÎºÆ make ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤ë makefile `%s' ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "makefile `%s' ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "¸µ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÌá¤ì¤Þ¤»¤ó¤Ç¤·¤¿." + +#: main.c:2102 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "ºÆ¼Â¹Ô¤·¤Þ¤¹:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (°ì»þ¥Õ¥¡¥¤¥ë): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "¥¿¡¼¥²¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤ª¤é¤º, makefile ¤â¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#: main.c:2272 +msgid "No targets" +msgstr "¥¿¡¼¥²¥Ã¥È¤¬¤¢¤ê¤Þ¤»¤ó" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "ºÇ½ª¥¿¡¼¥²¥Ã¥È¤ò¹¹¿·Ãæ....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "·Ù¹ð: »þ¹ï¤Î¤º¤ì¤ò¸¡½Ð. ÉÔ´°Á´¤Ê¥Ó¥ë¥É·ë²Ì¤Ë¤Ê¤ë¤«¤â¤·¤ì¤Þ¤»¤ó." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "»È¤¤Êý: %s [¥ª¥×¥·¥ç¥ó] [¥¿¡¼¥²¥Ã¥È] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"¤³¤Î¥×¥í¥°¥é¥à¤Ï %s ÍѤ˥ӥë¥É¤µ¤ì¤Þ¤·¤¿\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"¤³¤Î¥×¥í¥°¥é¥à¤Ï %s (%s) ÍѤ˥ӥë¥É¤µ¤ì¤Þ¤·¤¿\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "¥Ð¥°¥ì¥Ý¡¼¥È¤Ï ¤Þ¤Ç.\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "`-%c' ¥ª¥×¥·¥ç¥ó¤ÏÀµ¤ÎÀ°¿ô°ú¿ô¤òÍ׵ᤷ¤Þ¤¹" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "`-%c' ¥ª¥×¥·¥ç¥ó¤ÏÀµ¤ÎÀ°¿ô°ú¿ô¤òÍ׵ᤷ¤Þ¤¹" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"¤³¤Î¥×¥í¥°¥é¥à¤Ï %s ÍѤ˥ӥë¥É¤µ¤ì¤Þ¤·¤¿\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"¤³¤Î¥×¥í¥°¥é¥à¤Ï %s (%s) ÍѤ˥ӥë¥É¤µ¤ì¤Þ¤·¤¿\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make ¥Ç¡¼¥¿¥Ù¡¼¥¹½ÐÎÏ %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Make ¥Ç¡¼¥¿¥Ù¡¼¥¹½ªÎ» %s\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê(¥Ç¥£¥ì¥¯¥È¥ê̾ÉÔÌÀ)¤ËÆþ¤ê¤Þ¤¹" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê(¥Ç¥£¥ì¥¯¥È¥ê̾ÉÔÌÀ)¤«¤é½Ð¤Þ¤¹" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê `%s' ¤ËÆþ¤ê¤Þ¤¹\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê `%s' ¤«¤é½Ð¤Þ¤¹\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: ¥Ç¥£¥ì¥¯¥È¥ê(¥Ç¥£¥ì¥¯¥È¥ê̾ÉÔÌÀ)¤ËÆþ¤ê¤Þ¤¹" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: ¥Ç¥£¥ì¥¯¥È¥ê(¥Ç¥£¥ì¥¯¥È¥ê̾ÉÔÌÀ)¤«¤é½Ð¤Þ¤¹" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: ¥Ç¥£¥ì¥¯¥È¥ê `%s' ¤ËÆþ¤ê¤Þ¤¹\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: ¥Ç¥£¥ì¥¯¥È¥ê `%s' ¤«¤é½Ð¤Þ¤¹\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Ãæ»ß.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "̤ÃΤΥ¨¥é¡¼ %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "²¾ÁÛ¥á¥â¥ê¤ò»È¤¤²Ì¤¿¤·¤Þ¤·¤¿" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: ¥æ¡¼¥¶ %lu (¼Â¸ú %lu), ¥°¥ë¡¼¥× %lu (¼Â¸ú %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "¥¢¥¯¥»¥¹¸¢¸Â¤ò½é´ü²½" + +#: misc.c:808 +msgid "User access" +msgstr "¥æ¡¼¥¶¥¢¥¯¥»¥¹" + +#: misc.c:856 +msgid "Make access" +msgstr "make ¥¢¥¯¥»¥¹" + +#: misc.c:890 +msgid "Child access" +msgstr "»Ò¥×¥í¥»¥¹¥¢¥¯¥»¥¹" + +#: misc.c:954 +#, fuzzy, c-format +msgid "write error: %s" +msgstr "%s ¤Ø¥¨¥é¡¼¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤Þ¤·¤¿\n" + +#: misc.c:956 +#, fuzzy +msgid "write error" +msgstr "¥¸¥ç¥Ö¥µ¡¼¥Ð¤Ø¤Î write" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "makefile ¤òÆɤ߹þ¤ß¤Þ¤¹...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "makefile `%s' ¤ÎÆɤ߹þ¤ßÃæ" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (¥Ç¥Õ¥©¥ë¥È¤ÎºÇ½ª¥¿¡¼¥²¥Ã¥È¤¬¤¢¤ê¤Þ¤»¤ó)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (õº÷¥Ñ¥¹)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (µ¤¤Ë¤·¤Ê¤¯¤Æ¤è¤¤)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (~ ¤ÎŸ³«¤Ê¤·)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "¾ò·ïÉô¤Îʸˡ¤¬Ìµ¸ú¤Ç¤¹" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "ºÇ½é¤Î¥¿¡¼¥²¥Ã¥È¤è¤êÁ°¤Ë¥³¥Þ¥ó¥É¤òµ¯Æ°" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "¥³¥Þ¥ó¥É¤è¤êÁ°¤Ç¥ë¡¼¥ë¤¬»Ø¼¨¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "ʬΥµ­¹æ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (8 ¸Ä¤Î¶õÇò¤Ç¤·¤¿¤¬, TAB ¤Î¤Ä¤â¤ê¤Ç¤·¤¿¤«?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "¥¿¡¼¥²¥Ã¥È¥Ñ¥¿¡¼¥ó¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "Ê£¿ô¤Î¥¿¡¼¥²¥Ã¥È¥Ñ¥¿¡¼¥ó¤Ç¤¹" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "¥¿¡¼¥²¥Ã¥È¥Ñ¥¿¡¼¥ó¤¬ `%%' ¤ò´Þ¤ó¤Ç¤¤¤Þ¤»¤ó" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "`endif' ¤ò·ç¤¤¤Æ¤¤¤Þ¤¹" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "¶õ¤ÎÊÑ¿ô̾" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "`endef' µ¿»÷Ì¿Îá¤Î¸å¤í¤Ë̵´Ø·¸¤Êʸ»úÎ󤬤¢¤ê¤Þ¤¹" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "`endef' ¤ò·ç¤¤¤Æ¤ª¤ê, `define' ¤¬½ªÎ»¤µ¤ì¤Þ¤»¤ó" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "`endef' µ¿»÷Ì¿Îá¤Î¸å¤í¤Ë̵´Ø·¸¤Êʸ»úÎ󤬤¢¤ê¤Þ¤¹" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "`%s' µ¿»÷Ì¿Îá¤Î¸å¤í¤Ë̵´Ø·¸¤Êʸ»úÎ󤬤¢¤ê¤Þ¤¹" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "̵´Ø·¸¤Ê `%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "°ì¤Ä¤Î¾ò·ïÉô¤Ë¤Ä¤­°ì¤Ä¤·¤« `else' ¤ò»È¤¨¤Þ¤»¤ó" + +#: read.c:1797 +#, fuzzy +msgid "Malformed target-specific variable definition" +msgstr "¥¿¡¼¥²¥Ã¥ÈËè¤ÎÊÑ¿ôÄêµÁ¤¬°Û¾ï¤Ç¤¹" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "°ÅÌۥ롼¥ë¤ÈÀÅŪ¥Ñ¥¿¡¼¥ó¥ë¡¼¥ë¤¬º®¤¶¤ê¤Þ¤·¤¿" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "°ÅÌۥ롼¥ë¤ÈÄ̾ï¥ë¡¼¥ë¤¬º®¤¶¤ê¤Þ¤·¤¿" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "¥¿¡¼¥²¥Ã¥È `%s' ¤Ï¥¿¡¼¥²¥Ã¥È¥Ñ¥¿¡¼¥ó¤È°ìÃפ·¤Þ¤»¤ó" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "¥¿¡¼¥²¥Ã¥È¥Õ¥¡¥¤¥ë `%s' ¤¬ : ¤È :: ¹àÌܤÎξÊý¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "Ʊ°ì¥ë¡¼¥ëÆâ¤Ç¥¿¡¼¥²¥Ã¥È `%s' ¤¬Ê£¿ô²óÍ¿¤¨¤é¤ì¤Þ¤·¤¿." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "·Ù¹ð: ¥¿¡¼¥²¥Ã¥È `%s' ¤Ø¤Î¥³¥Þ¥ó¥É¤òÃÖ¤­´¹¤¨¤Þ¤¹" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "·Ù¹ð: ¥¿¡¼¥²¥Ã¥È `%s' ¤Ø¤Î¸Å¤¤¥³¥Þ¥ó¥É¤Ï̵»ë¤µ¤ì¤Þ¤¹" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "·Ù¹ð: NUL ʸ»ú¤¬¤¢¤ê¤Þ¤¹; ¹Ô¤Î»Ä¤ê¤Ï̵»ë¤µ¤ì¤Þ¤¹" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "`%s' ¤ËÂФ·¤Æ¹Ô¤¦¤Ù¤­»ö¤Ï¤¢¤ê¤Þ¤»¤ó." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s' ¤Ï¹¹¿·ºÑ¤ß¤Ç¤¹" + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "¥Õ¥¡¥¤¥ë `%s' ¤òÀ°Íý¤·¤Þ¤¹.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%s¥¿¡¼¥²¥Ã¥È `%s' ¤ò make ¤¹¤ë¥ë¡¼¥ë¤¬¤¢¤ê¤Þ¤»¤ó%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "" +"%1$s`%3$s' ¤ËɬÍפʥ¿¡¼¥²¥Ã¥È `%2$s' ¤ò make ¤¹¤ë¥ë¡¼¥ë¤¬¤¢¤ê¤Þ¤»¤ó%4$s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "¥¿¡¼¥²¥Ã¥È¥Õ¥¡¥¤¥ë `%s' ¤Î¸¡Æ¤¤ò¹Ô¤¤¤Þ¤¹.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "ºÇ¶á»î¤·¤Æ¹¹¿·¤Ë¼ºÇÔ¤·¤¿¥Õ¥¡¥¤¥ë `%s'.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "¥Õ¥¡¥¤¥ë `%s' ¤Ï¸¡Æ¤ºÑ¤ß¤Ç¤¹.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "¤Þ¤À¥Õ¥¡¥¤¥ë `%s' ¤Î¹¹¿·Ãæ¤Ç¤¹.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "¥Õ¥¡¥¤¥ë `%s' ¤Î¹¹¿·¤¬½ªÎ»¤·¤Þ¤·¤¿.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "¥Õ¥¡¥¤¥ë `%s' ¤¬Â¸ºß¤·¤Þ¤»¤ó.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** ·Ù¹ð: .LOW_RESOLUTION_TIME ¥Õ¥¡¥¤¥ë `%s' ¤¬¹â²òÁüÅÙ¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò»ý¤Ã¤Æ" +"¤¤¤Þ¤¹" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "`%s' ¤Î¤¿¤á¤Î°ÅÌۥ롼¥ë¤ò¸«¤Ä¤±¤Þ¤·¤¿.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "`%s' ¤Î¤¿¤á¤Î°ÅÌۥ롼¥ë¤¬¤¢¤ê¤Þ¤»¤ó.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "`%s' ÍѤΥǥե©¥ë¥È¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "½Û´Ä %s <- %s °Í¸´Ø·¸¤¬ÇË´þ¤µ¤ì¤Þ¤·¤¿." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "¥¿¡¼¥²¥Ã¥È¥Õ¥¡¥¤¥ë `%s' ¤ÎɬÍ×¾ò·ï¤òËþ¤¿¤·¤Þ¤·¤¿.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "`%s' ¤ÎɬÍ×¾ò·ï¤ò make ¤·¤Þ¤¹.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "¥¿¡¼¥²¥Ã¥È¥Õ¥¡¥¤¥ë `%s' ¤òÄü¤á¤Þ¤¹.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "¥¿¡¼¥²¥Ã¥È `%s' ¤Ï¥¨¥é¡¼¤Ë¤è¤êºÆ make ¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "ɬÍ×¾ò·ï `%s' ¤Ï¥¿¡¼¥²¥Ã¥È `%s' ¤Ë¤Ä¤¤¤Æ½çÈÖÄ̤ê¤Î¤ß¹Ô¤¤¤Þ¤¹.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "¥¿¡¼¥²¥Ã¥È `%2$s' ¤ÎɬÍ×¾ò·ï `%1$s' ¤¬Â¸ºß¤·¤Þ¤»¤ó.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "ɬÍ×¾ò·ï `%s' ¤Ï¥¿¡¼¥²¥Ã¥È `%s' ¤è¤ê¤â¿·¤·¤¤.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "ɬÍ×¾ò·ï `%s' ¤Ï¥¿¡¼¥²¥Ã¥È `%s' ¤è¤ê¤â¸Å¤¤.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "¥¿¡¼¥²¥Ã¥È `%s' ¤Ï¥À¥Ö¥ë¥³¥í¥ó¤Ç, ¤«¤ÄɬÍ×¾ò·ï¤ò»ý¤¿¤Ê¤¤.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "`%s' ¤Î¤¿¤á¤Î¥³¥Þ¥ó¥É¤¬Ìµ¤¯, ¤«¤Ä¼ÂºÝ¤ËÊѹ¹¤µ¤ì¤¿É¬Í×¾ò·ï¤¬¤Ê¤¤.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "akways-make ¥Õ¥é¥°¤¬¤¿¤Ã¤Æ¤¤¤ë¤Î¤Ç `%s' ¤ò make ¤·¤Þ¤¹.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "¥¿¡¼¥²¥Ã¥È `%s' ¤òºÆ make ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; VPATH ̾ `%s' ¤ò»ÈÍѤ·¤Þ¤¹" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "¥¿¡¼¥²¥Ã¥È `%s' ¤ÎºÆ make ¤¬É¬ÍפǤ¹.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " VPATH ̾ `%s' ¤ò̵»ë¤·¤Þ¤¹.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "`%s' ¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "¥¿¡¼¥²¥Ã¥È¥Õ¥¡¥¤¥ë `%s' ¤ÎºÆ make ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "¥¿¡¼¥²¥Ã¥È¥Õ¥¡¥¤¥ë `%s' ¤ÎºÆ make ¤ËÀ®¸ù¤·¤Þ¤·¤¿.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "¥¿¡¼¥²¥Ã¥È¥Õ¥¡¥¤¥ë `%s' ¤Ï -q ¥ª¥×¥·¥ç¥óÉÕ¤Ç¤ÎºÆ make ¤¬É¬ÍפǤ¹.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "`%s' ÍѤΥǥե©¥ë¥È¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "·Ù¹ð: ¥Õ¥¡¥¤¥ë `%s' ¤Î½¤Àµ»þ¹ï¤¬Ì¤Íè¤Î»þ¹ï¤Ç¤¹" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "·Ù¹ð: ¥Õ¥¡¥¤¥ë `%s' ¤Î½¤Àµ»þ¹ï¤¬ %.2g ÉÃʬ̤Íè¤Î»þ¹ï¤Ç¤¹" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNS Í×ÁÇ `%s' ¤¬¥Ñ¥¿¡¼¥ó¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs ¤¬¥¨¥¯¥¹¥Ý¡¼¥È¤·¤Æ¤¯¤ì¤Þ¤»¤ó: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# °ÅÌۥ롼¥ë" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# °ÅÌۥ롼¥ë¤Ê¤·." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u ¸Ä¤Î°ÅÌۥ롼¥ë, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " °Ê¾å." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "¥Ð¥°: num_pattern_rules ¤¬´Ö°ã¤Ã¤Æ¤¤¤ë! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "̤ÃΤΥ·¥°¥Ê¥ë" + +#: signame.c:94 +msgid "Hangup" +msgstr "¥Ï¥ó¥°¥¢¥Ã¥×" + +#: signame.c:97 +msgid "Interrupt" +msgstr "³ä¤ê¹þ¤ß" + +#: signame.c:100 +msgid "Quit" +msgstr "½ªÎ»" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "ÉÔÀµ¤Ê¥Ï¡¼¥É¥¦¥§¥¢Ì¿Îá" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "¥È¥ì¡¼¥¹/¥Ö¥ì¥¤¥¯¥Ý¥¤¥ó¥È¥È¥é¥Ã¥×" + +#: signame.c:111 +msgid "Aborted" +msgstr "Abort ¤·¤Þ¤·¤¿" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT ¥È¥é¥Ã¥×" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT ¥È¥é¥Ã¥×" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "ÉâÆ°¾®¿ôÅÀÎã³°" + +#: signame.c:123 +msgid "Killed" +msgstr "Kill ¤µ¤ì¤Þ¤·¤¿" + +#: signame.c:126 +msgid "Bus error" +msgstr "¥Ð¥¹¥¨¥é¡¼" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "¥á¥â¥ê°ãÈ¿" + +#: signame.c:132 +msgid "Bad system call" +msgstr "ÉÔÀµ¤Ê¥·¥¹¥Æ¥à¥³¡¼¥ë" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Æɤ߼ê¤Î¤Ê¤¤¥Ñ¥¤¥×¤Ø¤Î½ñ¤­¹þ¤ß" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "¥¢¥é¡¼¥à¥¯¥í¥Ã¥¯" + +#: signame.c:141 +msgid "Terminated" +msgstr "¶¯À©½ªÎ»" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "¥æ¡¼¥¶ÄêµÁ¥·¥°¥Ê¥ë 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "¥æ¡¼¥¶ÄêµÁ¥·¥°¥Ê¥ë 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "»Ò¥×¥í¥»¥¹½ªÎ»" + +#: signame.c:158 +msgid "Power failure" +msgstr "ÅŸ»¾ã³²" + +#: signame.c:161 +msgid "Stopped" +msgstr "°ì»þÄä»ß" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "°ì»þÄä»ß (tty ÆþÎÏ)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "°ì»þÄä»ß (tty ½ÐÎÏ)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "°ì»þÄä»ß (¥·¥°¥Ê¥ë)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "CPU »þ´Ö¤¬À©¸Â¤ò±Û¤¨¤Þ¤·¤¿" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "¥Õ¥¡¥¤¥ë¥µ¥¤¥ºÀ©¸Â¤ò±Û¤¨¤Þ¤·¤¿" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "²¾ÁÛ¥¿¥¤¥ÞËþλ" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "¥×¥í¥Õ¥¡¥¤¥ë¥¿¥¤¥ÞËþλ" + +#: signame.c:188 +msgid "Window changed" +msgstr "¥¦¥£¥ó¥É¥¦¥µ¥¤¥ºÊѹ¹" + +#: signame.c:191 +msgid "Continued" +msgstr "ºÆ³«¤µ¤ì¤Þ¤·¤¿" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "¶ÛµÞ I/O ¾ò·ï" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "ÈóƱ´ü I/O ²ÄǽÀ­" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "¥ê¥½¡¼¥¹¤¬¼º¤ï¤ì¤Þ¤·¤¿" + +#: signame.c:216 +msgid "Danger signal" +msgstr "´í¸±¥·¥°¥Ê¥ë" + +#: signame.c:219 +msgid "Information request" +msgstr "¾ðÊóÍ×µá" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "ÉâÆ°¾®¿ôÅÀ¥³¥×¥í¥»¥Ã¥µ¤¬ÍøÍÑÉÔǽ" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# ¥Õ¥¡¥¤¥ë¥Ï¥Ã¥·¥å¥Æ¡¼¥Ö¥ë¤Î¾õÂÖ:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "¥Ç¥Õ¥©¥ë¥È" + +#: variable.c:1544 +msgid "environment" +msgstr "´Ä¶­ÊÑ¿ô" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile ÊÑ¿ô" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "-e ¥ª¥×¥·¥ç¥ó¤Ç¤Î´Ä¶­ÊÑ¿ô" + +#: variable.c:1553 +msgid "command line" +msgstr "¥³¥Þ¥ó¥É¥é¥¤¥óÊÑ¿ô" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "`override' µ¿»÷Ì¿Îá" + +#: variable.c:1559 +msgid "automatic" +msgstr "¼«Æ°ÊÑ¿ô" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (`%s', %lu ¹ÔÌܤ«¤é)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# ÊÑ¿ô¥»¥Ã¥È¤Î¥Ï¥Ã¥·¥å¥Æ¡¼¥Ö¥ë¤Î¾õÂÖ:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# ÊÑ¿ô\n" + +#: variable.c:1627 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# ¥Ñ¥¿¡¼¥ó»ØÄêÊÑ¿ô¤ÎÃÍ" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# ¥Ñ¥¿¡¼¥ó»ØÄêÊÑ¿ô¤ÎÃͤʤ·." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u ¸Ä¤Î¥Ñ¥¿¡¼¥ó»ØÄêÊÑ¿ô¤ÎÃÍ" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "·Ù¹ð: ̤ÄêµÁ¤ÎÊÑ¿ô `%.*s'" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search ¤¬ %d ¤Ç¼ºÇÔ¤·¤Þ¤·¤¿\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "·Ù¹ð: ¶õ¤Î¥ê¥À¥¤¥ì¥¯¥È\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "ÆâÉô¥¨¥é¡¼: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-·Ù¹ð, DCL ¤«¤é¤Î CTRL-Y Áàºî¤òºÆ¤ÓÍ­¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ë¤«¤âÃΤì¤Þ¤»¤ó.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "¥Ó¥ë¥È¥¤¥ó [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "¥Ó¥ë¥È¥¤¥ó CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "¥Ó¥ë¥È¥¤¥ó RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "ÉÔÌÀ¤Ê¥Ó¥ë¥È¥¤¥ó¥³¥Þ¥ó¥É '%s'\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "¥¨¥é¡¼, ¶õ¤Î¥³¥Þ¥ó¥É\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "%s ¤«¤éÆþÎÏ¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤Þ¤·¤¿\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "%s ¤Ø¥¨¥é¡¼¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤Þ¤·¤¿\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "%s ¤Ø½ÐÎÏ¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤Þ¤·¤¿\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "%s ¤Ø½ÐÎÏ¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤Þ¤·¤¿\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Âå¤ï¤ê¤Ë %s ¤ò¼Â¹Ô¤·¤Þ¤¹\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "spawn ¤Î¥¨¥é¡¼, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH õº÷¥Ñ¥¹\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# `vpath' õº÷¥Ñ¥¹¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u ¸Ä¤Î `vpath' õº÷¥Ñ¥¹\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# °ìÈ̤Π(`VPATH' ÊÑ¿ô) õº÷¥Ñ¥¹¤Ê¤·." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# °ìÈ̤Π(`VPATH' ÊÑ¿ô) õº÷¥Ñ¥¹:\n" +"# " + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "ʸˡ¥¨¥é¡¼, '\"' Æâ¤Î¤Þ¤Þ¤Ç¤¹\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "SIGCHLD ¤¬È¯À¸; %u ¸Ä¤Î̤²ó¼ý»Ò¥×¥í¥»¥¹.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-·Ù¹ð, CTRL-Y ¤Ï»Ò¥×¥í¥»¥¹¤ò»¶¤é¤«¤·¤¿¤Þ¤Þ¤Ë¤¹¤ë¤Ç¤·¤ç¤¦.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "sh.exe ¤¬»È¤¨¤Ê¤¤¾õÂÖ¤Ç -j ¤ä --jobs ¤ò»ØÄꤷ¤Æ¤Ï¤¤¤±¤Þ¤»¤ó." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "ñ°ì¥¸¥ç¥Ö¥â¡¼¥É¤Î make ¤Ë¥ê¥»¥Ã¥È¤·¤Þ¤¹." + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%s¤³¤ì¤Ï¥Õ¥ê¡¼¥½¥Õ¥È¥¦¥§¥¢¤Ç¤¹. ÍøÍѵöÂú¤Ë¤Ä¤¤¤Æ¤Ï¥½¡¼¥¹¤ò\n" +#~ "%s¤´Í÷¤¯¤À¤µ¤¤.\n" +#~ "%s¾¦¶ÈÀ­¤äÆÃÄê¤ÎÌÜŪ¤Ø¤ÎŬ¹çÀ­¤ÎÇ¡²¿¤Ë´Ø¤ï¤é¤º, ̵ÊݾڤǤ¹.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "´Ø·¸¤Î¤Ê¤¤ `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "¶õ¤Î `override' µ¿»÷Ì¿Îá" + +#~ msgid "invalid `override' directive" +#~ msgstr "̵¸ú¤Ê `override' µ¿»÷Ì¿Îá" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "`%sinclude' ¤Ë¥Õ¥¡¥¤¥ë̾¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "¥¿¡¼¥²¥Ã¥È `%s' ¤ÎɬÍ×¾ò·ï¥Ñ¥¿¡¼¥ó¤¬¶õ¤Î¤Þ¤Þ¤Ç¤¹" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# ¥Ï¥Ã¥·¥åÍ×ÁǤ¢¤¿¤ê¡¢Ê¿¶Ñ %.3f ¸Ä¡¢ºÇÂç %u ¸Ä¤Î¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤¹¡£\n" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "¥Ç¥Ð¥Ã¥¬¤Ë attach ¤¹¤ë¤¿¤á¥×¥í¥»¥¹¤Î°ì»þÄä»ß¤òµö²Ä¤¹¤ë" + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# ¥Ï¥Ã¥·¥åÍ×ÁǤ¢¤¿¤ê¡¢Ê¿¶Ñ %.1f ¸Ä¡¢ºÇÂç %u ¸Ä¤ÎÊÑ¿ô¤¬¤¢¤ê¤Þ¤¹¡£\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# ¥Ï¥Ã¥·¥åÍ×ÁǤ¢¤¿¤êÊ¿¶Ñ %d.%d ¸Ä¡¢ºÇÂç %u ¸Ä¤ÎÊÑ¿ô¤¬¤¢¤ê¤Þ¤¹¡£\n" + +#~ msgid "the `word' function takes a positive index argument" +#~ msgstr "`word' ´Ø¿ô¤ÏÈóÉé¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹°ú¿ô¤ò¤È¤ê¤Þ¤¹" + +#~ msgid " (ignored)" +#~ msgstr " (̵»ë¤µ¤ì¤Þ¤·¤¿)" diff --git a/po/ko.gmo b/po/ko.gmo new file mode 100644 index 0000000..a00dcfc Binary files /dev/null and b/po/ko.gmo differ diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..939e2a8 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,2134 @@ +# Korean messages for GNU make. +# Copyright (C) 1996, 2001 Free Software Foundation, Inc. +# Bang Jun-Young , 1996. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU make 3.79.1\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2001-06-08 01:30+0900\n" +"Last-Translator: Changwoo Ryu \n" +"Language-Team: Korean \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=EUC-KR\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "Áö¿øµÇÁö ¾Ê´Â ±â´ÉÀ» »ç¿ëÇÏ·Á°í ÇÔ: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "¾ÆÄ«ÀÌºê ¸â¹ö touch´Â VMS¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: ¹®¼­ `%s'°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: `%s'´Â Àû¹ýÇÑ ¹®¼­°¡ ¾Æ´Õ´Ï´Ù" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: ¸â¹ö `%s'°¡ `%s'¿¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: `%s'¿¡ ´ëÇÏ¿© ar_member_touch¿¡¼­ ½ÇÆÐ ¸®ÅÏ ÄÚµå" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_moduleÀÌ ¸ðµâÁ¤º¸¸¦ ÃßÃâÇÏ´Â µ¥ ½ÇÆÐ, »óÅ = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_controlÀÌ »óÅ = %d·Î(À¸·Î) ½ÇÆÐ " + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "¸â¹ö `%2$s'¸¦ ÂüÁ¶Çϱâ À§ÇØ ¶óÀ̺귯¸® `%1$s'¸¦ ¿­ ¼ö ¾ø½À´Ï´Ù" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "¸â¹ö `%s'%s: %ld¹ÙÀÌÆ®, %ld (%ld) ¿¡¼­.\n" + +# ÀÌ¹Ì Àß·ÁÁø À̸§À» Ç¥½ÃÇϸ鼭 À̸§ÀÌ Àß·ÁÁ³À» ¼öµµ ÀÖÀ¸´Ï À¯ÀÇÇ϶ó´Â ¶æ +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (À̸§ÀÌ Àß·Á³ª°¬À» ¼öµµ ÀÖ½À´Ï´Ù)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " ³¯Â¥ %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, ¸ðµå = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** ÁßÁö.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] ¾ÆÄ«ÀÌºê ¸â¹ö `%s'´Â °¡Â¥ÀÏ ¼ö ÀÖ½À´Ï´Ù; Áö¿ìÁö ¾Ê½À´Ï´Ù" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** ¾ÆÄ«ÀÌºê ¸â¹ö `%s'´Â °¡Â¥ÀÏ ¼ö ÀÖ½À´Ï´Ù; Áö¿ìÁö ¾Ê½À´Ï´Ù" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] ÆÄÀÏ `%s'À»(¸¦) ÁÖÀÔ´Ï´Ù" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** ÆÄÀÏ `%s'À»(¸¦) Áö¿ó´Ï´Ù" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# ½ÇÇàÇÒ ¸í·É¾î" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (³»Àå):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (`%s'¿¡¼­, %lu¹ø° ÁÙ):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# µð·ºÅ丮\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: statÀ» ÇÒ ¼ö ¾ø¾ú½À´Ï´Ù.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (Å° %s, º¯°æ½Ã°¢ %d): ¿­ ¼ö ¾ø½À´Ï´Ù.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (ÀåÄ¡ %d, ¾ÆÀ̳ëµå [%d,%d,%d]): ¿­ ¼ö ¾ø½À´Ï´Ù.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (ÀåÄ¡ %ld, ¾ÆÀ̳ëµå %ld): ¿­ ¼ö ¾ø½À´Ï´Ù.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (Å° %s, º¯°æ½Ã°¢ %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (ÀåÄ¡ %d, ¾ÆÀ̳ëµå [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (ÀåÄ¡ %ld, ¾ÆÀ̳ëµå %ld): " + +# ¿©±â¼­ No´Â "No files"¶ó°í ¾²ÀδÙ. ±Ã±ØÀûÀ¸·Î msgid°¡ °íÃÄÁ®¾ß ÇÔ +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "0°³" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " ÆÄÀÏ, " + +# ¿©±â¼­ no´Â "no impossibilities"¶ó°í ¾²ÀδÙ. ±Ã±ØÀûÀ¸·Î msgid°¡ °íÃÄÁ®¾ß ÇÔ +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "0°³" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " ºÒ°¡´É" + +#: dir.c:1075 +msgid " so far." +msgstr " Áö±Ý±îÁö." + +#: dir.c:1092 +#, fuzzy, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " %u°³ÀÇ µð·ºÅ丮¿¡¼­ ºÒ°¡´É.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Àç±Í º¯¼ö `%s'´Â ÀÚ±â ÀÚ½ÅÀ» ÂüÁ¶ÇÏ°í ÀÖ½À´Ï´Ù (°á±¹)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "Á¾°áµÇÁö ¾ÊÀº º¯¼ö ÂüÁ¶" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "ÆÄÀÏ `%s'ÀÇ %s:%lu¿¡¼­ ¸í·É¾î°¡ ÁöÁ¤µÇ¾ú½À´Ï´Ù," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "ÆÄÀÏ `%s'¸¦ À§ÇÑ ¸í·ÉÀ» ¹¬½ÃÀû ±ÔÄ¢ Ž»öÀ¸·Î ã¾Ò½À´Ï´Ù." + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "ÇÏÁö¸¸ `%s'´Â ÀÌÁ¦ `%s'¿Í °°Àº ÆÄÀÏ·Î °£Áֵ˴ϴÙ." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "`%s'¿¡ ´ëÇÑ ¸í·É¾î´Â `%s'¿¡ ´ëÇÑ ¸í·É¾î°¡ ¿ì¼±ÇϹǷΠ¹«½ÃµË´Ï´Ù.." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "´ÜÀÏ ÄÝ·Ð `%s'¸¦ ÀÌÁß ÄÝ·Ð `%s'·Î À̸§¹Ù²Ü ¼ö ¾ø½À´Ï´Ù" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "ÀÌÁß ÄÝ·Ð `%s'¸¦ ´ÜÀÏ ÄÝ·Ð `%s'·Î À̸§¹Ù²Ü ¼ö ¾ø½À´Ï´Ù" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Áß°£ ÆÄÀÏ `%s'À»(¸¦) ÁÖÀÔ´Ï´Ù" + +#: file.c:396 +#, fuzzy +msgid "Removing intermediate files...\n" +msgstr "*** Áß°£ ÆÄÀÏ `%s'À»(¸¦) ÁÖÀÔ´Ï´Ù" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: ŸÀÓ½ºÅÆÇÁ°¡ ¹üÀ§¸¦ ¹þ¾î³³´Ï´Ù; %sÀ»(¸¦) ´ëüÇÕ´Ï´Ù" + +#: file.c:804 +msgid "Current time" +msgstr "ÇöÀç ½Ã°¢" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Ÿ°ÙÀÌ ¾Æ´Ô:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# ÇÁ·¹½Ã¾î½º ÆÄÀÏ (.PRECIOUSÀÇ ¼±ÇàÁ¶°Ç)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Æ÷´Ï Ÿ°Ù (.PHONYÀÇ ¼±ÇàÁ¶°Ç)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# ¸í·ÉÇà Ÿ°Ù." + +#: file.c:935 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# ±âº» ¸ÞÀÌÅ©ÆÄÀÏ È¤Àº MAKEFILES ¸ÞÀÌÅ©ÆÄÀÏ." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# ¹¬½ÃÀû ±ÔÄ¢ Ž»öÀÌ ¿Ï·áµÇ¾ú½À´Ï´Ù." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# ¹¬½ÃÀû ±ÔÄ¢ Ž»öÀÌ ¿Ï·áµÇÁö ¾Ê¾Ò½À´Ï´Ù." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# ¹¬½ÃÀû/°íÁ¤ ÆÐÅÏ ½ºÅÛ: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# ÆÄÀÏÀÌ Áß°£´Ü°èÀÇ ¼±ÇàÁ¶°ÇÀÔ´Ï´Ù." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# ´ÙÀ½µµ ¸¸µì´Ï´Ù:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# º¯°æ ½Ã°¢ÀÌ °áÄÚ °Ë»çµÇÁö ¾Ê¾ÒÀ½." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù." + +#: file.c:956 +msgid "# File is very old." +msgstr "# ÆÄÀÏÀÌ ¸Å¿ì ¿À·¡µÇ¾ú½À´Ï´Ù." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# ¸¶Áö¸· º¯°æ %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# ÆÄÀÏÀÌ °»½ÅµÇ¾ú½À´Ï´Ù." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# ÆÄÀÏÀÌ °»½ÅµÇÁö ¾Ê¾Ò½À´Ï´Ù." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# ÇöÀç ½ÇÇàÁßÀÎ ¸í·É (ÀÌ°ÍÀº ¹ö±×ÀÔ´Ï´Ù)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# ÇöÀç ½ÇÇàÁßÀÎ ÀÇÁ¸¼º (ÀÌ°ÍÀº ¹ö±×ÀÔ´Ï´Ù)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# ¼º°øÀûÀ¸·Î °»½ÅµÊ." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# °»½ÅµÉ ÇÊ¿ä°¡ ÀÖÀ½ (-q ¼³Á¤µÊ)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# °»½Å¿¡ ½ÇÆÐÇÔ." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# `update_status' ¸â¹ö¿¡ °ªÀÌ À߸øµÇ¾ú½À´Ï´Ù!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# `command_status' ¸â¹ö¿¡ °ªÀÌ À߸øµÇ¾ú½À´Ï´Ù!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# ÆÄÀÏ" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "`word' ÇÔ¼öÀÇ Ã¹¹ø° ÀÎÀÚ°¡ ¼ýÀÚ°¡ ¾Æ´Õ´Ï´Ù" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "`word' ÇÔ¼öÀÇ Ã¹¹ø° ÀÎÀÚ´Â 0º¸´Ù Ä¿¾ß ÇÕ´Ï´Ù" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "`wordlist' ÇÔ¼öÀÇ Ã¹¹ø° ÀÎÀÚ°¡ ¼ýÀÚ°¡ ¾Æ´Õ´Ï´Ù" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "`wordlist' ÇÔ¼öÀÇ µÎ¹ø° ÀÎÀÚ°¡ ¼ýÀÚ°¡ ¾Æ´Õ´Ï´Ù" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) ½ÇÆÐ (e=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) ½ÇÆÐ (e=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() ½ÇÆÐ (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() ½ÇÆÐ\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Àӽà ¹èÄ¡ ÆÄÀÏ %sÀ»(¸¦) Áö¿ó´Ï´Ù\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "ÇÔ¼ö `%2$s'¿¡ ÀÎÀÚ °¹¼ö(%1$d)°¡ ºÎÁ·ÇÕ´Ï´Ù " + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "ÀÌ Ç÷§Æû¿¡¼­´Â ±¸ÇöµÇÁö ¾Ê¾Ò½À´Ï´Ù: `%s' ÇÔ¼ö" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "ÇÔ¼ö `%s'¿¡ ´ëÇØ Á¾·áµÇÁö ¾ÊÀº È£Ãâ: `%c'°¡ ºüÁ³À½" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: `%s'´Â ¾Ö¸ÅÇÑ ¿É¼ÇÀÔ´Ï´Ù\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: `--%s' ¿É¼ÇÀº Àμö¸¦ Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: `%c%s' ¿É¼ÇÀº Àμö¸¦ Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: `%s' ¿É¼ÇÀº Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ÀνÄÇÒ ¼ö ¾ø´Â ¿É¼Ç `--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ÀνÄÇÒ ¼ö ¾ø´Â ¿É¼Ç `%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: À߸øµÈ ¿É¼Ç -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ºÎÀûÀýÇÑ ¿É¼Ç -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ÀÌ ¿É¼ÇÀº Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: `-W %s' ¿É¼ÇÀº ¾Ö¸ÅÇÑ ¿É¼ÇÀÔ´Ï´Ù\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: `-W %s' ¿É¼ÇÀº Àμö¸¦ Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "`%s'¿¡ ´ëÇÑ ¹¬½ÃÀû ±ÔÄ¢À» ã°í ÀÖ½À´Ï´Ù.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "`%s'¿¡ ´ëÇÑ ¾ÆÄ«À̺ê¸â¹ö ¹¬½ÃÀû ±ÔÄ¢À» ã°í ÀÖ½À´Ï´Ù.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "¹¬½ÃÀû ±ÔÄ¢ÀÇ Àç±Í¸¦ ÇÇÇÔ.\n" + +# ½ºÅÛstemÀ̶õ ÆÐÅÏ ·ê¿¡¼­ prefix/suffix¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö¸¦ ¸»ÇÑ´Ù. +# ¿¹¸¦ µé¾î `%.c'¶ó´Â ÆÐÅÏ¿¡ `hello.c'°¡ µé¾î ¸Â¾ÒÀ» °æ¿ì stemÀº `hello'ÀÌ´Ù. +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "½ºÅÛ `%.*s'¿¡¼­ºÎÅÍ ÆÐÅÏ ±ÔÄ¢ ½Ãµµ.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "ºÒ°¡´ÉÇÑ ±ÔÄ¢ ¼±ÇàÁ¶°Ç `%s'Àº(´Â) °ÅºÎµË´Ï´Ù.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "ºÒ°¡´ÉÇÑ ¹¬½ÃÀû ¼±ÇàÁ¶°Ç `%s'Àº(´Â) °ÅºÎµË´Ï´Ù.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "±ÔÄ¢ ¼±ÇàÁ¶°Ç `%s'À»(¸¦) ½ÃµµÇÕ´Ï´Ù.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "¹¬½ÃÀû ¼±ÇàÁ¶°Ç `%s'À»(¸¦) ½ÃµµÇÕ´Ï´Ù\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "VPATH `%2$s'¿¡¼­ ¼±ÇàÁ¶°Ç `%1$s'À»(¸¦) ã¾Ò½À´Ï´Ù\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Áß°£ ÆÄÀÏ `%s'¿¡ ´ëÇÑ ¹¬½ÃÀû ±ÔÄ¢À» ã°í ÀÖ½À´Ï´Ù.\n" + +#: job.c:335 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (Àӽà ÆÄÀÏ)" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] ¿À·ù 0x%x (¹«½ÃµÊ)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] ¿À·ù 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] ¿À·ù %d (¹«½ÃµÊ)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] ¿À·ù %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (¸Þ¸ð¸® ´ýÇÁµÊ)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ³¡³ªÁö ¾ÊÀº ÀÛ¾÷À» ±â´Ù¸®°í ÀÖ½À´Ï´Ù...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "»ì¾ÆÀÖ´Â ÀÚ½Ä ÇÁ·Î¼¼½º 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (¿ø°Ý)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "½ÇÆÐÇÑ ÀÚ½Ä ÇÁ·Î¼¼½º 0x%08lx PID %ld %sÀ»(¸¦) °ÅµÖµéÀÔ´Ï´Ù\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "¼º°øÇÑ ÀÚ½Ä ÇÁ·Î¼¼½º 0x%08lx PID %ld %sÀ»(¸¦) °ÅµÖµéÀÔ´Ï´Ù\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Àӽà ¹èÄ¡ ÆÄÀÏ %sÀ»(¸¦) Áö¿ó´Ï´Ù\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "üÀο¡¼­ ÀÚ½ÄÇÁ·Î¼¼½º 0x%08lx PID %ld %sÀ»(¸¦) Áö¿ó´Ï´Ù.\n" + +# ??? µð¹ö±ë ¸Þ¼¼Áö +#: job.c:920 +msgid "write jobserver" +msgstr "ÀÛ¾÷¼­¹ö ¾²±â" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "ÀÚ½ÄÇÁ·Î¼¼½º child 0x%08lx (%s) ¿¡ ÅäÅ«À» ³»¾î ÁÝ´Ï´Ù.\n" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy()°¡ ÇÁ·Î¼¼½º¸¦ ½ÃÀÛÇÏ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù (e=%d)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"½ÇÇà ½ÇÆп¡¼­ %d°³ÀÇ Àμö\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "ÀÚ½ÄÇÁ·Î¼¼½º 0x%08lx (%s) PID %ld%sÀ»(¸¦) üÀο¡ ³Ö½À´Ï´Ù.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "ÀÚ½Ä ÇÁ·Î¼¼½º 0x%08lx (%s)¿¡¼­ ÅäÅ«À» ¹Þ¾Ò½À´Ï´Ù.\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "ÀÛ¾÷ ÆÄÀÌÇÁ Àбâ" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Ÿ°Ù `%s'À»(¸¦) ´Ù½Ã ¸¸µé ÇÊ¿ä°¡ ¾ø½À´Ï´Ù." + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "ÀÌ ¿î¿µ üÁ¦¿¡¼­´Â ºÎÇÏ Á¦ÇÑÀ» °­Á¦ÇÒ ¼ö ¾ø½À´Ï´Ù" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "ºÎÇÏ Á¦ÇÑÀ» °­Á¦ÇÒ ¼ö ¾ø½À´Ï´Ù: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" +"ÀÚ½ÄÇÁ·Î¼¼½º pid %d¸¦ °ÅµÖµéÀÌ°í, ¾ÆÁ÷ pid %dÀ»(¸¦) ±â´Ù¸®°í ÀÖ½À´Ï´Ù\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: ¸í·ÉÀ» ãÁö ¸øÇßÀ½" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: ¼Ð ÇÁ·Î±×·¥À» ãÁö ¸øÇßÀ½" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, fuzzy, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELLÀÌ ¹Ù²î¾ú½À´Ï´Ù (°ú°Å `%s', ÇöÀç `%s')" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Àӽà ¹èÄ¡ ÆÄÀÏ %sÀ»(¸¦) ¸¸µì´Ï´Ù\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +# ??? µð¹ö±ë ¸Þ¼¼Áö +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (%d¹ø° ÁÙ) À߸øµÈ ½© ÄÁÅؽºÆ® (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "¿É¼Ç:\n" + +#: main.c:304 +#, fuzzy +msgid " -b, -m Ignored for compatibility.\n" +msgstr "ȣȯ¼ºÀ» À§ÇØ ¹«½ÃµÊ" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:311 +#, fuzzy +msgid " -d Print lots of debugging information.\n" +msgstr "¿©·¯ °¡Áö µð¹ö±ë Á¤º¸¸¦ Ãâ·ÂÇÕ´Ï´Ù" + +#: main.c:313 +#, fuzzy +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "¿©·¯ °¡Áö Á¾·ùÀÇ µð¹ö±ë Á¤º¸¸¦ Ãâ·ÂÇÕ´Ï´Ù" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:323 +#, fuzzy +msgid " -h, --help Print this message and exit.\n" +msgstr "ÀÌ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°í ³¡³À´Ï´Ù" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:330 +#, fuzzy +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "µ¿½Ã¿¡ N°³ÀÇ ÀÛ¾÷À» Çã¿ëÇÕ´Ï´Ù; ÀÎÀÚ°¡ ¾øÀ¸¸é ¹«ÇÑ´ë·Î Çã¿ëÇÕ´Ï´Ù" + +#: main.c:332 +#, fuzzy +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "¸î¸î Ÿ°ÙÀ» ¸¸µé ¼ö ¾ø´õ¶óµµ °è¼Ó ÁøÇàÇÕ´Ï´Ù" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:345 +#, fuzzy +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "makeÀÇ ³»ºÎ µ¥ÀÌŸº£À̽º¸¦ Ãâ·ÂÇÕ´Ï´Ù" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "¸í·ÉÀ» ½ÇÇàÇÏÁö ¾Ê½À´Ï´Ù; Á¾·á »óȲÀÌ °»½Å ¿©ºÎ¸¦ ¸»ÇØ ÁÝ´Ï´Ù" + +#: main.c:349 +#, fuzzy +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "³»Àå ¹¬½ÃÀû ±ÔÄ¢À» »ç¿ë ºÒ°¡´ÉÇÏ°Ô ÇÕ´Ï´Ù" + +#: main.c:351 +#, fuzzy +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "³»Àå º¯¼ö¸¦ ÁöÁ¤ÇÏÁö ¸øÇÏ°Ô ÇÕ´Ï´Ù" + +#: main.c:353 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" + +#: main.c:358 +#, fuzzy +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "Ÿ°ÙÀ» ´Ù½Ã ¸¸µéÁö ¾Ê°í touch¸¸ ÇÕ´Ï´Ù" + +#: main.c:360 +#, fuzzy +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "makeÀÇ ¹öÀü ¹øÈ£¸¦ Ãâ·ÂÇÏ°í ³¡³À´Ï´Ù" + +#: main.c:362 +#, fuzzy +msgid " -w, --print-directory Print the current directory.\n" +msgstr "ÇöÀç µð·ºÅ丮¸¦ Ãâ·ÂÇÕ´Ï´Ù" + +#: main.c:364 +#, fuzzy +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "¹¬½ÃÀûÀ¸·Î ÄÑÁ® ÀÖ´õ¶óµµ -w¸¦ ²ü´Ï´Ù" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:369 +#, fuzzy +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "Á¤ÀǵÇÁö ¾ÊÀº º¯¼ö¸¦ ÂüÁ¶ÇÒ ¶§ °æ°í¸¦ ³À´Ï´Ù" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "ºó ¹®ÀÚ¿­Àº ÆÄÀÏ À̸§À¸·Î ºÎÀûÀýÇÕ´Ï´Ù" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "µð¹ö±ë ´Ü°è ÁöÁ¤ `%s'ÀÌ(°¡) À߸øµÇ¾ú½À´Ï´Ù" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: ÀÎÅÍ·´Æ®/¿¹¿Ü°¡ ¹ß°ßµÇ¾ú½À´Ï´Ù (ÄÚ¤§ = 0x%x, ÁÖ¼Ò = 0x%x)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"ÇÁ·Î±×·¥ %s¿¡¼­ 󸮵ÇÁö ¾ÊÀº ¿¹¿Ü°¡ ¹ß»ýÇß½À´Ï´Ù\n" +"¿¹¿ÜÄÚµå = %x\n" +"¿¹¿ÜÇ÷¡±× = %x\n" +"¿¹¿ÜÁÖ¼Ò = %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Á¢±Ù±ÇÇÑ À§¹Ý: ÁÖ¼Ò %x¿¡ ¾²±â\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Á¢±Ù±ÇÇÑ À§¹Ý: ÁÖ¼Ò %x¿¡¼­ Àбâ\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shellÀÌ default_shell = %s À¸·Î(·Î) ¼¼ÆÃÇÕ´Ï´Ù.\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"find_and_set_shell °æ·Î Ž»öÀÌ default_shell = %s À¸·Î(·Î) ¼¼ÆÃÇÕ´Ï´Ù.\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%sÀÌ(°¡) 30Ãʵ¿¾È ÀϽà ÁßÁöµË´Ï´Ù..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "¿Ï·á sleep(30). °è¼Ó.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Ç¥ÁØÀԷ¿¡¼­ ¹Þ¾ÆµéÀÌ´Â ¸ÞÀÌÅ©ÆÄÀÏÀÌ µÎ ¹ø ÀÌ»ó ÁöÁ¤µÇ¾ú½À´Ï´Ù." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (Àӽà ÆÄÀÏ)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (Àӽà ÆÄÀÏ)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "ÀÌ Ç÷§Æû¿¡¼­´Â º´·Ä ÀÛ¾÷(-j)ÀÌ Áö¿øµÇÁö ¾Ê½À´Ï´Ù." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "´ÜÀÏ ÀÛ¾÷ (-j1) ¸ðµå·Î µ¹¾Æ°©´Ï´Ù." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "³»ºÎ ¿À·ù: ¿©·¯ °³ÀÇ -jobserver-fds ¿É¼Ç" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "³»ºÎ ¿À·ù: À߸øµÈ -jobserver-fds ¹®ÀÚ¿­ `%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "°æ°í: ÆÄ»ýµÈ ¸ÞÀÌÅ©¿¡¼­ -jNÀÌ °­Á¦µÇ¾ú½À´Ï´Ù: ÀÛ¾÷¼­¹ö ¸ðµå¸¦ ²ü´Ï´Ù." + +# ??? µð¹ö±ë ¸Þ¼¼Áö +#: main.c:1750 +msgid "dup jobserver" +msgstr "dup ÀÛ¾÷¼­¹ö" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"°æ°í: ÀÛ¾÷¼­¹ö¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù: -j1À» »ç¿ëÇÕ´Ï´Ù. ºÎ¸ð ¸ÞÀÌÅ© ±ÔÄ¢¿¡ `" +"+'¸¦ Ãß°¡ÇÕ´Ï´Ù." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "ÀÛ¾÷ ÆÄÀÌÇÁ »ý¼º" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "ÀÛ¾÷¼­¹ö ÆÄÀÌÇÁ ÃʱâÈ­" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "¸ÞÀÌÅ©ÆÄÀÏÀ» ¾÷µ¥ÀÌÆ®ÇÏ°í ÀÖ½À´Ï´Ù....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "¸ÞÀÌÅ©ÆÄÀÏ `%s'Àº(´Â) ¹Ýº¹ÇÒ ¼ö ÀÖ½À´Ï´Ù; ´Ù½Ã ¸¸µéÁö ¾Ê½À´Ï´Ù.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "¸ÞÀÌÅ©ÆÄÀÏ `%s'À» ´Ù½Ã ¸¸µå´Âµ¥ ½ÇÆÐÇÔ." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Æ÷ÇÔµÈ ¸ÞÀÌÅ©ÆÄÀÏ `%s'¸¦ ãÁö ¸øÇß½À´Ï´Ù." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "¸ÞÀÌÅ©ÆÄÀÏ `%s'À» ãÁö ¸øÇß½À´Ï´Ù" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "¿ø·¡ µð·ºÅ丮·Î µ¹¾Æ°¥ ¼ö ¾ø½À´Ï´Ù." + +#: main.c:2102 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "Àç½ÇÇà:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (Àӽà ÆÄÀÏ): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Ÿ°ÙÀÌ ÁöÁ¤µÇÁö ¾Ê¾Ò°í ¸ÞÀÌÅ©ÆÄÀÏÀÌ ¾ø½À´Ï´Ù" + +#: main.c:2272 +msgid "No targets" +msgstr "Ÿ°Ù ¾øÀ½" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "ÃÖÁ¾ Ÿ°ÙÀ» °»½ÅÇÕ´Ï´Ù....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"°æ°í: ½Ã°è°¡ À߸øµÇ¾úÀ½ÀÌ ¹ß°ßµÇ¾ú½À´Ï´Ù. ºôµå°¡ ºÒ¿ÏÀüÇÒ ¼ö ÀÖ½À´Ï´Ù." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "»ç¿ë¹ý: %s [¿É¼Ç] [Ÿ°Ù] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" + +#: main.c:2481 +#, fuzzy, c-format +msgid "Report bugs to \n" +msgstr "" +"\n" +"¹®Á¦Á¡À» ·Î ¾Ë·Á ÁֽʽÿÀ.\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "`-%c' ¿É¼ÇÀº ¾çÀÇ ÀûºÐ Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "`-%c' ¿É¼ÇÀº ¾çÀÇ ÀûºÐ Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù" + +#: main.c:3054 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "" + +#: main.c:3056 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# ¸ÞÀÌÅ© µ¥ÀÌŸº£À̽º, %s¿¡ Ç¥½Ã" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# ¸ÞÀÌÅ© µ¥ÀÌŸ º£À̽º ¸¶Ä§, %s¿¡¼­\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "¾Ë ¼ö ¾ø´Â µð·ºÅ丮" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "¾Ë ¼ö ¾ø´Â µð·ºÅ丮" + +#: main.c:3242 +#, fuzzy, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "`%s' µð·ºÅ丮\n" + +#: main.c:3245 +#, fuzzy, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "`%s' µð·ºÅ丮\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "¾Ë ¼ö ¾ø´Â µð·ºÅ丮" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "¾Ë ¼ö ¾ø´Â µð·ºÅ丮" + +#: main.c:3257 +#, fuzzy, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "`%s' µð·ºÅ丮\n" + +#: main.c:3260 +#, fuzzy, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "`%s' µð·ºÅ丮\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". ¸ØÃã.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "¾Ë ¼ö ¾ø´Â ¿À·ù %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "°¡»ó ¸Þ¸ð¸®°¡ °í°¥µÊ" + +#: misc.c:708 +#, fuzzy, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s Á¢±Ù: »ç¿ëÀÚ %lu (½ÇÁ¦ %lu), ±×·ì %lu (½ÇÁ¦ %lu)\n" + +#: misc.c:729 +#, fuzzy +msgid "Initialized access" +msgstr "ÃʱâÈ­µÊ" + +#: misc.c:808 +msgid "User access" +msgstr "" + +#: misc.c:856 +msgid "Make access" +msgstr "" + +#: misc.c:890 +msgid "Child access" +msgstr "" + +#: misc.c:954 +#, fuzzy, c-format +msgid "write error: %s" +msgstr "¿À·ù¸¦ %sÀ¸·Î(·Î) ¸®´ÙÀÌ·ºÆ®ÇÕ´Ï´Ù\n" + +# ??? µð¹ö±ë ¸Þ¼¼Áö +#: misc.c:956 +#, fuzzy +msgid "write error" +msgstr "ÀÛ¾÷¼­¹ö ¾²±â" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "¸ÞÀÌÅ©ÆÄÀÏÀ» Àаí ÀÖ½À´Ï´Ù\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "¸ÞÀÌÅ©ÆÄÀÏ `%s'¸¦ Àаí ÀÖ½À´Ï´Ù" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (ÃÖÁ¾ Ÿ°ÙÀÌ ¾øÀ½)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (Ž»ö °æ·Î)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (»ó°ü ¾ÈÇÔ)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (~ È®Àå ¾øÀ½)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "Á¶°Ç¹®¿¡ ºÎÀûÀýÇÑ ¹®¹ýÀÌ ¾²ÀÓ" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "ù¹ø° Ÿ°Ùº¸´Ù ¾Õ¿¡¼­ ¸í·É¾î°¡ ½ÃÀ۵Ǿú½À´Ï´Ù" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "¸í·É ¾Õ¿¡ ±ÔÄ¢ÀÌ ºüÁ³À½" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "ºÐ¸®±âÈ£ %sÀÌ(°¡) ºüÁ³À½" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (8°³ÀÇ °ø¹é ¸»°í ÅÇÀ» ¾²·Á°í ÇÑ °Í ¾Æ´Ï¾ú½À´Ï±î?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "Ÿ°Ù ÆÐÅÏÀÌ ºüÁ³À½" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "´ÙÁß Å¸°Ù ÆÐÅÏ" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "Ÿ°Ù ÆÐÅÏ¿¡ `%%'°¡ ¾ø½À´Ï´Ù." + +#: read.c:1293 +msgid "missing `endif'" +msgstr "`endif'°¡ ºüÁ³À½" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "ºó º¯¼ö À̸§" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "`endef' Áö½ÃÀÚ µÚ¿¡ ¿©ºÐÀÇ ±ÛÀÌ ÀÖÀ½" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "`endef'°¡ ºüÁ³À½. Á¾·áµÇÁö ¾ÊÀº `define'" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "`endef' Áö½ÃÀÚ µÚ¿¡ ¿©ºÐÀÇ ±ÛÀÌ ÀÖÀ½" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "`%s' Áö½ÃÀÚ µÚ¿¡ ¿©ºÐÀÇ ¹®ÀåÀÌ ÀÖÀ½" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "¿©ºÐÀÇ `%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "ÇÑ °³ÀÇ Á¶°Ç¿¡´Â ÇÑ °³ÀÇ `else'¸¸ ÀÖ¾î¾ß ÇÕ´Ï´Ù" + +#: read.c:1797 +#, fuzzy +msgid "Malformed target-specific variable definition" +msgstr "Ÿ°Ùº° º¯¼ö Á¤ÀÇ Çü½ÄÀÌ Æ²·È½À´Ï´Ù" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "¹¬½ÃÀû ÆÐÅÏ ·ê°ú °íÁ¤µÈ ÆÐÅÏ·êÀÌ ¼¯¿´½À´Ï´Ù" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "È¥ÇÕµÈ ¹¬½ÃÀû ±ÔÄ¢°ú ÀϹÝÀû ±ÔÄ¢" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "Ÿ°Ù `%s'Àº(´Â) Ÿ°Ù ÆÐÅÏ¿¡ ¸ÂÁö ¾Ê½À´Ï´Ù" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "Ÿ°Ù ÆÄÀÏ `%s'Àº(´Â) :¿Í :: Ç׸ñÀ» µ¿½Ã¿¡ °®°í ÀÖ½À´Ï´Ù" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "Ÿ°Ù `%s'ÀÌ(°¡) °°Àº ±ÔÄ¢¿¡¼­ ¿©·¯ ¹ø ÁÖ¾îÁ³½À´Ï´Ù" + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "°æ°í: Ÿ°Ù `%s'¿¡ ´ëÇÑ ¸í·É¾îº¸´Ù ´Ù¸¥ °ÍÀÌ ¿ì¼±ÇÕ´Ï´Ù" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "°æ°í: Ÿ°Ù `%s'¿¡ ´ëÇÑ °ú°Å ¸í·É¾îµéÀ» ¹«½ÃÇÕ´Ï´Ù" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "°æ°í: NUL ¹®ÀÚ°¡ ¹ß°ßµÇ¾ú½À´Ï´Ù; ÁÙÀÇ ³ª¸ÓÁö´Â ¹«½ÃµË´Ï´Ù" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "`%s'¸¦ À§ÇØ ÇÒ ÀÏÀÌ ¾ø½À´Ï´Ù" + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s'´Â ÀÌ¹Ì °»½ÅµÇ¾ú½À´Ï´Ù." + +# pruneÀÌ truncateÀÇ ÀǹÌÀΰ¡ Áö¿î´Ù´Â ÀǹÌÀΰ¡?? +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "`%s' ÆÄÀÏÀ» À߶󳻰í ÀÖ½À´Ï´Ù.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sŸ°Ù `%s'¸¦ ¸¸µé ±ÔÄ¢ÀÌ ¾øÀ½%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%1$s`%3$s'¿¡¼­ ÇÊ¿ä·Î Çϴ Ÿ°Ù `%2$s'¸¦ ¸¸µé ±ÔÄ¢ÀÌ ¾ø½À´Ï´Ù%4$s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Ÿ°Ù ÆÄÀÏ `%s'À»(¸¦) °í·ÁÇÕ´Ï´Ù.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "ÃÖ±Ù¿¡ `%s' ÆÄÀÏÀ» °»½ÅÇÏ·Á°í ½ÃµµÇÏ¿´°í ½ÇÆÐÇÏ¿´½À´Ï´Ù.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "ÆÄÀÏ `%s'´Â ÀÌ¹Ì °ËÅäµÇ¾ú½À´Ï´Ù.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "¾ÆÁ÷ `%s' ÆÄÀÏÀ» °»½ÅÇÏ°í ÀÖ½À´Ï´Ù.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "`%s' ÆÄÀÏÀÇ °»½ÅÀ» ¸¶ÃƽÀ´Ï´Ù.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "`%s' ÆÄÀÏÀº Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "`%s'¿¡ ´ëÇÑ ¹¬½ÃÀû ±ÔÄ¢À» ã¾Ò½À´Ï´Ù.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "`%s'¿¡ ´ëÇÑ ¹¬½ÃÀû ±ÔÄ¢À» ãÁö ¸øÇß½À´Ï´Ù.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "`%s'¿¡ ´ëÇØ ³»Á¤µÈ ¸í·ÉÀ» »ç¿ëÇÔ.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "%s <- %s »óÈ£ ÀÇÁ¸¼ºÀº ¹«½ÃµË´Ï´Ù." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Ÿ°Ù ÆÄÀÏ `%s'ÀÇ ¼±ÇàÁ¶°ÇÀ» ¸¶ÃƽÀ´Ï´Ù.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "`%s'ÀÇ ¼±ÇàÁ¶°ÇÀÌ ¸¸µé¾îÁö°í ÀÖ½À´Ï´Ù.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Ÿ°Ù ÆÄÀÏ `%s'À»(¸¦) Æ÷±âÇÕ´Ï´Ù.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "¿À·ù·Î ÀÎÇØ Å¸°Ù `%s'¸¦ ´Ù½Ã ¸¸µéÁö ¸øÇß½À´Ï´Ù." + +#: remake.c:727 +#, fuzzy, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "¼±ÇàÁ¶°Ç `%s'ÀÌ(°¡) Ÿ°Ù `%s'º¸´Ù ¸ÕÀú ¸¸µé¾îÁ³½À´Ï´Ù.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Ÿ°Ù `%2$s'ÀÇ ¼±ÇàÁ¶°Ç %1$sÀº(´Â) Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "¼±ÇàÁ¶°Ç `%s'ÀÌ(°¡) Ÿ°Ù `%s'º¸´Ù ÃÖ±Ù¿¡ ¸¸µé¾îÁ³½À´Ï´Ù.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "¼±ÇàÁ¶°Ç `%s'ÀÌ(°¡) Ÿ°Ù `%s'º¸´Ù ¸ÕÀú ¸¸µé¾îÁ³½À´Ï´Ù.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Ÿ°Ù `%s'ÀÌ(°¡) µÎ °³ÀÇ ÄÝ·ÐÀÌ ºÙ¿©Á³Áö¸¸ ¼±ÇàÁ¶°ÇÀÌ ¾ø½À´Ï´Ù.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "`%s'¿¡ ´ëÇÑ ¸í·É¾î°¡ ¾ø°í ¾î¶² ¼±ÇàÁ¶°Çµµ º¯°æµÇÁö ¾Ê¾Ò½À´Ï´Ù.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Ÿ°Ù `%s'À»(¸¦) ´Ù½Ã ¸¸µé ÇÊ¿ä°¡ ¾ø½À´Ï´Ù." + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; VPATH À̸§ `%s'À»(¸¦) »ç¿ëÇÕ´Ï´Ù" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Ÿ°Ù `%s'¸¦ ´Ù½Ã ¸¸µé¾î¾ß ÇÕ´Ï´Ù.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " VPATH À̸§ `%s'À»(¸¦) ¹«½ÃÇÕ´Ï´Ù.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "`%s'¶ó´Â ¸í·ÉÀÌ ½ÇÇà ÁßÀÔ´Ï´Ù.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Ÿ°Ù ÆÄÀÏ `%s'¸¦ ´Ù½Ã ¸¸µå´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Ÿ°Ù ÆÄÀÏ `%s'¸¦ ¼º°øÀûÀ¸·Î ´Ù½Ã ¸¸µé¾ú½À´Ï´Ù.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Ÿ°Ù ÆÄÀÏ `%s'ÀÌ(°¡) -q ÇÏ¿¡ ´Ù½Ã ¸¸µé¾îÁ®¾ß ÇÕ´Ï´Ù.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "`%s'¿¡ ´ëÇØ ³»Á¤µÈ ¸í·ÉÀ» »ç¿ëÇÔ.\n" + +#: remake.c:1357 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "*** ÆÄÀÏ `%s'°¡ ¹Ì·¡ÀÇ º¯°æ ½Ã°¢À» °¡Áö°í ÀÖ½À´Ï´Ù (%s > %s)" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "*** ÆÄÀÏ `%s'°¡ ¹Ì·¡ÀÇ º¯°æ ½Ã°¢À» °¡Áö°í ÀÖ½À´Ï´Ù (%s > %s)" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNSÀÇ ¿ø¼Ò `%s'ÀÌ(°¡) ÆÐÅÏÀÌ ¾Æ´Õ´Ï´Ù" + +# ??? µð¹ö±ë ¸Þ¼¼Áö -- ¹ºÁö ¾Ë±â ¾î·Á¿ò +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "CustomsÀº exportµÇÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù: %s\n" + +#: rule.c:499 +#, fuzzy +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# ¹¬½ÃÀû ±ÔÄ¢ ¾øÀ½." + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# ¹¬½ÃÀû ±ÔÄ¢ ¾øÀ½." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u°³ÀÇ ¹¬½ÃÀû ±ÔÄ¢, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " Å͹̳Î." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "¹ö±×: num_pattern_rules ¿À·ù! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "¾Ë ¼ö ¾ø´Â ½ÅÈ£" + +#: signame.c:94 +msgid "Hangup" +msgstr "²÷¾îÁü" + +#: signame.c:97 +msgid "Interrupt" +msgstr "ÀÎÅÍ·´Æ®" + +#: signame.c:100 +msgid "Quit" +msgstr "Á¾·á" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "À߸øµÈ ¸í·É" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "ÃßÀû/Áß´ÜÁ¡ Æ®·¦" + +#: signame.c:111 +msgid "Aborted" +msgstr "ÁߴܵÊ" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT Æ®·¦" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT Æ®·¦" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "ºÎµ¿ ¼Ò¼öÁ¡ ¿¹¿Ü" + +#: signame.c:123 +msgid "Killed" +msgstr "Á×¾úÀ½" + +#: signame.c:126 +msgid "Bus error" +msgstr "¹ö½º ¿À·ù" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù" + +#: signame.c:132 +msgid "Bad system call" +msgstr "À߸øµÈ ½Ã½ºÅÛ È£Ãâ" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "±ú¾îÁø ÆÄÀÌÇÁ" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "ÀÚ¸íÁ¾ ½Ã°è" + +#: signame.c:141 +msgid "Terminated" +msgstr "Á¾·áµÊ" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "»ç¿ëÀÚ Á¤ÀÇ ½ÅÈ£ 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "»ç¿ëÀÚ Á¤ÀÇ ½ÅÈ£ 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "ÀÚ½ÄÀÌ Á¾·áµÇ¾úÀ½" + +#: signame.c:158 +msgid "Power failure" +msgstr "Àü·Â Áß´Ü" + +#: signame.c:161 +msgid "Stopped" +msgstr "ÁßÁöµÊ" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "ÁßÁöµÊ (tty ÀÔ·Â)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "ÁßÁöµÊ (tty Ãâ·Â)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "ÁßÁöµÊ (½Ã±×³Î)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "CPU ½Ã°£ Á¦ÇÑ ÃÊ°úµÊ" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "ÆÄÀÏ Å©±â Á¦ÇÑ ÃÊ°úµÊ" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "°¡»ó ŸÀÌ¸Ó ½Ã°£ ÃÊ°úµÊ" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "ÇÁ·ÎÆÄÀϸµ ŸÀÌ¸Ó ½Ã°£ ÃÊ°úµÊ" + +#: signame.c:188 +msgid "Window changed" +msgstr "âÀÌ ¹Ù²î¾úÀ½" + +#: signame.c:191 +msgid "Continued" +msgstr "°è¼ÓµÊ" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "±ä±ÞÇÑ ÀÔÃâ·Â »óȲ" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "ÀÔÃâ·Â °¡´É" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "ÀÚ¿ø ¼Õ½Ç" + +#: signame.c:216 +msgid "Danger signal" +msgstr "À§Çè ½ÅÈ£" + +#: signame.c:219 +msgid "Information request" +msgstr "Á¤º¸ ¿äû" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "ºÎµ¿¼Ò¼öÁ¡ ¿¬»ê º¸Á¶ÇÁ·Î¼¼¼­°¡ ¾ø½À´Ï´Ù" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" + +#: variable.c:1541 +msgid "default" +msgstr "±âº»°ª" + +#: variable.c:1544 +msgid "environment" +msgstr "ȯ°æ" + +#: variable.c:1547 +msgid "makefile" +msgstr "¸ÞÀÌÅ©ÆÄÀÏ" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "-e ÇÏÀÇ È¯°æ" + +#: variable.c:1553 +msgid "command line" +msgstr "¸í·ÉÇà" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "`override' Áö½ÃÀÚ" + +#: variable.c:1559 +msgid "automatic" +msgstr "ÀÚµ¿" + +#: variable.c:1570 +#, fuzzy, c-format +msgid " (from `%s', line %lu)" +msgstr " (`%s'¿¡¼­, %lu¹ø° ÁÙ):\n" + +#: variable.c:1612 +#, fuzzy +msgid "# variable set hash-table stats:\n" +msgstr "# %2$u°³ÀÇ Çؽ¬ ¹öŶ¿¡ %1$u°³ÀÇ º¯¼ö.\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# º¯¼ö\n" + +#: variable.c:1627 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# ÆÐÅÏÀ» À§ÇÑ º¯¼ö °ªµé" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# ÆÐÅÏÀ» À§ÇÑ º¯¼ö °ªµéÀÌ ¾ø½À´Ï´Ù." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u°³ÀÇ ÆÐÅÏÀ» À§ÇÑ º¯¼ö °ªµé" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "°æ°í: Á¤ÀǵÇÁö ¾ÊÀº º¯¼ö `%.*s'" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search°¡ %d¸¦ ¸®ÅÏÇÏ¸ç ½ÇÆÐÇß½À´Ï´Ù\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "°æ°í: ºñ¾î ÀÖ´Â ¸®´ÙÀÌ·º¼Ç\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "³»ºÎ ¿À·ù: `%s' command_state" + +# DCL - Digital Command Language, VMS¿¡¼­¸¸ Á¸ÀçÇÏ´Â shell languageÀÇ ÀÏÁ¾ +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-°æ°í, DCL¿¡¼­ CTRL-Y¸¦ ´Ù½Ã »ç¿ë°¡´ÉÇϵµ·Ï ÇØ¾ß ÇÒ °ÍÀÔ´Ï´Ù.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "³»Àå [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "³»Àå CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "³»Àå RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "¾Ë ¼ö ¾ø´Â ³»Àå ¸í·É¾î `%s'\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "¿À·ù, ºó ¸í·É¾î\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "ÀÔ·ÂÀ» %s¿¡¼­ ¸®´ÙÀÌ·ºÆ®ÇÕ´Ï´Ù\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "¿À·ù¸¦ %sÀ¸·Î(·Î) ¸®´ÙÀÌ·ºÆ®ÇÕ´Ï´Ù\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Ãâ·ÂÀ» %s¿¡¼­ ¸®´ÙÀÌ·ºÆ®ÇÕ´Ï´Ù\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Ãâ·ÂÀ» %s¿¡¼­ ¸®´ÙÀÌ·ºÆ®ÇÕ´Ï´Ù\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "´ë½Å %s¸¦ ½ÇÇàÇÔ\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "½ÇÇà ¿À·ù, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Ž»ö °æ·Î\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# `vpath' Ž»ö °æ·Î°¡ ¾øÀ½." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u°³ÀÇ `vpath' Ž»ö °æ·Î.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# ÀϹÝÀûÀÎ (`VPATH' º¯¼ö) Ž»ö °æ·Î°¡ ¾øÀ½." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# ÀϹÝÀûÀÎ (`VPATH' º¯¼ö) Ž»ö °æ·Î:\n" +"# " + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# ÆÄÀÏ ¾øÀ½." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %2$u°³ÀÇ Çؽ¬ ¹öŶ¿¡ %1$u°³ÀÇ ÆÄÀÏ.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# ¹öŶ´ç %.3f°³ÀÇ ÆÄÀÏ, ÇÑ °³ÀÇ ¹öŶ¿¡ ÃÖ´ë %u°³ÀÇ ÆÄÀÏ.\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "¹®¹ý ¿À·ù, ¾ÆÁ÷ '\"' ¾È¿¡ ÀÖ½À´Ï´Ù\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "" +#~ "SIGCHLD ½Ã±×³ÎÀ» ¹Þ¾Ò½À´Ï´Ù; %u°³ÀÇ ÀÚ½ÄÇÁ·Î¼¼½º°¡ ³¡³ªÁö ¾Ê¾Ò½À´Ï´Ù.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-°æ°í, CTRL-Y´Â ÆÄ»ýµÈ ÇÁ·Î¼¼½ºµéÀ» ±×´ë·Î ³²°ÜµÑ °ÍÀÔ´Ï´Ù.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "<µð·ºÅ丮>" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "ÀÏÀ» ó¸®Çϱâ Àü¿¡ ¸ÕÀú <µð·ºÅ丮>·Î À̵¿ÇÕ´Ï´Ù" + +#~ msgid "FLAGS" +#~ msgstr "<Ç÷¡±×>" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "µð¹ö°Å¸¦ ºÙÀÏ ¼ö ÀÖµµ·Ï ÇÁ·Î¼¼½º¸¦ ÀϽà ÁߴܽÃŵ´Ï´Ù" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "ȯ°æº¯¼ö°¡ ¸ÞÀÌÅ©ÆÄÀϺ¸´Ù ¿ì¼±ÇÕ´Ï´Ù" + +#~ msgid "FILE" +#~ msgstr "<ÆÄÀÏ>" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "<ÆÄÀÏ>À» ¸ÞÀÌÅ©ÆÄÀÏ·Î ÀнÀ´Ï´Ù" + +#~ msgid "Ignore errors from commands" +#~ msgstr "¸í·É¿¡ ÀÖ´Â ¿À·ù¸¦ ¹«½ÃÇÕ´Ï´Ù" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Æ÷ÇÔ½Ãų ¸ÞÀÌÅ©ÆÄÀÏÀ» <µð·ºÅ丮>¿¡¼­ ã½À´Ï´Ù" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "ºÎÇÏ°¡ N º¸´Ù ÀÛÁö ¾ÊÀ¸¸é ´ÙÁß ÀÛ¾÷À» ½ÃÀÛÇÏÁö ¾Ê½À´Ï´Ù" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "½ÇÁ¦·Î ¾î¶² ¸í·Éµµ ½ÇÇàÇÏÁö ¾Ê½À´Ï´Ù; ±×³É Àμ⸸ ÇÕ´Ï´Ù" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "FILEÀ» ¸Å¿ì ¿À·¡µÈ °ÍÀ¸·Î °£ÁÖÇÏ°í ´Ù½Ã ¸¸µéÁö ¾Ê½À´Ï´Ù" + +#~ msgid "Don't echo commands" +#~ msgstr "¸í·ÉÀ» ¹ÝÇâÇÏÁö ¾Ê½À´Ï´Ù" + +#~ msgid "Turns off -k" +#~ msgstr "-k¸¦ ²ü´Ï´Ù" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "ÆÄÀÏÀ» ¿µ¿øÈ÷ »õ·Î¿î °ÍÀ¸·Î °£ÁÖÇÕ´Ï´Ù" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "sh.exe¸¦ »ç¿ëÇÒ ¼ö ¾øÀ¸¸é -j ȤÀº -jobs¸¦ ÁöÁ¤ÇÏÁö ¾Ê½À´Ï´Ù" + +#~ msgid "Resetting make for single job mode." +#~ msgstr "make°¡ ´ÜÀÏ ÀÛ¾÷ ¸ðµå·Î º¹±ÍÇÕ´Ï´Ù" + +#~ msgid "" +#~ ", by Richard Stallman and Roland McGrath.\n" +#~ "%sBuilt for %s\n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s\tFree Software Foundation, Inc.\n" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ "\n" +#~ "%sReport bugs to .\n" +#~ "\n" +#~ msgstr "" +#~ ", Richard Stallman°ú Roland McGrath.\n" +#~ "%s%s¿¡ ´ëÇÑ ºôµå\n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s\tFree Software Foundation, Inc.\n" +#~ "%sÀÌ ÇÁ·Î±×·¥Àº ÀÚÀ¯¼ÒÇÁÆ®¿þ¾îÀÔ´Ï´Ù; º¹»çÁ¶°ÇÀº ¼Ò½º¸¦ Âü°íÇϽʽÿÀ.\n" +#~ "%s»óÇ°¼ºÀ̳ª ƯÁ¤ ¸ñÀû¿¡ ´ëÇÑ ÀûÇÕ¼ºÀ» ºñ·ÔÇÏ¿©, ¾î¶°ÇÑ º¸Áõµµ ÇÏÁö \n" +#~ "%s¾Ê½À´Ï´Ù.\n" +#~ "\n" +#~ "%s¹®Á¦Á¡Àº ·Î ¾Ë·ÁÁֽʽÿÀ.\n" +#~ "\n" + +#~ msgid "Entering" +#~ msgstr "µé¾î°¨" + +#~ msgid "Leaving" +#~ msgstr "³ª°¨" + +#~ msgid "extraneous `endef'" +#~ msgstr "¿©ºÐÀÇ `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "ºó `override' Áö½ÃÀÚ" + +#~ msgid "invalid `override' directive" +#~ msgstr "À߸øµÈ `override' Áö½ÃÀÚ" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "`%sinclude'¿¡ ÆÄÀÏÀ̸§ÀÌ ¾ø½À´Ï´Ù" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "Ÿ°Ù `%s'Àº(´Â) ¼±ÇàÁ¶°Ç ÆÐÅÏÀ» ºó °ªÀ¸·Î ³»¹ö·Á µÎ°Ô µË´Ï´Ù" + +#~ msgid "# No variables." +#~ msgstr "# º¯¼ö ¾øÀ½." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# ¹öŶ´ç Æò±Õ %.1f°³ÀÇ º¯¼ö, ÇÑ °³ÀÇ ¹öŶ¿¡ ÃÖ´ë %u°³.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# ¹öŶ´ç Æò±Õ %d.%d°³ÀÇ º¯¼ö, ÇÑ °³ÀÇ ¹öŶ¿¡ ÃÖ´ë %u°³.\n" diff --git a/po/lt.gmo b/po/lt.gmo new file mode 100644 index 0000000..a956d85 Binary files /dev/null and b/po/lt.gmo differ diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..3b337bd --- /dev/null +++ b/po/lt.po @@ -0,0 +1,1971 @@ +# translation of make-3.81 to Lithuanian +# Copyright (C) 2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# Gintautas Miliauskas , 2008. +msgid "" +msgstr "" +"Project-Id-Version: make-3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2008-05-17 21:42+0300\n" +"Last-Translator: Gintautas Miliauskas \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%" +"100<10 || n%100>=20) ? 1 : 2);\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "bandymas naudoti nepalaikomą funkcionalumą: „%s“" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: Archyvas „%s“ neegzistuoja" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: „%s“ nėra taisyklingas archyvas" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "" + +#: arscan.c:69 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: arscan.c:175 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "nepavyko atverti bibliotekos „%s“ bandant surasti narį „%s“" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Narys „%s“%s: %ld baitų pozicijoje %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (pavadinimas gali bÅ«ti sutrumpintas)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Trinamas failas „%s“" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Trinamas failas „%s“" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# vykdytinos komandos" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (integruota)" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (nuo „%s“, %lu eilutė):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Aplankai\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: negalėjo bÅ«ti stat'intas.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (key %s, mtime %d): nepavyko atverti.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "" + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "" + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "" + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Ne" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " failai, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "ne" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " negalimybės" + +#: dir.c:1075 +msgid " so far." +msgstr " kol kas." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " negalimybės %lu aplankuose.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Rekursyvus kintamasis „%s“ nukreipia į save (anksčiau ar vėliau)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "neterminuota nuoroda į kintamąjį" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Komandos nurodytos failui „%s“ %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "Komandos failui „%s“ rastos pagal neiÅ¡reikÅ¡tinę taisyklių paieÅ¡ką" + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "bet „%s“ dabar laikomas tuo pačiu failu kaip „%s“." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "Komandos „%s“ bus ignoruojamos „%s“ komandų naudai." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Trinamas tarpinis failas „%s“" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Å alinami tarpiniai failai...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Laiko žymė už rėžių; keičiama į %s" + +#: file.c:804 +msgid "Current time" +msgstr "Dabartinis laikas" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Ne tikslas:" + +#: file.c:929 +#, fuzzy +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Brangus failas (reikalingas .PRECIOUS)" + +#: file.c:931 +#, fuzzy +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Keistas tikslas (reikalingas .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Komandinės eilutės tikslas" + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Numatytoji reikÅ¡mė, MAKEFILES, arba -include/sinclude „make“ failas" + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# NeiÅ¡reikÅ¡tinių taisyklių paieÅ¡ka atlikta." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# NeiÅ¡reikÅ¡tinių taisyklių paieÅ¡ka neatlikta." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# IÅ¡reikÅ¡tinis/statinis Å¡ablono kamienas: „%s“\n" + +#: file.c:942 +#, fuzzy +msgid "# File is an intermediate prerequisite." +msgstr "# Failas yra tarpinė sąlyga" + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Taip pat sukuria:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Modifikacijos laikas niekada netikrintas." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Failas neegzistuoja." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Failas labai senas." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Paskutinį kartą pakeista %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Failas atnaujintas." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Failas nebuvo atnaujintas." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Dabar vykdomos komandos (TAI KLAIDA)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Vykdomos priklausomybių komandos (TAI KLAIDA)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Sėkmingai atnaujinta." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Turi bÅ«ti atnaujinta (-q nustatyta)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Nepavyko atnaujinti." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Netaisyklinga reikÅ¡mė „update_status“ naryje!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Netaisyklinga reikÅ¡mė „command_state“ naryje!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Failai" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# failų maiÅ¡os lentelės statistika:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "" + +#: function.c:1458 +#, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "" + +#: function.c:1469 +#, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "" + +#: function.c:1479 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: parametras `%s' dviprasmis\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: argumentas „--%s“ neleidžia parametro\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: argumentas „%c%s“ neleidžia parametro\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: parametrui „%s“ reikia argumento\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: neatpažintas argumentas „--%s“\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: neatpažintas argumentas „%c%s“\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: neleistinas parametras -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: netaisyklingas argumentas -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: parametrui reikia argumento -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: parametras „-W %s“ dviprasmis\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: parametras „-W %s“ neleidžia argumento\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "" + +#: job.c:460 +msgid " (core dumped)" +msgstr "" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "" + +#: job.c:579 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr "" + +#: job.c:758 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: job.c:759 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "" + +#: job.c:763 +#, fuzzy, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "%s: nepavyko atverti laikinojo failo: %s" + +#: job.c:861 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" + +#: job.c:920 +#, fuzzy +msgid "write jobserver" +msgstr "raÅ¡ymo klaida: %s" + +#: job.c:922 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: job.c:1525 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" + +#: job.c:1778 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Nereikia atnaujinti taikinio „%s“" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "" + +#: job.c:1912 +#, fuzzy +msgid "cannot enforce load limit: " +msgstr "%s: nepayko pakeisti limito: %s" + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Komanda nerasta" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Kevalo programa nerasta" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL pakeistas (buvo „%s“, dabar „%s“)\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" + +#: main.c:303 +msgid "Options:\n" +msgstr "" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr "" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" + +#: main.c:347 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: main.c:353 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr "" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "negalimas tuščias failo pavadinimas" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "nežinomas debug lygio specifikacija „%s“" + +#: main.c:690 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: main.c:697 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" + +#: main.c:705 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: main.c:706 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: main.c:781 main.c:792 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: main.c:834 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "" + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "" + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "" + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" + +#: main.c:1750 +msgid "dup jobserver" +msgstr "" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Atnaujinami „make“ failai....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "" + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "" + +#: main.c:2018 +#, fuzzy, c-format +msgid "Makefile `%s' was not found" +msgstr "„Make“ failas „%s“ nerastas" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Nepavyko grįžti į pirminį aplanką." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "" + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Nenurodyta tikslų ir nerasta „make“ failų" + +#: main.c:2272 +msgid "No targets" +msgstr "Nėra tikslų" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Atnaujinami tikslai...\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Naudojimas: %s [argumentai] [tikslas] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Å i programa sukompiliuota %s sistemai\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Å i programa sukompiliuota %s (%s) sistemai\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "PraneÅ¡kite apie klaidas adresu \n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "parametrui „-%c“ reikia netuščio argumento" + +#: main.c:2617 +#, fuzzy, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "parametrui „-%c“ reikia teigiamo sveiko argumento" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sÅ i programa sukompiliuota %s sistemai\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sÅ i programa sukompiliuota %s (%s) sistemai\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Ä®einama į nežinomą aplanką\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: IÅ¡einama iÅ¡ nežinomo aplanko\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Ä®einama į aplanką „%s“\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: IÅ¡einama iÅ¡ aplanko „%s“\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Ä®einama į nežinomą aplanką\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: IÅ¡einama iÅ¡ nežinomo aplanko\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Ä®einama į aplanką „%s“\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: IÅ¡einama iÅ¡ aplanko „%s“\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Pabaiga.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Nežinoma klaida %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "baigėsi virtuali atmintis" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: user %lu (real %lu), group %lu (real %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "" + +#: misc.c:808 +msgid "User access" +msgstr "" + +#: misc.c:856 +msgid "Make access" +msgstr "" + +#: misc.c:890 +msgid "Child access" +msgstr "" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "raÅ¡ymo klaida: %s" + +#: misc.c:956 +msgid "write error" +msgstr "raÅ¡ymo klaida" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Skaitomi „make“ failai...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Skaitomas „make“ failas „%s“" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (nėra numatytojo tikslo)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (paieÅ¡kos kelias)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (nesvarbu)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (nėra ~ iÅ¡plėtimo)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "netaisyklinga sąlygos sintaksė" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "komandos prasideda prieÅ¡ pirmąjį tikslą" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "trÅ«ksta taisyklės prieÅ¡ komandas" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "trÅ«ksta skirtuko%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (ar norėjote padėti TAB simbolį vietoje 8 tarpų?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "trÅ«ksta tikslo Å¡ablono" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "keli tikslo Å¡ablonai" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "tikslo Å¡ablone nėra „%%“" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "trÅ«ksta „endif“" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "tuščias kintamojo pavadinimas" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Perteklinis tekstas po „endef“ direktyvos" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "trÅ«ksta „endef“, nebaigtas „define“" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Perteklinis tekstas po „endef“ direktyvos" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Perteklinis tekstas po „%s“ direktyvos" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "perteklinis „%s“" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "" + +#: read.c:2006 +#, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "" + +#: read.c:2009 +#, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Nėra ką daryti su „%s“." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "„%s“ atnaujinti nereikia." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sNėra taisyklės pasiekti tikslui „%s“%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sNėra taisyklės pasiekti tikslui „%s“, kurio reikia „%s“%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Svarstomas tikslo failas „%s“.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Neseniai bandyta ir nepavyko atnaujinti failo „%s“.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Failas „%s“ jau apsvarstytas.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Vis dar atnaujinamas failas „%s“.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Baigtas atnaujinti failas „%s“.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Failas „%s“ neegzistuoja.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Rasta neiÅ¡reikÅ¡tinė taisyklė tikslui „%s“.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Nerasta neiÅ¡reikÅ¡tinių taisyklių tikslui „%s“.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Nėra ką daryti su „%s“." + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "" + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Tikslas „%s“ neatnaujintas dėl klaidų." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: remake.c:765 +#, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Nereikia atnaujinti taikinio „%s“" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "BÅ«tina atnaujinti taikinį „%s“.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr "" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Vykdomos „%s“ komandos.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "" + +#: remake.c:1370 +#, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# NeiÅ¡reikÅ¡tinės taisyklės" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Nėra neiÅ¡reikÅ¡tinių taisyklių." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u neiÅ¡reikÅ¡tinių taisyklių, %u" + +#: rule.c:526 +msgid " terminal." +msgstr "" + +#: rule.c:534 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "" + +#: signame.c:86 +msgid "unknown signal" +msgstr "nežinomas signalas" + +#: signame.c:94 +msgid "Hangup" +msgstr "" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Pertraukimas" + +#: signame.c:100 +msgid "Quit" +msgstr "IÅ¡eita" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Neleistina instrukcija" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "" + +#: signame.c:111 +msgid "Aborted" +msgstr "" + +#: signame.c:114 +#, fuzzy +msgid "IOT trap" +msgstr "EMT gaudyklė" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT gaudyklė" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Slankaus kablelio klaida" + +#: signame.c:123 +msgid "Killed" +msgstr "Nutraukta" + +#: signame.c:126 +msgid "Bus error" +msgstr "Magistralės klaida" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Segmentacijos klaida" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Blogas sisteminis kvietimas" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Žadintuvas" + +#: signame.c:141 +#, fuzzy +msgid "Terminated" +msgstr "apribota" + +#: signame.c:144 +#, fuzzy +msgid "User defined signal 1" +msgstr "%s: nutrauktas signalo %d" + +#: signame.c:147 +#, fuzzy +msgid "User defined signal 2" +msgstr "%s: nutrauktas signalo %d" + +#: signame.c:152 signame.c:155 +#, fuzzy +msgid "Child exited" +msgstr "Failas jau egzistuoja" + +#: signame.c:158 +msgid "Power failure" +msgstr "Elektros maitinimo sutrikimas" + +#: signame.c:161 +msgid "Stopped" +msgstr "Sustabdyta" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Sustabdyta (tty įvedimas)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Sustabdyta (tty iÅ¡vedimas)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Sustabdyta (signalas)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "VirÅ¡ytas CPU laiko limitas" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "VirÅ¡ytas failo dydžio limitas" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "" + +#: signame.c:188 +msgid "Window changed" +msgstr "Langas pakeistas" + +#: signame.c:191 +msgid "Continued" +msgstr "Pratęsta" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "Galimas įvedimas/iÅ¡vedimas" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "IÅ¡teklius prarastas" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Pavojaus signalas" + +#: signame.c:219 +msgid "Information request" +msgstr "Informacijos užklausa" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Slankaus kablelio koprocesorius neprieinamas" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# failų maiÅ¡os lentelės statistika:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "" + +#: variable.c:1544 +msgid "environment" +msgstr "" + +#: variable.c:1547 +msgid "makefile" +msgstr "" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "" + +#: variable.c:1553 +#, fuzzy +msgid "command line" +msgstr "%s: komanda nerasta" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "" + +#: variable.c:1559 +msgid "automatic" +msgstr "" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr "" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: variable.h:219 +#, fuzzy, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "%s: neatpažintas argumentas „%c%s“\n" + +#: vmsfunctions.c:92 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "" + +#: vmsjobs.c:471 +#, fuzzy, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "paskutinė komanda: %s\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "" + +#: vmsjobs.c:513 +#, fuzzy, c-format +msgid "Redirected error to %s\n" +msgstr "skaitymo klaida: %d: %s" + +#: vmsjobs.c:523 +#, c-format +msgid "Append output to %s\n" +msgstr "" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" + +#~ msgid "extraneous `endef'" +#~ msgstr "perteklinis „endef“" + +#~ msgid "empty `override' directive" +#~ msgstr "tuščia „override“ direktyva" + +#, fuzzy +#~ msgid "invalid `override' directive" +#~ msgstr "netaisyklinga „override“ direktyva" diff --git a/po/make.pot b/po/make.pot new file mode 100644 index 0000000..175984e --- /dev/null +++ b/po/make.pot @@ -0,0 +1,1915 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "" + +#: arscan.c:69 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: arscan.c:175 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr "" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr "" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr "" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "" + +#: commands.c:676 +msgid "# recipe to execute" +msgstr "" + +#: commands.c:679 +msgid " (built-in):" +msgstr "" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr "" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "" + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "" + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "" + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr "" + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "" + +#: dir.c:1071 +msgid " impossibilities" +msgstr "" + +#: dir.c:1075 +msgid " so far." +msgstr "" + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr "" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "" + +#: file.c:267 +#, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "" + +#: file.c:272 +#, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "" + +#: file.c:278 +#, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "" + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "" + +#: file.c:804 +msgid "Current time" +msgstr "" + +#: file.c:924 +msgid "# Not a target:" +msgstr "" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "" + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "" + +#: file.c:933 +msgid "# Command line target." +msgstr "" + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "" + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "" + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "" + +#: file.c:946 +msgid "# Also makes:" +msgstr "" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "" + +#: file.c:954 +msgid "# File does not exist." +msgstr "" + +#: file.c:956 +msgid "# File is very old." +msgstr "" + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "" + +#: file.c:964 +msgid "# File has been updated." +msgstr "" + +#: file.c:964 +msgid "# File has not been updated." +msgstr "" + +#: file.c:968 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "" + +#: file.c:971 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" + +#: file.c:980 +msgid "# Successfully updated." +msgstr "" + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "" + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "" + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "" + +#: function.c:1458 +#, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "" + +#: function.c:1469 +#, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "" + +#: function.c:1479 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "" + +#: job.c:460 +msgid " (core dumped)" +msgstr "" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "" + +#: job.c:579 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr "" + +#: job.c:758 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "" + +#: job.c:759 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "" + +#: job.c:861 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "" + +#: job.c:920 +msgid "write jobserver" +msgstr "" + +#: job.c:922 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: job.c:1525 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "" + +#: job.c:1778 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "" + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" + +#: main.c:303 +msgid "Options:\n" +msgstr "" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr "" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" + +#: main.c:347 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: main.c:353 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr "" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "" + +#: main.c:690 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: main.c:697 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" + +#: main.c:705 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: main.c:706 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: main.c:781 main.c:792 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: main.c:834 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "" + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "" + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "" + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" + +#: main.c:1750 +msgid "dup jobserver" +msgstr "" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "" + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "" + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "" + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "" + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "" + +#: main.c:2272 +msgid "No targets" +msgstr "" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "" + +#: main.c:2562 +#, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "" + +#: main.c:3054 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "" + +#: main.c:3056 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr "" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "" + +#: misc.c:729 +msgid "Initialized access" +msgstr "" + +#: misc.c:808 +msgid "User access" +msgstr "" + +#: misc.c:856 +msgid "Make access" +msgstr "" + +#: misc.c:890 +msgid "Child access" +msgstr "" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "" + +#: misc.c:956 +msgid "write error" +msgstr "" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr "" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr "" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr "" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr "" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "" + +#: read.c:891 +msgid "recipe commences before first target" +msgstr "" + +#: read.c:940 +msgid "missing rule before recipe" +msgstr "" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr "" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "" + +#: read.c:1367 +msgid "extraneous text after `define' directive" +msgstr "" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "" + +#: read.c:1420 +msgid "extraneous text after `endef' directive" +msgstr "" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "" + +#: read.c:2006 +#, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "" + +#: read.c:2009 +#, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "" + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "" + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "" + +#: remake.c:502 +#, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "" + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "" + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "" + +#: remake.c:765 +#, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr "" + +#: remake.c:815 +#, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "" + +#: remake.c:1370 +#, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" + +#: rule.c:526 +msgid " terminal." +msgstr "" + +#: rule.c:534 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "" + +#: signame.c:86 +msgid "unknown signal" +msgstr "" + +#: signame.c:94 +msgid "Hangup" +msgstr "" + +#: signame.c:97 +msgid "Interrupt" +msgstr "" + +#: signame.c:100 +msgid "Quit" +msgstr "" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "" + +#: signame.c:111 +msgid "Aborted" +msgstr "" + +#: signame.c:114 +msgid "IOT trap" +msgstr "" + +#: signame.c:117 +msgid "EMT trap" +msgstr "" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "" + +#: signame.c:123 +msgid "Killed" +msgstr "" + +#: signame.c:126 +msgid "Bus error" +msgstr "" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "" + +#: signame.c:132 +msgid "Bad system call" +msgstr "" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "" + +#: signame.c:141 +msgid "Terminated" +msgstr "" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "" + +#: signame.c:158 +msgid "Power failure" +msgstr "" + +#: signame.c:161 +msgid "Stopped" +msgstr "" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "" + +#: signame.c:188 +msgid "Window changed" +msgstr "" + +#: signame.c:191 +msgid "Continued" +msgstr "" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "" + +#: signame.c:213 +msgid "Resource lost" +msgstr "" + +#: signame.c:216 +msgid "Danger signal" +msgstr "" + +#: signame.c:219 +msgid "Information request" +msgstr "" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" + +#: variable.c:1541 +msgid "default" +msgstr "" + +#: variable.c:1544 +msgid "environment" +msgstr "" + +#: variable.c:1547 +msgid "makefile" +msgstr "" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "" + +#: variable.c:1553 +msgid "command line" +msgstr "" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "" + +#: variable.c:1559 +msgid "automatic" +msgstr "" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr "" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "" + +#: vmsfunctions.c:92 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "" + +#: vmsjobs.c:523 +#, c-format +msgid "Append output to %s\n" +msgstr "" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" diff --git a/po/nl.gmo b/po/nl.gmo new file mode 100644 index 0000000..1f15184 Binary files /dev/null and b/po/nl.gmo differ diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..5235d0c --- /dev/null +++ b/po/nl.po @@ -0,0 +1,2070 @@ +# Dutch translations for make. +# Copyright (C) 2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# +# Taco Witte , 2004. +# Benno Schulenberg , 2005, 2006, 2007, 2010. +msgid "" +msgstr "" +"Project-Id-Version: make-3.81.91\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2010-07-24 11:28+0200\n" +"Last-Translator: Benno Schulenberg \n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "poging tot gebruik van niet-ondersteunde functie: '%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "het 'touchen' van een archiefonderdeel is niet mogelijk op VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: Archief '%s' bestaat niet" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: '%s' is geen geldig archief" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: Onderdeel '%s' bestaat niet in '%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: ar_member_touch van '%s' is mislukt" + +#: arscan.c:69 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"uitpakken van module-info door lbr$set_module() is mislukt, afsluitwaarde= %d" + +#: arscan.c:175 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() is mislukt, afsluitwaarde = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "kan bibliotheek '%s' niet openen om onderdeel '%s' op te zoeken" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Onderdeel '%s'%s: %ld bytes bij %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (naam kan afgekapt zijn)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modus = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Afgebroken.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Archiefonderdeel '%s' kan verkeerd zijn; niet verwijderd" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Archiefonderdeel '%s' kan verkeerd zijn; niet verwijderd" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Verwijderen van bestand '%s'" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Verwijderen van bestand '%s'" + +#: commands.c:676 +msgid "# recipe to execute" +msgstr "# uit te voeren recept" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (ingebouwd):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (van '%s', regel %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Mappen\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# kan status van %s niet opvragen.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (sleutel %s, wijzigingstijd %d): kan niet worden geopend.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (apparaat %d, inode [%d,%d,%d]): kan niet worden geopend.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (apparaat %ld, inode %ld): kan niet worden geopend.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (sleutel %s, wijzigingstijd %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (apparaat %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (apparaat %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Geen" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " bestanden, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "geen" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " onmogelijkheden" + +#: dir.c:1075 +msgid " so far." +msgstr " tot nu toe." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " onmogelijkheden in %lu mappen.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Recursieve variabele '%s' verwijst naar zichzelf, uiteindelijk" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "onafgemaakte verwijzing naar variabele" + +#: file.c:267 +#, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Recept voor bestand '%s' is opgegeven in %s:%lu," + +#: file.c:272 +#, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "Recept voor bestand '%s' werd gevonden via impliciet zoeken," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "maar '%s' wordt nu als hetzelfde bestand beschouwd als '%s'." + +#: file.c:278 +#, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "Recept voor '%s' zal worden genegeerd ten gunste van die voor '%s'." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "kan enkeldubbelpunts '%s' niet hernoemen tot dubbeldubbelpunts '%s'" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "kan dubbeldubbelpunts '%s' niet hernoemen tot enkeldubbelpunts '%s'" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Verwijderen van tussentijds bestand '%s'" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Verwijderen van tussentijdse bestanden...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tijdsstempel ligt buiten bereik; wordt vervangen door %s" + +#: file.c:804 +msgid "Current time" +msgstr "Huidige tijd" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Is geen doel:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Waardevol bestand (vereiste van .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Nepdoel (vereiste van .PHONY)." + +#: file.c:933 +msgid "# Command line target." +msgstr "# Doel afkomstig van opdrachtregel." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Een standaard, of MAKEFILES, of -include/sinclude makefile." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Impliciete regel-zoekopdracht is uitgevoerd." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Impliciete regel-zoekopdracht is niet uitgevoerd." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Impliciete/statische patroonstam: '%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Bestand is een tussentijds vereiste." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Maakt ook:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Wijzigingstijd is nooit gecontroleerd." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Bestand bestaat niet." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Bestand is erg oud." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Laatst gewijzigd %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Bestand is bijgewerkt." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Bestand is niet bijgewerkt." + +#: file.c:968 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Nog lopend recept (DIT IS EEN PROGRAMMAFOUT)." + +#: file.c:971 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Nog lopende receptafhankelijkheden (DIT IS EEN PROGRAMMAFOUT)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Succesvol bijgewerkt." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Moet worden bijgewerkt (-q is ingesteld)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Bijwerken is mislukt." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Ongeldige waarde in 'update_status'-onderdeel!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Ongeldige waarde in 'command_state'-onderdeel!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Bestanden" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# hashtabel-statistieken van bestanden:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "niet-numeriek eerste argument van 'word'-functie" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "eerste argument van 'word'-functie moet groter zijn dan 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "niet-numeriek eerste argument van 'wordlist'-functie" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "niet-numeriek tweede argument van 'wordlist'-functie" + +#: function.c:1458 +#, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(In) is mislukt (e=%ld)\n" + +#: function.c:1469 +#, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(Err) is mislukt (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() is mislukt (e=%ld)\n" + +#: function.c:1479 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() is mislukt\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Opschonen van tijdelijk batch-bestand %s\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "onvoldoende aantal argumenten (%d) voor functie '%s'" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "niet-geïmplementeerd op dit platform: functie '%s'" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "onafgemaakte aanroep van functie '%s': '%c' ontbreekt" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: optie '%s' is niet eenduidig\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: optie '--%s' staat geen argument toe\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: optie '%c%s' staat geen argument toe\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: optie '%s' vereist een argument\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: onbekende optie '--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: onbekende optie '%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: optie vereist een argument -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: optie '-W %s' is niet eenduidig\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: optie '-W %s' staat geen argument toe\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"kan %lu bytes voor hashtabel niet reserveren: onvoldoende geheugen " +"beschikbaar" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Belasting=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Herhash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Botsingen=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Zoeken naar impliciete regel voor '%s'.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Zoeken naar archiefonderdeel-impliciete regel voor '%s'.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Impliciete regelrecursie wordt ontweken.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Patroonregel wordt geprobeerd met stam '%.*s'.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Onmogelijke regelvereiste '%s' wordt verworpen.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Onmogelijke impliciete vereiste '%s' wordt verworpen.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Proberen van regelvereiste '%s'.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Proberen van impliciete vereiste '%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Vereiste '%s' gevonden als VPATH '%s'.\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Zoeken naar een regel met tussentijds bestand '%s'.\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Kan geen tijdelijk bestand aanmaken\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Fout 0x%x (genegeerd)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Fout 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Fout %d (genegeerd)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Fout %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (geheugendump gemaakt)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Wachten op onvoltooide taken..." + +#: job.c:579 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Levend kind %p (%s) PID %s %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (ginds)" + +#: job.c:758 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Beëindigen van verliezend kind %p PID %s %s\n" + +#: job.c:759 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Beëindigen van winnend kind %p PID %s %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Opschonen van tijdelijk batch-bestand %s\n" + +#: job.c:861 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Verwijderen van kind %p PID %s%s uit de ketting.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "schrijven naar taakserver" + +#: job.c:922 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Token vrijgegeven voor kind %p (%s).\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() kan geen proces starten (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"%d argumenten geteld bij mislukte start\n" + +#: job.c:1525 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Opname van kind %p (%s) PID %s%s in de ketting.\n" + +#: job.c:1778 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Token verkregen voor kind %p (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "lezen van taken-pijp" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "Recept uit %s:%lu wordt aangeroepen om doel '%s' bij te werken.\n" + +#: job.c:1802 +#, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Ingebouwd recept wordt aangeroepen om doel '%s' bij te werken.\n" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "kan belastingsgrenzen niet afdwingen op dit besturingssysteem" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "kan belastingsgrens niet afdwingen: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"geen bestandshandvatten meer beschikbaar: kan standaardinvoer niet " +"dupliceren\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"geen bestandshandvatten meer beschikbaar: kan standaarduitvoer niet " +"dupliceren\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Kan standaardinvoer niet herstellen\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Kan standaarduitvoer niet herstellen\n" + +#: job.c:2127 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "'make' heeft kind met PID %s verwerkt, maar wacht nog op PID %s\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Opdracht niet gevonden" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Shell-programma niet gevonden" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: mogelijk geen omgevingsruimte meer beschikbaar" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL is gewijzigd (was '%s', is nu '%s')\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Maken van tijdelijk batch-bestand %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Inhoud van batch-bestand:%s\n" +"\t%s\n" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (regel %d) Onjuiste shell-context (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "" +" \n" +"Opties:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" +" -b, -m (genegeerd, maar herkend wegens " +"compatibiliteit)\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make onvoorwaardelijk alle doelen maken\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C MAP, --directory=MAP naar deze map gaan alvorens iets te doen\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d veel informatie weergeven voor het debuggen\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=VLAGGEN] verschillende soorten debuginformatie " +"weergeven\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides omgevingsvariabelen gaan boven Makefiles\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=TEKST deze TEKST als Makefile-statement evalueren\n" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f BESTAND, --file=BESTAND, --makefile=BESTAND\n" +" het gegeven bestand als Makefile gebruiken\n" +"\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help deze hulptekst tonen en stoppen\n" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors alle fouten in recepten negeren\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I MAP, --include-dir=MAP deze map doorzoeken naar ingevoegde " +"Makefiles\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] het uitvoeren van N taken tegelijk toestaan;\n" +" zonder N is het aantal onbeperkt\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going doorgaan als een doel niet gemaakt kan " +"worden\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" alleen extra taken starten als de\n" +" systeembelasting lager is dan N\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times van een symbolische koppeling en zijn doel " +"de\n" +" laatste wijzigingstijd gebruiken\n" +"\n" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" recepten niet uitvoeren, alleen weergeven\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o BESTAND, --old-file=BESTAND, --assume-old=BESTAND\n" +" BESTAND als oud beschouwen, niet opnieuw " +"maken\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base interne gegevensbank van 'make' weergeven\n" + +#: main.c:347 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question geen recepten uitvoeren; de afsluitwaarde\n" +" geeft aan of alles bijgewerkt is\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules ingebouwde impliciete regels uitzetten\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables ingebouwde instellingen van variabelen " +"uitzetten\n" +"\n" + +#: main.c:353 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet recepten niet weergeven\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr " -S, --no-keep-going, --stop optie '-k' uitzetten\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch doelen aanraken in plaats van opnieuw maken\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version versienummer tonen en stoppen\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory de huidige map weergeven\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory optie '-w' uitzetten, ook als deze impliciet\n" +" was aangezet\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W BESTAND, --what-if=BESTAND, --new-file=BESTAND, --assume-new=BESTAND\n" +" BESTAND als oneindig nieuw beschouwen\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables waarschuwen als naar een ongedefinieerde\n" +" variabele wordt verwezen\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "lege tekenreeks is ongeldig als bestandsnaam" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "onbekende aanduiding '%s' voor debug-niveau" + +#: main.c:690 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Onderbreking/uitzondering gekregen (code = 0x%lx, adres = 0x%p)\n" + +#: main.c:697 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Filter voor onbehandelde uitzondering is aangeroepen vanuit programma %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" + +#: main.c:705 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Toegangsrechtenovertreding: schrijfopdracht op adres 0x%p\n" + +#: main.c:706 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Toegangsrechtenovertreding: leesopdracht op adres 0x%p\n" + +#: main.c:781 main.c:792 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() stelt default_shell = %s in\n" + +#: main.c:834 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"find_and_set_shell() stelt na doorzoeken van pad default_shell = %s in\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s slaapt gedurende 30 seconden..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "klaar met 30 seconden slapen. Make gaat verder.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile op standaardinvoer is dubbel opgegeven." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (tijdelijk bestand)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (tijdelijk bestand)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Parallele taken (-j) worden op dit platform niet ondersteund." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Opnieuw instellen op enkele-taakmodus (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "*interne fout*: meerdere opties '--jobserver-fds'" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "*interne fout*: ongeldige tekenreeks '%s' voor '--jobserver-fds'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Taakservercliënt (bestandsdescriptor %d,%d)\n" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"Waarschuwing: '-jN' is afgedwongen in een deelproces: taakserver-modus " +"uitgezet." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "dubbele taakserver" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"Waarschuwing: taakserver is onbeschikbaar: '-j1' wordt gebruikt. Voeg '+' " +"toe aan de ouderregel." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "maken van taken-pijp" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "initialiseren van taakserver-pijp" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" +"Symbolische koppelingen worden niet ondersteund: '-L' wordt uitgeschakeld." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Bijwerken van makefiles...\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Makefile '%s' bevat mogelijk een lus; wordt niet opnieuw gemaakt.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Opnieuw maken van makefile '%s' is mislukt." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Ingesloten makefile '%s' is niet gevonden." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Makefile '%s' is niet gevonden." + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Kan niet terugkeren naar oorspronkelijke map." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Opnieuw uitvoeren[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "verwijderen (van tijdelijk bestand): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL bevat meer dan één doel" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Geen doelen opgegeven en geen makefile gevonden" + +#: main.c:2272 +msgid "No targets" +msgstr "Geen doelen" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Bijwerken van doelen...\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"Waarschuwing: Klokafwijking geconstateerd. Het maken is mogelijk " +"onvolledig gebeurd." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Gebruik: %s [OPTIES] [DOEL]...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Dit programma is gemaakt voor %s.\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Dit programma is gemaakt voor %s (%s).\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Rapporteer programmafouten aan ,\n" +"meld gebreken in de vertaling aan .\n" + +#: main.c:2562 +#, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "de optie '%s%sc' vereist een niet-lege tekenreeks als argument" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "de optie '-%c' vereist een positief, geheel argument" + +#: main.c:3054 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sDit programma is gemaakt voor %s.\n" + +#: main.c:3056 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sDit programma is gemaakt voor %s (%s).\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" +"%sLicentie GPLv3+: GNU GPL versie 3 of nieuwer \n" +"%sDit is vrije software: u mag het vrijelijk wijzigen en verder " +"verspreiden.\n" +"%sEr is GEEN GARANTIE, voor zover de wet dit toestaat.\n" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make-gegevensbank, weergegeven op %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Make-gegevensbank voltooid op %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Een onbekende map wordt binnengegaan\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Een onbekende map wordt verlaten\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Map '%s' wordt binnengegaan\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Map '%s' wordt verlaten\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Een onbekende map wordt binnengegaan\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Een onbekende map wordt verlaten\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Map '%s' wordt binnengegaan\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Map '%s' wordt verlaten\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Gestopt.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Onbekende fout %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "onvoldoende geheugen beschikbaar" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: gebruiker %lu (echt %lu), groep %lu (echt %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Toegang geïnitialiseerd" + +#: misc.c:808 +msgid "User access" +msgstr "Gebruikerstoegang" + +#: misc.c:856 +msgid "Make access" +msgstr "Make-toegang" + +#: misc.c:890 +msgid "Child access" +msgstr "Kindtoegang" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "schrijffout: %s" + +#: misc.c:956 +msgid "write error" +msgstr "schrijffout" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Lezen van makefiles...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Lezen van makefile '%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (geen standaarddoel)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (zoekpad)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (maakt niet uit)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (geen expansie van ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "ongeldige syntaxis in voorwaardelijk deel" + +#: read.c:891 +msgid "recipe commences before first target" +msgstr "recept begint voor eerste doel" + +#: read.c:940 +msgid "missing rule before recipe" +msgstr "ontbrekende regel voor recept" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "ontbrekend scheidingsteken%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (bedoelde u TAB in plaats van 8 spaties?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "ontbrekend doelpatroon" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "meerdere doelpatronen" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "doelpatroon bevat geen '%%'" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "ontbrekende 'endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "lege naam van variabele" + +#: read.c:1367 +msgid "extraneous text after `define' directive" +msgstr "extra tekst na 'define'-opdracht" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "ontbrekende 'endef', onafgemaakte 'define'" + +#: read.c:1420 +msgid "extraneous text after `endef' directive" +msgstr "extra tekst na 'endef'-opdracht" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "extra tekst na '%s'-opdracht" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "extra '%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "slechts één 'else' per voorwaardelijk deel" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Onjuiste doelspecifieke variabele-definitie" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "vereisten kunnen niet in recepten gedefinieerd worden" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "gemengde impliciete en statische patroonregels" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "gemengde impliciete en normale regels" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "doel '%s' komt niet overeen met doelpatroon" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "doelbestand '%s' heeft zowel ':'- als '::'-items" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "doel '%s' is meerdere keren gegeven in dezelfde regel." + +#: read.c:2006 +#, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "Waarschuwing: er wordt voorbijgegaan aan recept voor doel '%s'" + +#: read.c:2009 +#, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "Waarschuwing: oud recept voor doel '%s' wordt genegeerd" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "Waarschuwing: NUL-teken gezien; de rest van de regel wordt genegeerd" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Er hoeft niets gedaan te worden voor '%s'." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "'%s' is bijgewerkt." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Bijknippen van bestand '%s'.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sEr is geen regel om doel '%s' te maken%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sEr is geen regel om doel '%s' te maken, nodig voor '%s'%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Doelbestand '%s' wordt overwogen.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Bijwerken van bestand '%s' is recent geprobeerd en mislukt.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Bestand '%s' was al overwogen.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Bestand '%s' wordt nog bijgewerkt.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Bijwerken van bestand '%s' is voltooid.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Bestand '%s' bestaat niet.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Waarschuwing: .LOW_RESOLUTION_TIME-bestand '%s' heeft een hoge-resolutie " +"tijdsstempel" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Impliciete regel voor '%s' gevonden.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Geen impliciete regel voor '%s' gevonden.\n" + +#: remake.c:502 +#, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Standaardrecept wordt gebruikt voor '%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Circulaire afhankelijkheid %s <- %s is verworpen." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Vereisten van doelbestand '%s' zijn voltooid.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "De vereisten van '%s' worden nu gemaakt.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Pogingen voor doelbestand '%s' worden gestaakt.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Doel '%s' is niet opnieuw gemaakt vanwege fouten." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Vereiste '%s' is alleen-ordenen voor doel '%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Vereiste '%s' van doel '%s' bestaat niet.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Vereiste '%s' is nieuwer dan doel '%s'.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Vereiste '%s' is ouder dan doel '%s'.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Doel '%s' is dubbeldubbelpunts en heeft geen vereisten.\n" + +#: remake.c:765 +#, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Er is geen recept voor '%s' en geen van de vereisten zijn veranderd.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Maken van '%s' vanwege 'always-make'-vlag.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Doel '%s' hoeft niet opnieuw gemaakt te worden" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; VPATH-naam '%s' wordt gebruikt" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "'%s' moet opnieuw gemaakt worden.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " VPATH-naam '%s' wordt genegeerd.\n" + +#: remake.c:815 +#, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Recept van '%s' wordt nu uitgevoerd.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Opnieuw maken van doelbestand '%s' is mislukt.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Doelbestand '%s' is succesvol opnieuw gemaakt.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Doelbestand '%s' moet opnieuw worden gemaakt onder -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Standaardopdrachten worden gebruikt voor '%s'.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Waarschuwing: bestand '%s' heeft een wijzigingstijd in de toekomst" + +#: remake.c:1370 +#, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "" +"Waarschuwing: bestand '%s' heeft een wijzigingstijd %s seconden in de " +"toekomst" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNS-element '%s' is geen patroon" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs kan niet exporteren: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Impliciete regels" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Geen impliciete regels." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u impliciete regels, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminal." + +#: rule.c:534 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "PROGRAMMAFOUT: num_pattern_rules is verkeerd! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "onbekend signaal" + +#: signame.c:94 +msgid "Hangup" +msgstr "Opgehangen" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Onderbroken" + +#: signame.c:100 +msgid "Quit" +msgstr "Afgesloten" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Onjuiste bewerking" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Traceer/breekpunt-instructie" + +#: signame.c:111 +msgid "Aborted" +msgstr "Afgebroken" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT-instructie" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT-instructie" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Drijvendekomma-berekeningsfout" + +#: signame.c:123 +msgid "Killed" +msgstr "Geëlimineerd" + +#: signame.c:126 +msgid "Bus error" +msgstr "Busfout" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Segmentatiefout" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Onjuiste systeemaanroep" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Gebroken pijp" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Wekker" + +#: signame.c:141 +msgid "Terminated" +msgstr "Beëindigd" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Gebruikergedefinieerd signaal 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Gebruikergedefinieerd signaal 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Dochter is afgesloten" + +#: signame.c:158 +msgid "Power failure" +msgstr "Stroomstoring" + +#: signame.c:161 +msgid "Stopped" +msgstr "Gepauzeerd" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Gepauzeerd (terminalinvoer)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Gepauzeerd (terminaluitvoer)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Gepauzeerd (signaal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Limiet op processortijd is overschreden" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Limiet op bestandsgrootte is overschreden" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Virtuele tijdopnemer is verlopen" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Tijdopnemer voor analyse is verlopen" + +#: signame.c:188 +msgid "Window changed" +msgstr "Venster is veranderd" + +#: signame.c:191 +msgid "Continued" +msgstr "Doorgegaan" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Urgente in-/uitvoertoestand" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "In-/uitvoer is mogelijk" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Hulpbron verloren" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Gevaarsignaal" + +#: signame.c:219 +msgid "Information request" +msgstr "Verzoek om informatie" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Drijvendekomma-coprocessor is niet beschikbaar" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s Aantal tekenreeksen in strcache: %d / lookups = %lu / treffers = %lu\n" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s Aantal strcache-buffers: %d (* %d bytes/buffer = %d bytes)\n" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s Gebruikte strcache: totaal = %d (%d) / max = %d / min = %d / gemiddeld = %" +"d\n" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s Vrije strcache: totaal = %d (%d) / max = %d / min = %d / gemiddeld = %d\n" + +#: strcache.c:244 +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# strcache-hashtabel-statistieken:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "standaard" + +#: variable.c:1544 +msgid "environment" +msgstr "omgeving" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "omgeving onder -e" + +#: variable.c:1553 +msgid "command line" +msgstr "opdrachtregel" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "'override'-opdracht" + +#: variable.c:1559 +msgid "automatic" +msgstr "automatisch" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (van '%s', regel %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# Statistieken van hashtabel van variabelenverzameling:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabelen\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Patroonspecifieke variabelewaarden" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Geen patroonspecifieke variabelewaarden" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u patroonspecifieke variabelewaarden" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "Waarschuwing: ongedefinieerde variabele '%.*s'" + +#: vmsfunctions.c:92 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() is mislukt met afsluitwaarde %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Waarschuwing: lege omleiding\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "*interne fout*: '%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-waarschuwing: mogelijk dient u CTRL-Y-afhandeling opnieuw aan te zetten " +"vanuit DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "INGEBOUWD [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "INGEBOUWDE CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "INGEBOUWDE RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Onbekende ingebouwde opdracht '%s'\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Fout: lege opdracht\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Invoer wordt omgeleid van %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Foutuitvoer wordt omgeleid naar %s\n" + +#: vmsjobs.c:523 +#, c-format +msgid "Append output to %s\n" +msgstr "Uitvoer wordt toegevoegd aan %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Uitvoer wordt omgeleid naar %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Toevoegen van %.*s en opschoning\n" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "In plaats daarvan wordt %s uitgevoerd\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Fout bij proces-start, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-zoekpaden\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Geen 'vpath'-zoekpaden." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u 'vpath'-zoekpaden.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Geen algemeen zoekpad ('VPATH'-variabele)." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Algemeen zoekpad ('VPATH'-variabele):\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() kan geen proces starten (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sDit is vrije programmatuur; zie de brontekst voor de " +#~ "kopieervoorwaarden.\n" +#~ "%sEr is GEEN garantie; zelfs niet voor VERHANDELBAARHEID of\n" +#~ "%sGESCHIKTHEID VOOR EEN BEPAALD DOEL.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "extra 'endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "lege 'override'-opdracht" + +#~ msgid "invalid `override' directive" +#~ msgstr "ongeldige 'override'-opdracht" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-waarschuwing: CTRL-Y zal subproces(sen) achterlaten.\n" diff --git a/po/pl.gmo b/po/pl.gmo new file mode 100644 index 0000000..a054031 Binary files /dev/null and b/po/pl.gmo differ diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..e81ac11 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,2029 @@ +# Polish translation for GNU make. +# Copyright (C) 1996, 2002, 2005, 2006, 2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Pawe³ Krawczyk , 1996. +# Jakub Bogusz , 2002-2010. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81.91\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2010-07-25 22:15+0200\n" +"Last-Translator: Jakub Bogusz \n" +"Language-Team: Polish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-2\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "próba u¿ycia nieistniej±cej funkcji: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "element biblioteki `touch' jest niedostêpny pod VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: Archiwum `%s' nie istnieje" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: `%s' nie jest poprawnym archiwum" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: Brak elementu `%s' w `%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: B³êdny kod powrotu z ar_member_touch w `%s'" + +#: arscan.c:69 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"Uzyskanie informacji o module przez lnr$set_module() nie uda³o siê, status = " +"%d" + +#: arscan.c:175 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control() nie powiod³o siê, status = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "b³±d otwarcia biblioteki `%s' podczas szukania elementu `%s'" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Element `%s'%s: %ld bajtów pod %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (nazwa mo¿e zostaæ okrojona)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Przerwano.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Element archiwum `%s' mo¿e byæ fa³szywy; nie usuniêty" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Element archiwum `%s' mo¿e byæ fa³szywy; nie usuniêty" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Kasujê plik `%s'" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Kasujê plik `%s'" + +#: commands.c:676 +msgid "# recipe to execute" +msgstr "# polecenia do wykonania" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (wbudowane):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (z `%s', linia %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Katalogi\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: stat() zwraca b³±d.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (klucz %s, czas modyfikacji %d): otwarcie by³o niemo¿liwe.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (urz±dzenie %d, i-wêze³ [%d,%d,%d]): otwarcie by³o niemo¿liwe.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (urz±dzenie %ld, i-wêze³ %ld): otwarcie by³o niemo¿liwe.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (klucz %s, czas modyfikacji %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (urz±dzenie %d, i-wêze³ [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (urz±dzenie %ld, i-wêze³ %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Nie" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " pliki, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "nie" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " niemo¿liwo¶ci" + +#: dir.c:1075 +msgid " so far." +msgstr " jak dot±d." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " niemo¿liwo¶ci w %lu katalogach.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Rekurencyjna zmienna `%s' wskazuje na sam± siebie" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "niezakoñczone odwo³anie do zmiennej" + +#: file.c:267 +#, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Polecenia dla pliku `%s' podano w %s:%lu," + +#: file.c:272 +#, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" +"Polecenia dla pliku `%s' zosta³y wyznaczone na podstawie regu³ standardowych," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "ale `%s' jest teraz uznawany za ten sam plik co `%s'." + +#: file.c:278 +#, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "Polecenia dla `%s' zosta³y zignorowane na rzecz poleceñ dla `%s'." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" +"nie mo¿na przemianowaæ `%s' z pojedynczym dwukropkiem na `%s' z podwójnym" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" +"nie mo¿na przemianowaæ `%s' z podwójnym dwukropkiem na `%s' z pojedynczym" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Kasowanie pliku po¶redniego `%s'" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Kasowanie plików po¶rednich...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Oznaczenie czasu spoza zakresu; zast±piono %s" + +#: file.c:804 +msgid "Current time" +msgstr "Aktualny czas" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# To nie jest obiekt:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Cenny plik (zale¿no¶æ .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Obiekt niejawny (zale¿no¶æ .PHONY)." + +#: file.c:933 +msgid "# Command line target." +msgstr "# Obiekt podany w linii poleceñ." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Makefile domy¶lny, wymieniony w MAKEFILES lub -include/sinclude." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Szukanie regu³ domy¶lnych zosta³o wykonane." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Szukanie regu³ domy¶lnych nie zosta³o wykonane." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Ga³±¼ wzorców domy¶lnych/statycznych: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Plik jest zale¿no¶ci± przej¶ciow±." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Robi równie¿:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Czas modyfikacji nie by³ sprawdzany." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Plik nie istnieje." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Plik jest bardzo stary." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Ostatnio modyfikowany %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Plik zosta³ uaktualniony." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Plik nie zosta³ uaktualniony." + +#: file.c:968 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Aktualnie uruchamiane polecenia (TO JEST B£¡D)." + +#: file.c:971 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Aktualnie uruchamiane polecenia zale¿no¶ci (TO JEST B£¡D)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Uaktualnienie powiod³o siê." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Powinien byæ uaktualniony (-q jest w³±czone)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Uaktualnianie nie powiod³o siê." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# B³êdna warto¶æ w elemencie `update_status'!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# B³êdna warto¶æ w elemencie `command_state'!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Pliki" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statystyki tablic haszuj±cych plików:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "pierwszy argument funkcji `word' nie jest numeryczny" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "pierwszy argument funkcji `word' musi byæ wiêkszy od 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "pierwszy argument funkcji `wordlist' nie jest numeryczny" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "drugi argument funkcji `wordlist' nie jest numeryczny" + +#: function.c:1458 +#, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(In) nie powiod³o siê (e=%ld)\n" + +#: function.c:1469 +#, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "windows32_open_pipe(): DuplicateHandle(Err) nie powiod³o siê (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() nie powiod³o siê (e=%ld)\n" + +#: function.c:1479 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() nie powiod³o siê\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Czyszczê tymczasowy plik wsadowy %s\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "niewystarczaj±ca liczba argumentów (%d) dla funkcji `%s'" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "funkcja `%s' nie jest zaimplementowana na tej platformie" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "nie dokoñczone wywo³anie funkcji `%s': brak `%c'" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opcja `%s' jest niejednoznaczna\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: opcja `--%s' nie przyjmuje argumentów\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: opcja `%c%s' nie przyjmuje argumentów\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: opcja `%s' wymaga argumentu\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: nierozpoznana opcja `--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: nierozpoznan opcja `%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: niedozwolona opcja -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: b³êdna opcja -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opcja wymaga argumentu -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opcja `-W %s' jest niejednoznaczna\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: opcja `-W %s' nie przyjmuje argumentów\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" +"nie mo¿na przydzieliæ %lu bajtów na tablicê haszuj±c±: pamiêæ wyczerpana" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Wype³nienie=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Przehaszowania=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Kolizje=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Szukanie standardowej regu³y dla `%s'.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Szukanie standardowej regu³y typu archive-member dla `%s'.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Pomijanie rekurencyjnego wywo³ania regu³y standardowej.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Próbowanie regu³y wzorcowej z ga³êzi± `%.*s'.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Odrzucenie niemo¿liwej zale¿no¶ci regu³y `%s'.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Odrzucenie niemo¿liwej zale¿no¶ci domy¶lnej `%s'.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Próbowanie zale¿no¶ci regu³y `%s'.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Próbowanie zale¿no¶ci domy¶lnej `%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Znaleziono zale¿no¶æ `%s' jako VPATH `%s'\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Szukanie regu³y zawieraj±cej plik przej¶ciowy `%s'.\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Nie mo¿na utworzyæ pliku tymczasowego\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] B³±d 0x%x (zignorowany)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] B³±d 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] B³±d %d (zignorowany)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] B³±d %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (zrzut pamiêci)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Oczekiwanie na niezakoñczone zadania...." + +#: job.c:579 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "¯yj±cy potomek %p (%s) PID %s %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (zdalne)" + +#: job.c:758 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Zbieranie przegrywaj±cego potomka %p PID %s %s\n" + +#: job.c:759 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Zbieranie wygrywaj±cego potomka %p PID %s %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Czyszczenie tymczasowego pliku wsadowego %s\n" + +#: job.c:861 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Usuwanie potomka %p PID %s%s z kolejki.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "pisz±cy serwer zadañ" + +#: job.c:922 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Zwolniony token dla potomka %p (%s).\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() nie móg³ uruchomiæ procesu (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Naliczono %d parametrów nieudanego uruchomienia\n" + +#: job.c:1525 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Wstawianie potomka %p (%s) PID %s%s do kolejki.\n" + +#: job.c:1778 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Otrzymano token dla potomka %p (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "strumieñ czytaj±cy zadania" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "Wykonywanie poleceñ z %s:%lu dla uaktualnienia obiektu `%s'.\n" + +#: job.c:1802 +#, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Wykonywanie wbudowanych poleceñ dla uaktualnienia obiektu `%s'.\n" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "niemo¿liwe wymuszenie limitów obci±¿enia w tym systemie" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "niemo¿liwe wymuszenie limitu obci±¿enia: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "nie ma wiêcej uchwytów plików: nie mo¿na powieliæ stdin\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "nie ma wiêcej uchwytów plików: nie mo¿na powieliæ stdout\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Nie mo¿na odtworzyæ stdin\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Nie mo¿na odtworzyæ stdout\n" + +#: job.c:2127 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make usun±³ potomka pid %s, nadal czeka na pid %s\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Polecenie nie znalezione" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Nie znaleziono programu pow³oki" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: mog³o zabrakn±æ miejsca na ¶rodowisko" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL siê zmieni³ (by³ `%s', jest `%s')\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Tworzenie tymczasowego pliku wsadowego %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Zawarto¶æ pliku wsadowego:%s\n" +"\t%s\n" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (linia %d) Z³y kontekst pow³oki (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Opcje:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorowane dla kompatybilno¶ci.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Bezwarunkowe utworzenie wszystkich obiektów.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C KATALOG, --directory=KATALOG\n" +" Przej¶cie do KATALOGu przed robieniem\n" +" czegokolwiek.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Wy¶wietla du¿o informacji diagnostycznych.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGI] Wy¶wietla ró¿ne rodzaje informacji\n" +" diagnostycznych.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Zmienne ¶rodowiska przykrywaj± makefile.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=£AÑCUCH Wyznacza £AÑCUCH jako instrukcjê pliku " +"makefile.\n" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f PLIK, --file=PLIK, --makefile=PLIK\n" +" Czyta PLIK jako makefile.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr "" +" -h, --help Wy¶wietla ten komunikat i koñczy dzia³anie.\n" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignoruje b³êdy poleceñ.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I KATALOG, --include-dir=KATALOG\n" +" Szuka do³±czanych makefile w KATALOGu.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Dopuszcza N zadañ naraz; brak N oznacza brak\n" +" ograniczeñ.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Kontynuuj je¶li nie da siê zrobiæ jakich¶\n" +" obiektów.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Nie uruchamiaj wielu zadañ je¶li load nie " +"jest\n" +" poni¿ej N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times U¿ywanie ostatniego mtime miêdzy dowi±zaniem a " +"celem.\n" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Nie wykonuje poleceñ; jedynie je wy¶wietla.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o PLIK, --old-file=PLIK, --assume-old=PLIK\n" +" Uznanie PLIKu za bardzo stary i nie tworzenie " +"go\n" +" ponownie.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Wy¶wietla wewnêtrzn± bazê danych make.\n" + +#: main.c:347 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Nie uruchamia ¿adnych poleceñ; status powrotu\n" +" wskazuje aktualno¶æ.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules Wy³±cza wbudowane regu³y standardowe.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Wy³±cza ustawianie wbudowanych zmiennych.\n" + +#: main.c:353 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Nie wypisuje poleceñ.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Wy³±cza -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch Uaktualnia obiekty zamiast je robiæ.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Wy¶wietla wersjê make i koñczy dzia³anie.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Wy¶wietla aktualny katalog.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Wy³±cza -w, nawet je¶li by³o ono w³±czone\n" +" domy¶lnie.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W PLIK, --what-if=PLIK, --new-file=PLIK, --assume-new=PLIK\n" +" Uznaje PLIK za nieskoñczenie nowy.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Ostrzega przy odwo³aniach do " +"niezdefiniowanych\n" +" zmiennych.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "pusty ³añcuch nie mo¿e byæ nazw± pliku" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "nieznany poziom diagnostyki `%s'" + +#: main.c:690 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: z³apano przerwanie/wyj±tek (kod = 0x%lx, adres = 0x%p)\n" + +#: main.c:697 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Nieobs³ugiwany filtr wyj±tku wywo³any z programu %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" + +#: main.c:705 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Naruszenie praw dostêpu: zapis pod adresem 0x%p\n" + +#: main.c:706 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Naruszenie praw dostêpu: odczyt spod adresu 0x%p\n" + +#: main.c:781 main.c:792 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() ustawia default_shell = %s\n" + +#: main.c:834 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell() ustawia ¶cie¿kê wyszukiwania default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s jest zawieszony na 30 sekund..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "zakoñczono sleep(30). Kontynuacja.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile ze standardowego wej¶cia podano dwukrotnie." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (plik tymczasowy)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (plik tymczasowy)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Równoleg³e zadania (-j) nie s± obs³ugiwane na tej platformie" + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Prze³±czanie w tryb jednozadaniowy (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "b³±d wewnêtrzny: wiele opcji --jobserver-fds" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "b³±d wewnêtrzny: b³êdny ³añcuch --jobserver-fds `%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Klient serwera zadañ (fds %d,%d)\n" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "uwaga: -jN wymuszone w podzadaniu: wy³±czanie trybu serwera zadañ." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "duplikacja serwera zadañ" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"uwaga: serwer zadañ niedostêpny: u¿ywanie -j1. Nale¿y dodaæ `+' do " +"nadrzêdnej regu³y make." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "tworzenie potoku zadañ" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "inicjowanie potoku serwera zadañ" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "Dowi±zania symboliczne nie s± obs³ugiwane: wy³±czono -L." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Uaktualnianie plików makefile....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Makefile `%s' mo¿e siê zapêtliæ; nie przetwarzam go.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Nie uda³o siê zrobiæ makefile `%s'." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Nie znaleziono w³±czanych makefile `%s'." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Nie znaleziono makefile `%s'" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Niemo¿liwy powrót do katalogu startowego." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Ponowne uruchamianie[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (plik tymczasowy): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL zawiera wiêcej ni¿ jeden cel" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Nie podano obiektów i nie znaleziono makefile" + +#: main.c:2272 +msgid "No targets" +msgstr "Brak obiektów" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Uaktualnianie obiektów docelowych....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "uwaga: Wykryto przestawienie zegara. Budowanie mo¿e byæ niekompletne." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Sk³adnia: %s [opcje] [obiekt] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Ten program zosta³ zbudowany dla %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Ten program zosta³ zbudowany dla %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "B³êdy proszê zg³aszaæ na adres \n" + +#: main.c:2562 +#, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "opcja `%s%s' wymaga niepustego ³añcucha jako argumentu" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "opcja `-%c' wymaga argumentu ca³kowitego dodatniego" + +#: main.c:3054 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sTen program zosta³ zbudowany dla systemu %s\n" + +#: main.c:3056 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sTen program zosta³ zbudowany dla systemu %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" +"%sLicencja GPLv3+: GNU GPL wersja 3 lub nowsza \n" +"%sTo oprogramowanie jest wolnodostêpne: mo¿na je swobodnie zmieniaæ i " +"rozpowszechniaæ.\n" +"%sNie ma ¯ADNEJ GWARANCJI w zakresie dopuszczalnym przez prawo.\n" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Baza danych Make, wy¶wietlana na %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Zakoñczono tworzenie bazy danych Make na %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Wej¶cie do nieznanego katalogu\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Opuszczenie nieznanego katalogu\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Wej¶cie do katalogu `%s'\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Opuszczenie katalogu `%s'\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Wej¶cie do nieznanego katalogu\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Opuszczenie nieznanego katalogu\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Wej¶cie do katalogu `%s'\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Opuszczenie katalogu `%s'\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Stop.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Nieznany b³±d %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "brak pamiêci wirtualnej" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: u¿ytkownik %lu (rzeczywisty %lu), grupa %lu (rzeczywista %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Zainicjalizowany dostêp" + +#: misc.c:808 +msgid "User access" +msgstr "Dostêp u¿ytkownika" + +#: misc.c:856 +msgid "Make access" +msgstr "Dostêp make" + +#: misc.c:890 +msgid "Child access" +msgstr "Dostêp potomka" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "b³±d zapisu: %s" + +#: misc.c:956 +msgid "write error" +msgstr "b³±d zapisu" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Czytanie makefile...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Czytanie makefile `%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (brak celu domy¶lnego)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (przeszukiwana ¶cie¿ka)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (niewa¿ne)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (brak rozszerzenia ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "b³êdna sk³adnia wyra¿enia warunkowego" + +#: read.c:891 +msgid "recipe commences before first target" +msgstr "polecenia zaczynaj± siê przed pierwszym obiektem" + +#: read.c:940 +msgid "missing rule before recipe" +msgstr "brakuje regu³y przed poleceniami" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "brakuj±cy separator%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (czy¿by mia³ byæ TAB zamiast 8 spacji?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "brakuj±cy wzorzec obiektu" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "wielokrotne wzorce obiektu" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "wzorzec obiektu nie zawiera `%%'" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "brakuj±cy `endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "pusta nazwa zmiennej" + +#: read.c:1367 +msgid "extraneous text after `define' directive" +msgstr "nadmiarowy tekst po dyrektywie `define'" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "brakuj±cy `endef', niezakoñczone `define'" + +#: read.c:1420 +msgid "extraneous text after `endef' directive" +msgstr "nadmiarowy tekst po dyrektywie `endef'" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Niezwi±zany tekst po dyrektywie `%s'" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "niezwi±zany `%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "tylko jedno `else' w wyra¿eniu warunkowym" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "¬le sformu³owana definicja zmiennej dla celu" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "wymagania nie mog± byæ definiowane w opisach poleceñ" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "pomieszane standardowe i statyczne regu³y wzorców" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "pomieszane standardowe i normalne regu³y" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "obiekt `%s' nie pasuje do wzorca obiektu" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "plik obiektowy `%s' ma pozycje i : i ::" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "obiekt `%s' wyspecyfikowany wielokrotnie w tej samej regule" + +#: read.c:2006 +#, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "uwaga: polecenia zakrywaj±ce dla obiektu `%s'" + +#: read.c:2009 +#, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "uwaga: ignorujê stare polecenia dla obiektu `%s'" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "uwaga: napotka³em na znak NUL; reszta linii zignorowana" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Nie ma nic do zrobienia w `%s'." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s' jest aktualne." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Czyszczenie pliku `%s'.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sBrak regu³ do wykonania obiektu `%s'%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sBrak regu³ do zrobienia obiektu `%s', wymaganego przez `%s'%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Przetwarzanie pliku obiektowego `%s'.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Ju¿ bez powodzenia próbowa³em uaktualniæ plik `%s'.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Plik `%s' by³ ju¿ przetwarzany.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Wci±¿ uaktualniam plik `%s'.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Skoñczy³em uaktualniaæ plik `%s'.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Plik `%s' nie istnieje.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Uwaga: plik .LOW_RESOLUTION_TIME `%s' ma du¿± rozdzielczo¶æ znacznika " +"czasu" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Znaleziono standardow± regu³ê dla `%s'.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Brak standardowych regu³ dla `%s'.\n" + +#: remake.c:502 +#, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Stosowanie standardowych poleceñ dla `%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Okrê¿na dyrektywa %s <- %s porzucona." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Zakoñczono zale¿no¶ci pliku obiektu `%s'.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Zale¿no¶ci `%s' s± wykonywane.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Zaniechany plik obiektowy `%s'.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Obiekt `%s' nie zosta³ wykonany z powodu b³êdów." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Zale¿no¶æ `%s' dotyczy tylko kolejno¶ci dla obiektu `%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Zale¿no¶æ `%s' obiektu `%s' nie istnieje.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Zale¿no¶æ `%s' jest nowsza od obiektu `%s'.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Zale¿no¶æ `%s' jest starsza od obiektu `%s'.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Obiekt `%s' jest typu double-colon i nie ma ¿adnych zale¿no¶ci.\n" + +#: remake.c:765 +#, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Brak poleceñ dla `%s' i brak zmienionych zale¿no¶ci.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Tworzenie `%s' z powodu flagi always-make.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Nie ma potrzeby przerabiaæ obiektu `%s'" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; u¿yto nazwy VPATH `%s'" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Konieczne przerobienie obiektu `%s'.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Zignorowano nazwê VPATH `%s'.\n" + +#: remake.c:815 +#, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Uruchomiono polecenia dla `%s'.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Przerabianie pliku obiektowego `%s' nie powiod³o siê.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Przerabianie pliku obiektowego `%s' powiod³o siê.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Plik obiektowy `%s' powinien byæ przerobiony z opcj± -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Stosowanie standardowych poleceñ dla `%s'.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Uwaga: Plik `%s' ma czas modyfikacji z przysz³o¶ci" + +#: remake.c:1370 +#, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Uwaga: Plik `%s' ma czas modyfikacji %s s w przysz³o¶ci" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "element .LIBPATTERNS `%s' nie jest wzorcem" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Zasady nie eksportowane: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Regu³y stadardowe" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Brak standardowych regu³." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u standardowych regu³, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminal." + +#: rule.c:534 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "B£¡D: z³e num_pattern_rules! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "nieznany sygna³" + +#: signame.c:94 +msgid "Hangup" +msgstr "Roz³±czenie" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Przerwanie" + +#: signame.c:100 +msgid "Quit" +msgstr "Wyj¶cie" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "B³êdna instrukcja" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Pu³apka ¶ledzenia" + +#: signame.c:111 +msgid "Aborted" +msgstr "Przerwany" + +#: signame.c:114 +msgid "IOT trap" +msgstr "Pu³apka IOT" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Pu³apka EMT" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Wyj±tek zmiennoprzecinkowy" + +#: signame.c:123 +msgid "Killed" +msgstr "Zabity" + +#: signame.c:126 +msgid "Bus error" +msgstr "B³±d szyny" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Naruszenie ochrony pamiêci" + +#: signame.c:132 +msgid "Bad system call" +msgstr "B³êdne wywo³anie systemowe" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Przerwany potok" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Budzik" + +#: signame.c:141 +msgid "Terminated" +msgstr "Zakoñczony" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Sygna³ u¿ytkownika 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Sygna³ u¿ytkownika 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Potomek powróci³" + +#: signame.c:158 +msgid "Power failure" +msgstr "Przerwa w zasilaniu" + +#: signame.c:161 +msgid "Stopped" +msgstr "Zatrzymany" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Zatrzymany (wej¶cie z tty)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Zatrzymany (wyj¶cie na tty)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Zatrzymany (sygna³)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Przekroczony czas CPU" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Przekroczony limit wielko¶ci pliku" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Wyczerpany stoper wirtualny" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Wyczerpany stoper profiluj±cy" + +#: signame.c:188 +msgid "Window changed" +msgstr "Zmienione okno" + +#: signame.c:191 +msgid "Continued" +msgstr "Kontynuowany" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Nag³a sytuacja I/O" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O mo¿liwe" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Zaginione zasoby" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Sygna³ niebezpieczeñstwa" + +#: signame.c:219 +msgid "Information request" +msgstr "¯±danie informacji" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Koprocesor obliczeñ zmiennoprzecinkowych niedostêpny" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s liczba ³añcuchów w strcache: %d / wyszukiwañ = %lu / trafieñ = %lu\n" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s liczba buforów strcache: %d (* %d B/bufor = %d B)\n" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s rozmiar strcache: ca³kowity = %d (%d) / maks = %d / min = %d / ¶r = %d\n" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s wolne strcache: ca³kowite = %d (%d) / maks = %d / min = %d / ¶r = %d\n" + +#: strcache.c:244 +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statystyki tablic haszuj±cych strcache:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "domy¶lna" + +#: variable.c:1544 +msgid "environment" +msgstr "¶rodowiskowa" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "¶rodowisko pod -e" + +#: variable.c:1553 +msgid "command line" +msgstr "z linii poleceñ" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "dyrektywa `override'" + +#: variable.c:1559 +msgid "automatic" +msgstr "automatyczna" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (z `%s', linia %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# statystyki tablic haszuj±cych ustawionych zmiennych:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Zmienne\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Warto¶ci zmiennych dla wzorca" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Brak warto¶ci zmiennych dla wzorca." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u warto¶ci zmiennych dla wzorca" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "uwaga: niezdefiniowana zmienna `%.*s'" + +#: vmsfunctions.c:92 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() nie powiod³o siê - %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Uwaga: Puste przekierowanie\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "b³±d wewnêtrzny: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-uwaga, bêdzie trzeba ponownie umo¿liwiæ obs³ugê CTRL-Y z DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "WBUDOWANE [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "WBUDOWANE CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "WBUDOWANE RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Nieznane polecenie wbudowane '%s'\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "B³±d, puste polecenie\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Przekierowane wej¶cie z %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Przekierowane wyj¶cie diagnostyczne do %s\n" + +#: vmsjobs.c:523 +#, c-format +msgid "Append output to %s\n" +msgstr "Do³±czanie wyj¶cia do %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Przekierowane wyj¶cie do %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Do³±czanie %.*s i czyszczenie\n" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Zamiast tego wykonywanie %s\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "B³±d podczas uruchamiania, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# ¦cie¿ki przeszukiwania VPATH\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Brak ¶cie¿ek przeszukiwania `vpath'" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u ¶cie¿ek przeszukiwania `vpath'.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Brak ogólnej (zmienna `VPATH') ¶cie¿ki przeszukiwania." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Ogólna (zmienna `VPATH') ¶cie¿ka przeszukiwania:\n" +"# " diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo new file mode 100644 index 0000000..28ced11 Binary files /dev/null and b/po/pt_BR.gmo differ diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..e734c06 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,2074 @@ +# translation of make-3.80.po to portugues +# Mensagem do GNU make em Português (Brasil) +# Copyright (C) 2000, 2008 Free Software Foundation, Inc. +# +# Caso você encontre alguma mensagem que não está bem traduzida, por +# favor me informe dando sua sugestão. +# +# Fábio Henrique F. Silva , 2000. +# Fábio Henrique F. Silva , 2008. +msgid "" +msgstr "" +"Project-Id-Version: make-3.80\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2008-01-22 00:45-0200\n" +"Last-Translator: Fábio Henrique F. Silva \n" +"Language-Team: Brazilian Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "característica não suportada: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "o touch não está disponível no VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: Arquivo `%s' não existe" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: `%s' não é um arquivo válido" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: O membro `%s' não existe em `%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: O ar_member_touch retornou um código de erro inválido em `%s'" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "o lbr$set_module falhou ao obter informações do módulo, estado = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control falhou com estado = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "erro na abertura da biblioteca `%s' para localizar o membro `%s'" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Membro `%s'%s: %ld bytes de %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (o nome pode estar truncado)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Data %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, modo = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Quebra.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] O arquivo membro `%s' pode ser falso. Não foi apagado" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** O arquivo membro `%s' pode ser falso. Não foi apagado" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "** [%s] Apagando o arquivo `%s'" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "** Apagando o arquivo `%s'" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# comandos para executar" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (embutido):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (de `%s', linha %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Diretórios\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: não pôde ser estabelecido.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (chave %s, mtime %d): não pôde ser aberto.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): não pôde ser aberto.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (dispositivo %ld, inode %ld): não pôde ser aberto.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (chave %s, mtime %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (dispositivo %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Não" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " arquivos, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "não" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " impossibilidades" + +#: dir.c:1075 +msgid " so far." +msgstr " até agora." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " impossibilidades em %lu diretórios.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Variável recursiva `%s' faz referência a ela mesma (eventualmente)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "referência a uma variável não finalizada" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Comandos especificados para o arquivo `%s' em %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "Comandos para o arquivo `%s' encontrados por regra implícita," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "mas `%s' é considerado o mesmo arquivo que `%s'." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "Comandos para `%s' serão ignorados em favor daqueles para `%s'." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "não pôde renomear de dois-pontos `%s' para dois-pontos duplos `%s'" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "não pôde renomear de dois-pontos duplos `%s' para dois-pontos `%s'" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "** Apagando o arquivo intermediário `%s'" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Apagando arquivo intermediário...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Data/Hora fora de faixa; substituindo %s" + +#: file.c:804 +msgid "Current time" +msgstr "Hora atual" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Não é um alvo:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Arquivo importante (pre-requisito de .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Alvo Falso (pre-requisito de .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Linha de Comando do Alvo." + +#: file.c:935 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Um Padrão ou arquivo MAKEFILES." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# A pesquisa por regra implícita foi concluida." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# A pesquisa por regra implícita não foi concluida." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Derivação padrão implícita/estática: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# O arquivo é um pré-requisito intermediário." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Também faz:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# O Período da modificação nunca foi verificado." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# O Arquivo não existe." + +#: file.c:956 +msgid "# File is very old." +msgstr "# O Arquivo está desatualizado." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Última modificação %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# O Arquivo foi atualizado." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# O Arquivo não foi atualizado." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Comandos em execução (ISTO É UMA FALHA)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Comandos de dependências em execução (ISTO É UMA FALHA)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Atualizado com sucesso." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Precisa ser atualizado (-q está definido)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Problemas com a atualização." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Valor inválido no membro `update_status' !" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Valor inválido no membro `command_state' !" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Arquivos" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tabela hash de arquivos:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "primeiro argumento não numérico para a função `word'" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "o primeiro argumento para a função `word' deve ser maior que 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "primeiro argumento não numérico para a função `wordlist'" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "segundo argumento não numérico para a função `wordlist'" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) falhou (e=%d)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) falhou (e=%d)\n" + +#: function.c:1474 +#, fuzzy, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() falhou (e=%d)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() falhou\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Apagando o arquivo de lote temporário %s\n" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "O número de argumentos é insuficiente (%d) para a função `%s'" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "A função `%s' não foi implementada nesta plataforma" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "Chamada não terminada para a função `%s': faltando `%c'" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: a opção `%s' é ambigua\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: a opção `--%s' não permite um argumento\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: a opção `%c%s' não permite um argumento\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: a opção `%s' requer um argumento\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: a opção é desconhecida `--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: a opção é desconhecida `%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: a opção é ilegal -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: a opção é inválida -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: a opção requer um argumento -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: a opção `-W %s' é ambigua\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: a opção `-W %s' não permite um argumento\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "não foi possível alocar %ld bytes para a tabela hash: memória cheia" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Carga=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Colisões=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Procurando por uma regra implícita para `%s'.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Procurando por uma regra implícita de arquivo-membro para `%s'.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Evitando recursão em regra implícita.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Tentando padrão para regra com `%.*s'.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Rejeitando o pré-requisito para regra `%s'.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Rejeitando os pré-requisitos implícitos `%s'.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Tentando o pré-requisito para a regra `%s'.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Tentando o pré-requisito implícito `%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "O pré-requisito `%s' foi encontrado como VPATH `%s'\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Procurando uma regra com o arquivo intermediário `%s'.\n" + +#: job.c:335 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (arquivo temporário)" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Erro 0x%x (ignorado)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Erro 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Erro %d (ignorado)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "** [%s] Erro %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (arquivo core criado)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Esperando que os outros processos terminem...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Filho ativo 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (remoto)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Descarregando processo filho 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Descarregando processo filho 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Apagando o arquivo de lote temporário: %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Removendo o processo filho 0x%08lx PID %ld%s da cadeia.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "gravar jobserver" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Liberado sinalizador para o processo filho 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, fuzzy, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() falhou ao executar o processo (e=%d)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Contados %d args na falha de execução\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Colocando o processo filho 0x%08lx (%s) PID %ld%s na cadeia.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Obtido o sinalizador para o processo filho 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "tarefas canalizadas lidas" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Não é necessário reprocessar o alvo `%s'" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "não pôde forçar os limites de carga neste sistema operacional" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "não pôde forçar a carga limite:" + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "processo filho descarregado: pid %d, aguardando pelo pid %d\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Comando não encontrado" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Interpretador de comandos não encontrado" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, fuzzy, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL alterado (era `%s' e agora é `%s')" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Criando arquivo de lote temporário %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (linha %d) contexto inválido (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Opções:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignorado para compatibilidade.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Processa todos os alvos incondicionalmente.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +"-C DIRETÓRIO, --directory= DIRETÓRIO\n" +" muda para o DIRETÓRIO antes de fazer algo.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Imprime muita informação de depuração.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=OPÇÕES] Imprime vários tipos de informações de " +"depuração.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e,--envrionment-overrides\n" +" As variáveis de ambiente sobrescrevem os " +"arquivos make.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f ARQUIVO, --file=ARQUIVO --makefile=ARQUIVO\n" +" Lê o ARQUIVO com um arquivo make.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Imprime esta mensagem e sai.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignora os erros dos comandos.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +".. -l DIRETÓRIO, --include-dir= DIRETÓRIO\n" +" Procura no DIRETÓRIO por arquivos make.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Permite N tarefas de uma vez ou várias sem o " +"argumento.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Continua mesmo que alguns alvos não possam ser " +"processados.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Não inicia múltiplas tarefas a menos que a " +"carga seja menor que N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Não executa quaisquer comandos; apenas imprime-" +"os.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o ARQUIVO, --old-file= ARQUIVO, --assume-old ARQUIVO\n" +" Considera o ARQUIVO muito velho e não o " +"refaz.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Imprime o banco de dados interno do make.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Executa sem comandos, o código de saída " +"informa se está atualizado.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Desabilita as regras implícitas embutidas.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Desabilita as configurações das variávies " +"embutidas.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Não ecoa os comandos.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Desativa a opção -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Executa um `touch' nos alvos ao invés de " +"reprocessá-los.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Imprime o número de versão do make e sai.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Imprime o diretório atual.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Desativa a opção -w, mesmo que tenha sido " +"ativada implicitamente.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W ARQUIVO, --what-if= ARQUIVO, --new-file=ARQUIVO, --assume-new=ARQUIVO\n" +" Considera o ARQUIVO muito novo.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Avisa quando um variável não definida for " +"referenciada.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "Cadeia de caracteres vazia não é válida como nome de arquivo" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "nível de depuração desconhecido: `%s'" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Interrupção/Exceção capturada (código = 0x%x, endereço = 0x%x)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Não pôde tratar o filtro de exceção chamado por %s\n" +"CódigoExceção = %x\n" +"SinalExceção = %x\n" +"EndereçoExceção = %x\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Violação de acesso: operação de escrita no endereço %x\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Violação de acesso: operação de leitura no endereço %x\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell definiu o default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell, caminho de pesquisa do default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s está suspenso por 30 segundos..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) concluido. Continuando.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile na entrada padrão especificado duas vezes." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (arquivo temporário)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (arquivo temporário)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Tarefas paralelas (-j) não são suportadas nesta plataforma." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Reiniciando no modo de tarefa única (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "erro interno: múltiplas opções --jobserver-fds" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "erro interno: valor `%s' inválido para --jobserver-fds" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "aviso: -jN forçado no submake: desabilitando o modo jobserver." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "dup jobserver" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "aviso: jobserver indisponível: usando -j1. Inclua `+' na regra pai." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "criando canalização de tarefas" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "inicializando a canalização do jobserver" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Atualizando os arquivos makefiles ...\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "O arquivo `%s' pode estar em loop; não reprocessá-lo.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Problemas ao reprocessar o arquivo `%s'." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "O arquivo `%s' incluído não foi encontrado." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "O arquivo `%s' não foi encontrado" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Não foi possível voltar ao diretório original." + +#: main.c:2102 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "Re-executando:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "desvinculado (arquivos temporário): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Nenhum alvo indicado e nenhum arquivo make encontrado" + +#: main.c:2272 +msgid "No targets" +msgstr "Sem alvo" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Atualizando os objetivos finais...\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "aviso: O relógio está errado. Sua compilação pode ficar incompleta." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Uso: %s [opções] [alvo] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Este programa foi compilado para %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Este programa foi compilado para %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Informe os problemas para .\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "a opção `-%c' requer um argumento inteiro positivo" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "a opção `-%c' requer um argumento inteiro positivo" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"Este programa foi compilado para %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"Este programa foi compilado para %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Banco de dados do Make, impresso em %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Banco de dados do Make finalizado em %s\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Entrando em um diretório desconhecido" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Saindo de um diretório desconhecido" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Entrando no diretório `%s'\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Saindo do diretório `%s'\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Entrando em um diretório desconhecido" + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Saindo de um diretório desconhecido" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Entrando no diretório `%s'\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Saindo do diretório `%s'\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Pare.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Erro desconhecido %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "A memória virtual encheu" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: usuário %lu (real %lu), grupo %lu (real %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Acesso inicializado" + +#: misc.c:808 +msgid "User access" +msgstr "Acesso do usuário" + +#: misc.c:856 +msgid "Make access" +msgstr "Acesso do make" + +#: misc.c:890 +msgid "Child access" +msgstr "Acesso filho" + +#: misc.c:954 +#, fuzzy, c-format +msgid "write error: %s" +msgstr "Erro redirecionado para %s\n" + +#: misc.c:956 +#, fuzzy +msgid "write error" +msgstr "gravar jobserver" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Lendo arquivos makefile ...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Lendo arquivos makefile `%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (não há objetivo padrão)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (caminho de pesquisa)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (sem importância)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (sem expansão ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "síntaxe inválida na condicional" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "comandos começam antes do primeiro alvo" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "falta regra antes dos comandos" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "faltando o separador%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (você pensou em TAB ao invés de 8 espaços?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "faltando o padrão dos alvos" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "múltiplos padrões para o alvo" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "padrão para o alvo não contém `%%'" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "faltando `endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "nome de variável vazio" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Texto estranho depois da diretiva `endef'" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "faltando `endef', `define' não terminado" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Texto estranho depois da diretiva `endef'" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Texto estranho depois da diretiva `%s'" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "`%s' estranho" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "use apenas um `else' por condicional" + +#: read.c:1797 +#, fuzzy +msgid "Malformed target-specific variable definition" +msgstr "Definição de variável por alvo mau formada" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "As regras implícitas e de padrão estático misturadas" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "As regras implícitas e normais misturadas" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "O alvo `%s' não coincide com o padrão" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "O arquivo alvo `%s' tem entradas : e ::" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "O alvo `%s' foi informado mais do que um vez na mesma regra." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "aviso: impondo comandos para o alvo `%s'" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "aviso: ignorando comandos antigos para o alvo `%s'" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "aviso: caractere NUL detectado; o resto da linha foi ignorado" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Nada a ser feito para `%s'." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s' está atualizado." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Atualizando o arquivo `%s'.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%s Sem regra para processar o alvo `%s'%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%s Sem regra para processar o alvo `%s', necessário por `%s'%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Considerando o arquivo alvo `%s'.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Tentativa de atualizar o arquivo `%s' falhou.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "O arquivo `%s' já foi considerado.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Ainda está atualizando o arquivo `%s'.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Atualização do arquivo `%s' concluída.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "O arquivo `%s' não existe.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Aviso: arquivo .LOW_RESOLUTION_TIME `%s' tem uma etiqueta de tempo de " +"alta resolução" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Regra implícita encontrada para `%s'.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Nenhuma regra implícita encontrada para `%s'.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Usando os comandos padrões para `%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Dependência circular %s <- %s abandonada." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Pré-requisitos do alvo `%s' concluído.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Pré-requisitos do `%s' estão sendo criados.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Desistindo do arquivo `%s'.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "O alvo `%s' não foi reprocessado por causa de erros." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Pré-requisito `%s' está ordenado para o alvo `%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Pré-requisitos `%s' do alvo `%s' não existem.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Pré-requisito `%s' é mais novo do que o alvo `%s'.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Pré-requisito `%s' é mais antigo do que o alvo `%s'.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "O alvo `%s' é dois-pontos duplos e não tem pré-requisitos.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Nenhum comando para `%s' e nenhum pré-requisito foi alterado.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Processando `%s' devido a opção always-make.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Não é necessário reprocessar o alvo `%s'" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; usando o nome VPATH `%s'" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "O alvo `%s' deve ser reprocessado.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Ignorando o nome VPATH `%s'.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Os comandos de `%s' estão rodando.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Falha ao reprocessar o alvo `%s'.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Alvo `%s' reprocessado com sucesso.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "O alvo `%s' precisa ser reprocessado sob -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Usando os comandos padrões para `%s'.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "** Aviso: O arquivo `%s' está com a hora adiantada" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "** Aviso: O arquivo `%s' está com a hora %.2g adiantada" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "O elemento .LIBPATTERNS `%s' não é um padrão" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customizações não exportadas: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Regras implícitas." + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Faltam as regras implícitas." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u regras implícitas, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminal." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ERRO: num_pattern_rules errada! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "sinal desconhecido" + +#: signame.c:94 +msgid "Hangup" +msgstr "Desconectar" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Interrupção" + +#: signame.c:100 +msgid "Quit" +msgstr "Sair" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Instrução ilegal" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Aviso Trace/breakpoint" + +#: signame.c:111 +msgid "Aborted" +msgstr "Abortado" + +#: signame.c:114 +msgid "IOT trap" +msgstr "Aviso IOT" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Aviso EMT" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Exceção de ponto flutuante" + +#: signame.c:123 +msgid "Killed" +msgstr "Finalizado" + +#: signame.c:126 +msgid "Bus error" +msgstr "Erro de barramento" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Falha de segmentação" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Chamada de sistema inválida" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Canalização interrompida" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Despertador" + +#: signame.c:141 +msgid "Terminated" +msgstr "Terminado" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Sinal 1 definido pelo usuário" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Sinal 2 definido pelo usuário" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "O Filho saiu" + +#: signame.c:158 +msgid "Power failure" +msgstr "Falha na Energia Elétrica" + +#: signame.c:161 +msgid "Stopped" +msgstr "Parado" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Parado (entrada tty)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Parado (saída tty)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Parado (sinal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Tempo de CPU excedido" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Tamanho do arquivo excedido" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Temporizador virtual expirou" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Temporizador de perfil expirou" + +#: signame.c:188 +msgid "Window changed" +msgstr "Janela alterada" + +#: signame.c:191 +msgid "Continued" +msgstr "Continuação" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Condição de E/S urgente" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "Possível E/S" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Recurso perdido" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Sinal perigoso" + +#: signame.c:219 +msgid "Information request" +msgstr "Solicitação de informação" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Co-processador aritmético indisponível" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# tabela hash de arquivos:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "padrão" + +#: variable.c:1544 +msgid "environment" +msgstr "ambiente" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "ambiente sob -e" + +#: variable.c:1553 +msgid "command line" +msgstr "linha de comando" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "diretiva `override'" + +#: variable.c:1559 +msgid "automatic" +msgstr "automático" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (de `%s', linha %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# tabela hash do conjunto de variávies:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variáveis\n" + +#: variable.c:1627 +#, fuzzy +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Valores da variável de padrões específicos" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Faltam valores para variável de padrões específicos" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u valores para variável de padrões específicos" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search falhou com %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Aviso: Redireção vazia\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "erro interno: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-warning, pode ser preciso reativar o CTRL-Y no DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "EMBUTIDO [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "CD EMBUTIDO %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "RM EMBUTIDO %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Comandos embutidos desconhecidos `%s'.\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Erro, comando vazio\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Entrada de %s redirecionada\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Erro redirecionado para %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Saída redirecionada para %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Saída redirecionada para %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Executando %s ao invés de\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Erro de execução, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Caminho VPATH\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Sem caminho `vpath'." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u caminhos `vpath'.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Sem caminho genérico (variável `VPATH')." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Caminho genérico (variável `VPATH'):\n" +"# " + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Erro de sintaxe dentro de '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Recebido um SIGSHLD; %u processos filhos descarregados.\n" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-warning, CTRL-Y sairá do(s) subprocesso(s).\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Não especifique -j ou --jobs se o sh.exe não estiver disponível." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Reiniciando o make para o modo de trabalho único." + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sEste é um programa livre; veja o fonte para as condições de cópia.\n" +#~ "%sNão há garantias; nem mesmo de COMERCIALIZAÇÃO OU ATENDIMENTO A UMA\n" +#~ "%sFUNÇÃO EM PARTICULAR.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "`endef' estranho" + +#~ msgid "empty `override' directive" +#~ msgstr "diretiva `override' vazia" + +#~ msgid "invalid `override' directive" +#~ msgstr "diretiva `override' inválida" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "sem nome de arquivo para `%sinclude'" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "O alvo `%s' deixou o pré-requisito padrão vazio" diff --git a/po/quot.sed b/po/quot.sed new file mode 100644 index 0000000..0122c46 --- /dev/null +++ b/po/quot.sed @@ -0,0 +1,6 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin new file mode 100644 index 0000000..2436c49 --- /dev/null +++ b/po/remove-potcdate.sin @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/ru.gmo b/po/ru.gmo new file mode 100644 index 0000000..d868841 Binary files /dev/null and b/po/ru.gmo differ diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..10c18bf --- /dev/null +++ b/po/ru.po @@ -0,0 +1,2070 @@ +# Translation of make messages to Russian +# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Alexey Mahotkin 2001 +# +# Oleg S. Tihonov , 1998. +# Denis Perchine , 2001, 2002. +# Yuri Kozlov , 2009, 2010. +# Pavel Maryanov , 2009. +msgid "" +msgstr "" +"Project-Id-Version: make 3.81.91\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2010-07-21 21:46+0400\n" +"Last-Translator: Yuri Kozlov \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.0\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "попытка использования неподдерживаемого средства: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "обновление времени изменения члена архива невозможно в системе VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "обновление времени изменения: Архив `%s' не существует" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "обновление времени изменения: Неверный архив: `%s'" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "обновление времени изменения: Элемент `%s' не содержится в `%s'" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "" +"обновление времени изменения: Функция ar_member_touch вернула\n" +"ошибочное значение для `%s'" + +#: arscan.c:69 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module() не смогла извлечь информацию о модуле, статус = %d" + +#: arscan.c:175 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$init_control() вернула код ошибки %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "Ошибка открытия библиотеки `%s' для поиска элемента `%s'" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Элемент `%s'%s: %ld байт по адресу %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (имя может быть усечено)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Дата %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, mode = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Останов.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Элемент архива `%s', кажется, недействителен; не удалён" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Элемент архива `%s', кажется, недействителен; не удалён" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Удаляется файл `%s'" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Удаляется файл `%s'" + +#: commands.c:676 +msgid "# recipe to execute" +msgstr "# способ, который следует применить" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (встроенные):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (из `%s', строка %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Каталоги\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: невозможно получить сведения вызовом stat.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (ключ %s, время модификации %d): невозможно открыть.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (устройство %d, inode [%d,%d,%d]): невозможно открыть.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (устройство %ld, inode %ld): невозможно открыть.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (ключ %s, время модификации %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (устройство %d, inode [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (устройство %ld, inode %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Нет" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " файлов," + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "нет" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " недостижимых целей" + +#: dir.c:1075 +msgid " so far." +msgstr " на текущий момент." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " недостижимых целей в %lu каталогах.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Рекурсивная переменная `%s' ссылается сама на себя (в результате)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "незавершённая ссылка на переменную" + +#: file.c:267 +#, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Способ для файла `%s' был задан в %s:%lu," + +#: file.c:272 +#, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "Способ для файла `%s' был найден из неявного правила," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "но `%s' и `%s' теперь считаются одним и тем же файлом. " + +#: file.c:278 +#, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "" +"Способ для `%s' игнорируется, вместо него будет использован способ для `%s'." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" +"невозможно переименовать `%s' с одним двоеточием в `%s' с двумя двоеточиями" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" +"невозможно переименовать `%s' с двумя двоеточиями в `%s' с одним двоеточием" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Удаление промежуточного файла `%s'" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Удаление промежуточных файлов...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Временной штамп выходит за пределы диапазона; подставляем %s" + +#: file.c:804 +msgid "Current time" +msgstr "Текущее время" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Не является целью:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Ценный файл (зависимость .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Псевдоцель (зависимость от .PHONY)." + +#: file.c:933 +msgid "# Command line target." +msgstr "# Цель, вызываемая из командной строки." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# По умолчанию, MAKEFILES, или -include/sinclude makefile." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Производился поиск неявных правил." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Поиск неявных правил не производился." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Основа неявного или статического образца: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Файл — промежуточная зависимость." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Собирает также:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Время изменения ни разу не проверялось." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Файл не существует." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Файл очень старый." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Время последнего изменения %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Файл был обновлён." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Файл не был обновлён." + +#: file.c:968 +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# В данный момент уже применяется некий способ (ЭТО ОШИБКА)." + +#: file.c:971 +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" +"# В данный момент уже применяется некий способ по зависимостям (ЭТО ОШИБКА)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Успешно обновлено." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Должно быть обновлено (задан ключ -q)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Попытка обновления безуспешна." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Неверное значение члена `update_status'!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Неверное значение члена `command_state'!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Файлы" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# состояние файлов хеш-таблицы:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "нечисловой первый аргумент функции `word'" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "первый аргумент функции `word' должен быть больше нуля" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "нечисловой первый аргумент функции `wordlist'" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "нечисловой второй аргумент функции `wordlist'" + +#: function.c:1458 +#, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "windows32_openpipe(): DuplicateHandle(In) вернула код ошибки (e=%ld)\n" + +#: function.c:1469 +#, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" +"windows32_open_pipe(): DuplicateHandle(Err) вернула код ошибки (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() вернула код ошибки (e=%ld)\n" + +#: function.c:1479 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe(): process_init_fd() завершилась неудачно\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Очищаю временный пакетный файл %s\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "недостаточно аргументов (всего %d) функции `%s'" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "не реализовано на этой платформе: функция `%s'" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "незавершённый вызов функции `%s': пропущено `%c'" + +# Сообщения getopt исключены, т.к. они относятся к уже +# устаревшей версии этой библиотеки, и исчезнут в следующей версии make +# +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: ключ `%s' не однозначен\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: ключ `--%s' не имеет аргумента\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: ключ `%c%s' не имеет аргумента\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: ключ `%s' требует аргумент\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: неизвестный ключ `--%s'\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: неизвестный ключ `%c%s'\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: недопустимый ключ -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: неверный ключ -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ключ требует аргумент -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: ключ `-W %s' неоднозначен\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: ключ `-W %s' не имеет аргумента\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "не удалось выделить %lu байт для хеш-таблицы: закончилась память" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Загружено=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Переформулировано=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Противоречий=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Поиск неявного правила для `%s'.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Поиск неявного правила для элемента архива `%s'.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Избежание рекурсивного вызова неявного правила.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Попытка применения правила с образцом, основа `%.*s'.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Отвержение невозможной зависимости правила `%s'.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Отвержение невозможной неявной зависимости `%s'.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Попытка применения правила зависимости `%s'.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Попытка применения неявной зависимости `%s'.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Обнаружена зависимость `%s' в виде VPATH `%s'\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Поиск правила с промежуточным файлом `%s'.\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Не удалось создать временный файл\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Ошибка 0x%x (игнорирована)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Ошибка 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Ошибка %d (игнорирована)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Ошибка %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (сделан дамп памяти)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Ожидание завершения заданий..." + +#: job.c:579 +#, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Незавершённый потомок %p (%s) PID %s %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (удалённый)" + +#: job.c:758 +#, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Подбирается неудачно завершившийся потомок %p PID %s %s\n" + +#: job.c:759 +#, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Подбирается удачно завершившийся потомок %p PID %s %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Подчищаю временный пакетный файл %s\n" + +#: job.c:861 +#, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Удаляется потомок %p PID %s%s из цепочки.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "пишу в сервер задач" + +#: job.c:922 +#, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Освобождается токен для потомка %p (%s).\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() не смогла запустить процесс (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"При неудачном запуске сосчитано %d аргументов\n" + +#: job.c:1525 +#, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Помещение потомка %p (%s) PID %s%s в цепочку потомков.\n" + +#: job.c:1778 +#, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Получен токен для потомка %p (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "читаю задачи из потока" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "Применяется способ из %s:%lu для обновления цели `%s'.\n" + +#: job.c:1802 +#, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Выполняется встроенный способ для обновления цели `%s'.\n" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "эта операционная система не позволяет устанавливать пределы загрузки" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "невозможно установить пределы загрузки: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "закончились файловые дескрипторы: не удалось сделать копию stdin\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "закончились файловые дескрипторы: не удалось сделать копию stdout\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Не удалось восстановить stdin\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Не удалось восстановить stdout\n" + +#: job.c:2127 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make нашла завершившегося потомка pid %s, всё ещё ожидает pid %s\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Команда не найдена" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Командный процессор не найден" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: вероятно, закончилось место под окружение" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "Переменная $SHELL изменилась (было '%s', теперь '%s')\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Создаётся временный пакетный файл %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" +"Содержимое файла пакетных заданий:%s\n" +"\t%s\n" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "" +"%s (строка %d) Плохой контекст командного процессора (!unixy && !" +"batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Ключи:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Игнорируется для совместимости.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Без условий отрабатывать все цели.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C КАТАЛОГ, --directory=КАТАЛОГ\n" +" Перейти в КАТАЛОГ перед выполнением действий.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d Выводить массу отладочных сообщений.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=ФЛАГИ] Выводить различные типы отладочной " +"информации.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Переменные окружения заменяют значения " +"makefile.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" +" --eval=СТРОКА Вычислить СТРОКУ как предложение makefile.\n" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f ФАЙЛ, --file=ФАЙЛ, --makefile=ФАЙЛ\n" +" Использовать ФАЙЛ в качестве makefile.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Показать эту справку и выйти.\n" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Игнорировать ошибки способов.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I КАТАЛОГ, --include-dir=КАТАЛОГ\n" +" Искать включаемые make-файлы в КАТАЛОГЕ.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Запускать одновременно до N заданий; \n" +" если N не указано, число заданий " +"неограничено.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Продолжать работу, даже если некоторые цели\n" +" не могут быть достигнуты.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N] Не запускать\n" +" несколько заданий, если загрузка больше N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Использовать последнее mtime при выборе между\n" +" символическими ссылками и целью.\n" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Не применять способ на самом деле; просто\n" +" напечатать его.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o ФАЙЛ, --old-file=ФАЙЛ, --assume-old=ФАЙЛ\n" +" Считать ФАЙЛ очень старым и не переделывать " +"его.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base Напечатать внутреннюю базу данных make.\n" + +#: main.c:347 +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Не применять способ;\n" +" код завершения показывает, всё ли уже " +"сделано.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Не использовать встроенные неявные правила.\n" + +# Что такое "variable settings"? +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Выключить установку встроенных\n" +" значений переменных.\n" + +#: main.c:353 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Не показывать сами способы.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Отменить ключ -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Установить время доступа целей в текущее,\n" +" а не пересобирать их.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version Показать информацию о версии и выйти.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Напечатать текущий каталог.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Отменить ключ -w, даже если он был явно " +"указан.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W ФАЙЛ, --what-if=ФАЙЛ, --new-file=ФАЙЛ, --assume-new=ФАЙЛ\n" +" Считать ФАЙЛ всегда новым.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Выдавать предупреждение при ссылке\n" +" на неопределённую переменную.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "пустая строка недопустима в качестве имени файла" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "неизвестный способ задания уровня отладки `%s'" + +#: main.c:690 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: поймано прерывание или исключение (код = 0x%lx, адрес = 0x%p)\n" + +#: main.c:697 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Необработанное исключение в программе %s\n" +"Код исключения = %lx\n" +"Флаги исключения = %lx\n" +"Адрес исключения = 0x%p\n" + +#: main.c:705 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Нарушение доступа: операция записи по адресу 0x%p\n" + +#: main.c:706 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Нарушение доступа: операция чтения адреса 0x%p\n" + +#: main.c:781 main.c:792 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell() устанавливает default_shell = %s\n" + +#: main.c:834 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell(): поиск в путях устанавливает default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s приостанавливается на 30 секунд..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) завершён. Продолжаем.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile из стандартного ввода указан дважды." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (временный файл)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (временный файл)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Параллельные задачи (-j) не поддерживаются на этой платформе." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Возвращается режим одиночной задачи (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "внутренняя ошибка: несколько ключей --jobserver-fds" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "внутренняя ошибка: неправильная строка --jobserver-fds: `%s'" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "Клиент сервера заданий (fds %d,%d)\n" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"предупреждение: в суб-Makefile принудительно задан -jN; режим сервера задач " +"запрещён" + +#: main.c:1750 +msgid "dup jobserver" +msgstr "создаю копию сервера задач" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"предупреждение: сервер задач недоступен: используется -j1.\n" +"Добавьте `+' к правилу в родительском make." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "создаю канал задач" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "начальная настройка сервера задач" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "Символические ссылки не поддерживаются: отменяется ключ -L." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Обновление make-файлов....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Make-файл `%s', возможно, зациклен, он не будет пересобираться.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Попытка пересобрать make-файл `%s' завершилась неудачно." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Включаемый make-файл `%s' не найден." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Make-файл `%s' не найден" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Невозможно перейти в первоначальный каталог." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Повторное выполнение[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (временный файл)" + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL содержит более одной цели" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Не заданы цели и не найден make-файл" + +#: main.c:2272 +msgid "No targets" +msgstr "Нет целей" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Обновление целей результата...\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "предупреждение: Неправильный ход часов. Сборка может быть неполной." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Использование: %s [КЛЮЧ]... [ЦЕЛЬ]...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Эта программа собрана для %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Эта программа собрана для %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Сообщайте об ошибках по адресу \n" + +#: main.c:2562 +#, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "для ключа `%s%s' нужно указать аргументом непустую строку" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "ключ `-%c' должен использоваться с целым положительным аргументом" + +#: main.c:3054 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "%sЭта программа собрана для %s\n" + +#: main.c:3056 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "%sЭта программа собрана для %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" +"%sЛицензия GPLv3+: GNU GPL версии 3 или новее \n" +"%sЭто свободное программное обеспечение: вы можете свободно изменять его и\n" +"%sраспространять. НЕТ НИКАКИХ ГАРАНТИЙ вне пределов, допустимых законом.\n" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# База данных Make, напечатана %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Печать базы данных Make завершена %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Вход в неизвестный каталог\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Выход из неизвестного каталога\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Вход в каталог `%s'\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Выход из каталога `%s'\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Вход в неизвестный каталог\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Выход из неизвестного каталога\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Вход в каталог `%s'\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Выход из каталога `%s'\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Останов.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Неизвестная ошибка %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "закончилась виртуальная память" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "" +"%s: пользователь %lu (действительный %lu),\n" +"группа %lu (действительная %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Доступ инициализации" + +#: misc.c:808 +msgid "User access" +msgstr "Доступ пользователя" + +#: misc.c:856 +msgid "Make access" +msgstr "Доступ make" + +#: misc.c:890 +msgid "Child access" +msgstr "Доступ потомка" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "ошибка записи: %s" + +#: misc.c:956 +msgid "write error" +msgstr "ошибка записи" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Чтение make-файлов...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Чтение make-файла `%s'" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (нет цели по умолчанию)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (путь поиска)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (игнорировать ошибки)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (не раскрывать символ `~') " + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "неверный синтаксис в условном выражении" + +#: read.c:891 +msgid "recipe commences before first target" +msgstr "обнаружен способ до первого определения цели" + +#: read.c:940 +msgid "missing rule before recipe" +msgstr "перед способом отсутствует правило" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "пропущен разделитель%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr "(не имели ли вы в виду TAB вместо восьми пробелов?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "пропущен образец цели" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "несколько образцов цели" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "образец цели не содержит `%%'" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "пропущена `endif'" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "пустое имя переменной" + +#: read.c:1367 +msgid "extraneous text after `define' directive" +msgstr "излишний текст после директивы `define'" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "пропущена `endif', незавершённая `define'" + +#: read.c:1420 +msgid "extraneous text after `endef' directive" +msgstr "излишний текст после директивы `endef'" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Излишний текст после директивы `%s'" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "излишняя `%s'" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "в условном выражении возможна только одна `else'" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Неправильный формат задания переменной цели" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "в способах не могут задаваться зависимости" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "смешаны неявные правила и правила со статическими образцами" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "смешаны неявные и обычные правила" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "цель `%s' не соответствует образцу целей" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "целевой файл `%s' имеет вхождения и с `:', и с `::' " + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "цель `%s' указана несколько раз в одном правиле" + +#: read.c:2006 +#, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "предупреждение: переопределение способа для цели `%s'" + +#: read.c:2009 +#, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "предупреждение: старый способ для цели `%s' игнорируются" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "предупреждение: встречен символ NUL; игнорируется до конца строки" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Цель `%s' не требует выполнения команд." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s' не требует обновления." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Обрезается файл `%s'.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sНет правила для сборки цели `%s'%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sНет правила для сборки цели `%s', требуемой для `%s'%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Обработка целевого файла `%s'.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Предыдущая попытка обновить файл `%s' завершилась неудачно.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Файл `%s' уже был обработан.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Файл `%s' обновляется в данный момент.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Обновление файла `%s' завершено.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Файл `%s' не существует.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Предупреждение: у файла `%s' параметр .LOW_RESOLUTION_TIME содержит " +"метку времени с высокой точностью" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Найдено неявное правило для `%s'.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Не найдено неявного правила для `%s'.\n" + +#: remake.c:502 +#, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Использование способа по умолчанию для `%s'.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Циклическая зависимость %s <- %s пропущена." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Обновление целей, от которых зависит целевой файл `%s', завершено.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Цели, от которых зависит `%s', в настоящий момент собираются.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Аварийный останов на целевом файле `%s'.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Цель `%s' не была пересобрана из-за ошибок." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Зависимость `%s' только для цели `%s'.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Зависимость `%s' цели `%s' не существует.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Зависимость `%s' новее, чем цель `%s'.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Зависимость `%s' старее, чем цель `%s'.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Цель `%s' объявлена с двумя двоеточиями и не имеет зависимостей.\n" + +#: remake.c:765 +#, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "Способ для `%s' не задан, и начальные условия не изменены.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Пересборка `%s' из-за установленного ключа always-make.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Нет необходимости пересобирать цель `%s'." + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; используется VPATH-имя `%s'" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Необходимо пересобрать цель `%s'.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Игнорируется VPATH-имя `%s'.\n" + +#: remake.c:815 +#, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "В настоящее время применяется способ `%s'.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Не удалось пересоздать файл цели `%s'.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Целевой файл `%s' успешно пересоздан.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Целевой файл `%s' требует пересоздания с ключом -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Использование команд по умолчанию для `%s'.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Предупреждение: Время изменения файла `%s' находится в будущем" + +#: remake.c:1370 +#, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Предупреждение: Время изменения файла `%s' находится в будущем (%s)" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "Элемент .LIBPATTERNS `%s' не является образцом" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Не экспортируемые настройки: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Неявные правила" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Неявных правил нет." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# Неявных правил: %u, терминальных: %u" + +#: rule.c:526 +msgid " terminal." +msgstr " терминал." + +#: rule.c:534 +#, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ОШИБКА: неверное значение num_pattern_rules! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "неизвестный сигнал" + +#: signame.c:94 +msgid "Hangup" +msgstr "Обрыв терминальной линии" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Прерывание" + +#: signame.c:100 +msgid "Quit" +msgstr "Аварийное прерывание" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Недопустимая инструкция" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Прерывание на контрольной точке" + +#: signame.c:111 +msgid "Aborted" +msgstr "Прервано" + +#: signame.c:114 +msgid "IOT trap" +msgstr "Ошибка IOT" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Ошибка эмуляции" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Ошибка операции с плавающей точкой" + +#: signame.c:123 +msgid "Killed" +msgstr "Уничтожение" + +#: signame.c:126 +msgid "Bus error" +msgstr "Неверное обращение к памяти" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Нарушение прав доступа к памяти" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Неправильный системный вызов" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Обрыв канала" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Сигнал по таймеру" + +#: signame.c:141 +msgid "Terminated" +msgstr "Завершение" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Определяемый пользователем сигнал 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Определяемый пользователем сигнал 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Потомок завершил работу" + +#: signame.c:158 +msgid "Power failure" +msgstr "Отказ питания" + +#: signame.c:161 +msgid "Stopped" +msgstr "Останов" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Останов (ввод с терминала) " + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Останов (вывод на терминал)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Останов (сигнал)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Превышен предел процессорного времени" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Превышен предел размера файла" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Виртуальное время истекло" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Время профилирования истекло" + +#: signame.c:188 +msgid "Window changed" +msgstr "Окно изменено" + +#: signame.c:191 +msgid "Continued" +msgstr "Возобновление" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Условия экстренного ввода/вывода" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "Возможен ввод/вывод" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Ресурс потерян" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Сигнал опасности" + +#: signame.c:219 +msgid "Information request" +msgstr "Запрос информации" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Сопроцессор с плавающей точкой недоступен" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s # строк в strcache: %d / lookups = %lu / hits = %lu\n" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s # буферов strcache: %d (* %d B/buffer = %d B)\n" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s размер strcache: всего = %d (%d) / макс = %d / мин = %d / сред = %d\n" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s свободно в strcache: всего = %d (%d) / макс = %d / мин = %d / сред = %d\n" + +#: strcache.c:244 +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# состояние хеш-таблицы strcache:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "по умолчанию" + +#: variable.c:1544 +msgid "environment" +msgstr "определена в среде" + +#: variable.c:1547 +msgid "makefile" +msgstr "Make-файл" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "задан ключ -e" + +#: variable.c:1553 +msgid "command line" +msgstr "определена в командной строке" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "Директива `override'" + +#: variable.c:1559 +msgid "automatic" +msgstr "автоматическая" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (из `%s', строка %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# состояние переменных в хеш-таблице:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Переменные\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Значения переменных особенные для маски" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Нет значений переменных особенных для маски." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u значений переменных особенных для маски" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "предупреждение: неопределённая переменная `%.*s'" + +#: vmsfunctions.c:92 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search() вернула код ошибки %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Предупреждение: Пустое перенаправление\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "внутренняя ошибка: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-предупреждение, возможно вам потребуется повторно разрешить\n" +"обработку CTRL-Y из DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "ВСТРОЕННЫЙ [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "ВСТРОЕННЫЙ CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "ВСТРОЕННЫЙ RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Неизвестная встроенная команда '%s'\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Ошибка, пустая команда\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Стандартный ввод перенаправлен из %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Поток ошибок перенаправлен в %s\n" + +#: vmsjobs.c:523 +#, c-format +msgid "Append output to %s\n" +msgstr "Стандартный вывод добавлен в %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Стандартный вывод перенаправлен в %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "Добавить %.*s и очистить\n" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Вместо заданного выполняется %s\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Ошибка порождения процесса, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Пути поиска VPATH\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Не определён путь поиска `vpath'." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u путей поиска по `vpath'\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Не определён общий (переменная `VPATH') путь поиска." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Общий (переменная `VPATH') путь поиска:\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() не смогла запустить процесс (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sЭто свободная программа; подробности об условиях распространения " +#~ "смотрите\n" +#~ "%sв исходном коде. Мы НЕ предоставляем гарантий; даже гарантий\n" +#~ "%sКОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ КАКОЙ-ЛИБО ЦЕЛИ.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "излишний `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "пустая директива `override'" + +#~ msgid "invalid `override' directive" +#~ msgstr "неправильная директива `override'" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-предупреждение, после CTRL-Y останутся суб-процессы.\n" diff --git a/po/stamp-po b/po/stamp-po new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/po/stamp-po @@ -0,0 +1 @@ +timestamp diff --git a/po/sv.gmo b/po/sv.gmo new file mode 100644 index 0000000..ec5fbf5 Binary files /dev/null and b/po/sv.gmo differ diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..d183e01 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,2156 @@ +# Swedish messages translation of make +# Copyright (C) 2002 Free Software Foundation, Inc. +# Tomas Gradin , 1996-2002. +# Christer Andersson , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2007-12-19 11:50+0100\n" +"Last-Translator: Christer Andersson \n" +"Language-Team: Swedish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "försök att använda en funktion som inte stöds: \"%s\"" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "nydatering av arkivmedlem är inte tillgängligt i VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "nydatera: Arkivet \"%s\" finns inte" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "nydatera: \"%s\" är inte något giltigt arkiv" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "nydatera: medlemmen \"%s\" finns inte i \"%s\"" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "nydatera: Felaktig returkod från ar_member_touch på \"%s\"" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" +"lbr$set_module misslyckades med att extrahera modulinformation, status = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control misslyckades och gav status = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "kan inte öppna biblioteket \"%s\" för att slå upp medlemmen \"%s\"" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Medlem \"%s\"%s: %ld byte vid %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (namnet kan vara avkortat)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Datum %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, flaggor = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Avbrott.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Arkivmedlemmen \"%s\" kan vara felaktig; ej borttagen" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Arkivmedlemmen \"%s\" kan vara felaktig; ej borttagen" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Tar bort filen \"%s\"" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Tar bort filen \"%s\"" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# kommandon att utföra" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (inbyggd):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (från \"%s\", rad %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Kataloger\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: kunde inte ta status.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (nyckel %s, mtid %d): kunde inte öppnas.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (enhet %d, inod [%d,%d,%d]): kunde inte öppnas.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (enhet %ld, inod %ld): kunde inte öppnas.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (nyckel %s, mtid %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (enhet %d, inod [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (enhet %ld, inod %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Inga" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " filer, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "inga" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " omöjligheter" + +#: dir.c:1075 +msgid " so far." +msgstr " hittills." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " omöjligheter i %lu kataloger.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Den rekursiva variabeln \"%s\" hänvisar till sig själv (så småningom)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "oavslutad variabelreferens" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Kommandon angavs för filen \"%s\" på %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "Kommandon för filen \"%s\" hittades genom sökning med implicit regel," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "men \"%s\" anses nu vara samma fil som \"%s\"." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "" +"Kommer att bortse från kommandon för \"%s\" till förmån för dem som gäller " +"\"%s\"." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "kan inte ändra namn från enkelkolon \"%s\" till dubbelkolon \"%s\"" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "kan inte ändra namn från dubbelkolon \"%s\" till enkelkolon \"%s\"" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Tar bort övergångsfilen \"%s\"" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Tar bort övergångsfiler...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tidsvärde utanför gränser; ersätter med %s" + +#: file.c:804 +msgid "Current time" +msgstr "Nuvarande tid" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Inte ett mål:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Värdefull fil (nödvändig för .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Låtsasmål (nödvändig för .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Kommandoradsmål." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" +"# En standardmakefil, eller enligt MAKEFILES, eller en -include/sinclude-" +"makefil." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Implicit regelsökning har genomförts." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Implicit regelsökning har inte genomförts." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Implicit/statisk mönsterstam: \"%s\"\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Filen är ett övergående beroende." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Skapar också:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Ändringstiden har inte kontrollerats." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Filen finns inte." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Filen är mycket gammal." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Senast ändrad %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Filen har uppdaterats." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Filen har inte uppdaterats." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Kommandokörning pågår (DETTA ÄR ETT FEL)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Beroendekommandon körs (DETTA ÄR ETT FEL)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Uppdateringen lyckades." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Behöver uppdateras (-q har angivits)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Uppdateringen misslyckades." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# Ogiltigt värde i medlem av \"update_status\"!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# Ogiltigt värde i medlem av \"command_state\"!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Filer" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistik för filhashtabell:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "icke-numeriskt första argument till funktionen \"word\"" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "det första argumentet till funktionen \"word\" måste vara större än 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "icke-numeriskt första argument till funktionen \"wordlist\"" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "icke-numeriskt andra argument till funktionen \"wordlist\"" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) misslyckades (e=%ld)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Fel) misslyckades (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() misslyckades (e=%ld)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() misslyckades\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Städar bort tillfällig omgångsfil %s\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "otillräckligt antal argument (%d) till funktionen \"%s\"" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "ej implementerat på denna plattform: funktionen \"%s\"" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "oavslutat funktionsanrop \"%s\": \"%c\" saknas" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: flaggan \"%s\" är tvetydig\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: flaggan \"--%s\" tar inget argument\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: flaggan \"%c%s\" tar inget argument\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: flaggan \"%s\" kräver ett argument\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: okänd flagga \"--%s\"\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: okänd flagga \"%c%s\"\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: otillåten flagga -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ogiltig flagga -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: flaggan kräver ett argument -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: flaggan \"-W %s\" är tvetydig\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: flaggan \"-W %s\" tar inget argument\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "kan inte allokera %ld byte för hashtabell: minnet slut" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Fyllnadsgrad=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Omhash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Kollisioner=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Letar efter en implicit regel för \"%s\".\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Letar efter en implicit regel för arkivmedlemmen \"%s\".\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Undviker rekursion orsakad av implicit regel.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Prövar mönsterregel med stammen \"%.*s\".\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Avvisar det omöjliga regelbaserade beroendet \"%s\".\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Avvisar det omöjliga implicita beroendet \"%s\".\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Prövar det regelbaserade beroendet \"%s\".\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Prövar det implicita beroendet \"%s\".\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Hittade den nödvändiga \"%s\" som VPATH \"%s\"\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Letar efter en regel med övergångsfilen \"%s\".\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Kan inte skapa en temporärfil\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Fel 0x%x (ignoreras)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Fel 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Fel %d (ignoreras)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Fel %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (minnesdump)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Inväntar oavslutade jobb..." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Levande barnprocess 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (fjärr)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Inhöstar misslyckad barnprocess: 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Inhöstar lyckad barnprocess: 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Städar bort tillfällig omgångsfil %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Tar bort barnprocessen 0x%08lx PID %ld%s från kedjan.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "skriver till jobbserver" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Frigjorde symbol för barnprocessen 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() misslyckades med processtart (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Räknade till %d argument vid misslyckad start\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "För upp barnprocessen 0x%08lx (%s) PID %ld%s på kedjan.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Erhöll symbol för barnprocessen 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "läser från jobbledning" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Målet \"%s\" behöver inte återskapas" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "kan inte upprätthålla lastbegränsningar i detta operativsystem" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "kan inte upprätthålla lastbegränsning: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "inga fler filhandtag: kunde inte duplicera stdin\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "inga fler filhandtag: kunde inte duplicera stdout\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Kunde inte återställa stdin\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Kunde inte återställa stdout\n" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make inhöstade barnprocessen pid %ld, inväntar pid %ld\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Kommandot hittades inte" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Skalprogrammet hittades inte" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: miljöutrymmet kanske är slut" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL ändrades (var \"%s\", är nu \"%s\")\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Skapar tillfällig omgångsfil %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (rad %d) Felaktigt skalsammanhang (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Flaggor:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Ignoreras av kompatibilitetsskäl.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make Bygg ovillkorligen alla mål.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C KATALOG, --directory=KATALOG\n" +" Byt katalog till KATALOG innan något görs.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" +" -d Skriv ut massor av felsökningsinformation.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=FLAGGOR] Skriv ut olika sorters " +"felsökningsinformation.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Miljövariabler åsidosätter makefiler.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FIL, --file=FIL, --makefile=FIL\n" +" Använd FIL som makefil.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Skriv ut detta meddelande och avsluta.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Ignorera kommandofel.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I KATALOG, --include-dir=KATALOG\n" +" Genomsök KATALOG efter inkluderade makefiler.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Tillåt N samtidiga jobb; oändligt många om " +"inget antal anges.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Fortsätt även om vissa mål inte kan skapas.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Påbörja fler jobb endast om lasten understiger " +"N.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times Använd den senaste av mtiderna för symboliska " +"länkar eller mål.\n" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Kör inte kommandona, skriv bara ut dem.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o FIL, --old-file=FIL, --assume-old=FIL\n" +" Betrakta FIL som mycket gammal och återskapa " +"den inte.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base Skriv ut makes interna databas.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Kör inga kommandon; slutstatus visar " +"färskheten.\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Inaktivera de inbyggda implicita reglerna.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Inaktivera de inbyggda " +"variabelinställningarna.\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Återge inte kommandon.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" Stäng av -k.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Nydatera mål i stället för att återskapa dem.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version Skriv ut makes versionsnummer och avsluta.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Skriv ut aktuell katalog.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Stäng av -w, även om det är implicit " +"påslaget.\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W FIL, --what-if=FIL, --new-file=FIL, --assume-new=FIL\n" +" Betrakta FIL som hur ny som helst.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Varna vid användning av en odefinierad " +"variabel.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "en tom sträng är ett ogiltigt filnamn" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "okänd felsökningsnivå \"%s\" angiven" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Avbrott/Undantag fångat (kod = 0x%lx, adress = 0x%lx)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Ett ohanterat undantagsfilter anropades från programmet %s\n" +"Undantagskod = %lx\n" +"Undantagsflaggor = %lx\n" +"Undantagsadress = %lx\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Åtkomstförseelse: skrivinstruktion på adressen %lx\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Åtkomstförseelse: läsinstruktion på adressen %lx\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell ger default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell-sökvägen gav default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s suspenderas i 30 sekunder..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "färdig med sleep(30). Fortsätter.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefil från standard in angavs dubbelt." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (temporärfil)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (temporärfil)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Parallella jobb (-j) stöds inte på denna plattform." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Återställer till enkeljobbsläge (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "internt fel: flera \"--jobserver-fds\"-flaggor" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "internt fel: ogiltig \"--jobserver-fds\"-sträng \"%s\"" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "varning: -jN framtvingat i del-make: inaktiverar jobbserverläge." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "duplicerar jobbserver" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"varning: jobbserver otillgänglig: använder -j1. Lägg till \"+\" i " +"föräldraregeln." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "skapar jobbledning" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "iordningställer ledning till jobbserver" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "Symboliska länkar stöds inte: inaktiverar -L." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Uppdaterar makefiler...\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Makefilen \"%s\" torde loopa; återskapas inte.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Misslyckades med att återskapa makefilen \"%s\"." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Den inkluderade makefilen \"%s\" hittades inte." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Makefilen \"%s\" hittades inte" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Kunde inte återgå till ursprungskatalogen." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Utför på nytt[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "avlänka (temporärfil): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL innehåller fler än ett mål" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Inga mål angavs och ingen makefil hittades" + +#: main.c:2272 +msgid "No targets" +msgstr "Inga mål" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Uppdaterar slutmål...\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"varning: Klockförskjutning upptäckt. Bygget kan ha blivit ofullständigt." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Användning: %s [flaggor] [mål] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Detta program byggdes för %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Detta program byggdes för %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Anmäl fel till .\n" +"Skicka synpunkter på översättningen till .\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "flaggan \"-%c\" kräver ett strängargument som inte är tomt" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "flaggan \"-%c\" kräver ett positivt heltal som argument" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sDetta program byggdes för %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sDetta program byggdes för %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make-databas, utskriven %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Färdigställde Make-databas %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Går till en okänd katalog\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Lämnar en okänd katalog\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Går till katalogen \"%s\"\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Lämnar katalogen \"%s\"\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Går till en okänd katalog\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Lämnar en okänd katalog\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Går till katalogen \"%s\"\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Lämnar katalogen \"%s\"\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Stannar.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Okänt fel %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "virtuellt minne uttömt" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: användare %lu (verklig %lu), grupp %lu (verklig %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Åtkomst inledd" + +#: misc.c:808 +msgid "User access" +msgstr "Användaråtkomst" + +#: misc.c:856 +msgid "Make access" +msgstr "Make-åtkomst" + +#: misc.c:890 +msgid "Child access" +msgstr "Barnåtkomst" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "skrivfel: %s" + +#: misc.c:956 +msgid "write error" +msgstr "skrivfel" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Läser makefiler...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Läser makefil \"%s\"" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (inget standardmål)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (sökväg)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (oviktigt)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ingen ~-expansion)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "ogiltig syntax i villkorssats" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "kommandon inleds före första målet" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "regel saknas före kommandon" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "separator saknas%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (var avsikten TAB i stället för 8 mellanslag?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "målmönster saknas" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "flera målmönster" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "målmönstret innehåller inget \"%%\"" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "\"endif\" saknas" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "tomt variabelnamn" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Överflödig text efter direktivet \"endef\"" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "\"endef\" saknas, oavslutat \"define\"" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Överflödig text efter direktivet \"endef\"" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Överflödig text efter direktivet \"%s\"" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "överflödigt \"%s\"" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "endast ett \"else\" per villkor" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Felformad målberoende variabeldefinition" + +#: read.c:1855 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "beroenden kan inte definieras i kommandoskript" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "blandade implicita regler och statiska mönsterregler" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "blandade implicita regler och normala regler" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "målet \"%s\" motsvarar inte målmönstret" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "målfilen \"%s\" har både poster med : och ::" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "målet \"%s\" anges flera gånger i samma regel." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "varning: åsidosätter kommandon för målet \"%s\"" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "varning: bortser från gamla kommandon för målet \"%s\"" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "varning: NUL-tecken upptäckt, bortser från resten av raden" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Inget behöver göras för \"%s\"." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "\"%s\" är färsk." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Beskär filen \"%s\".\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sIngen regel för att skapa målet \"%s\"%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sIngen regel för att skapa målet \"%s\", som behövs till \"%s\"%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Överväger målfilen \"%s\".\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Misslyckades nyligen med att uppdatera filen \"%s\".\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Filen \"%s\" har redan övervägts.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Uppdaterar fortfarande filen \"%s\".\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Slutförde uppdaterandet av filen \"%s\".\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Filen \"%s\" finns inte.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Varning: .LOW_RESOLUTION_TIME-filen \"%s\" har en högupplöst tidsstämpel" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Hittade en implicit regel för \"%s\".\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Hittade ingen implicit regel för \"%s\".\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Använder standardkommandon för \"%s\".\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Det cirkulära beroendet %s <- %s släpptes." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Färdigställde de nödvändiga förutsättningarna för målfilen \"%s\".\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "De nödvändiga förutsättningarna för \"%s\" håller på att skapas.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Ger upp med målfilen \"%s\".\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Målet \"%s\" återskapades inte på grund av fel." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "" +"Den nödvändiga förutsättningen \"%s\" för målet \"%s\" är endast-ordning.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Den nödvändiga förutsättningen \"%s\" för målet \"%s\" finns inte.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Den nödvändiga förutsättningen \"%s\" är nyare än målet \"%s\".\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Den nödvändiga förutsättningen \"%s\" är äldre än målet \"%s\".\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Målet \"%s\" är dubbelkolon och har inga beroenden.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "" +"Inga kommandon eller nödvändiga förutsättningar för \"%s\" har förändrats.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Skapar \"%s\" på grund av flaggan always-make.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Målet \"%s\" behöver inte återskapas" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; använder VPATH-namnet \"%s\"" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Måste återskapa målet \"%s\".\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Bortser från VPATH-namnet \"%s\".\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Kommandon för \"%s\" körs.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Misslyckades med att återskapa målfilen \"%s\".\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Målfilen \"%s\" återskapades.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Målfilen \"%s\" behöver återskapas med -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Använder standardkommandon för \"%s\".\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Varning: Filen \"%s\" har ett ändringsdatum i framtiden." + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Varning: Filen \"%s\" har en ändringstid %.2g sekunder i framtiden" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNS-elementet \"%s\" är inte något mönster" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Customs kommer inte att exportera %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Implicita regler" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Inga implicita regler." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u implicita regler, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " slutregler." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "FEL: num_pattern_rules felaktigt! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "okänd signal" + +#: signame.c:94 +msgid "Hangup" +msgstr "Avringd" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Avbrott" + +#: signame.c:100 +msgid "Quit" +msgstr "Avslutad" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Otillåten instruktion" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Spårningsfälla" + +#: signame.c:111 +msgid "Aborted" +msgstr "Avbruten" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IO-fälla" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Emulatorfälla" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Flyttalsundantag" + +#: signame.c:123 +msgid "Killed" +msgstr "Dödad" + +#: signame.c:126 +msgid "Bus error" +msgstr "Bussfel" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Segmenteringsfel" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Felaktigt systemanrop" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Ledningsbrott" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Alarmklocka" + +#: signame.c:141 +msgid "Terminated" +msgstr "Avslutad" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Användarsignal 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Användarsignal 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Barn avslutades" + +#: signame.c:158 +msgid "Power failure" +msgstr "Strömavbrott" + +#: signame.c:161 +msgid "Stopped" +msgstr "Stoppades" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Stoppades (tty-läsning)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Stoppades (tty-utskrift)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Stoppades (signal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "CPU-tidsgräns överskreds" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Filstorleksgräns överskreds" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Virtuellt tidur löpte ut" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Profileringstidur löpte ut" + +#: signame.c:188 +msgid "Window changed" +msgstr "Fönster ändrat" + +#: signame.c:191 +msgid "Continued" +msgstr "Fortsatte" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Brådskande I/O-läge" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O-tillfälle" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Miste resurs" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Farosignal" + +#: signame.c:219 +msgid "Information request" +msgstr "Informationsbegäran" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Flyttalsprocessor inte tillgänglig" + +#: strcache.c:235 +#, fuzzy, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s antal strängar i strcache: %d\n" + +#: strcache.c:237 +#, fuzzy, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s antal strcache-buffertar: %d\n" + +#: strcache.c:239 +#, fuzzy, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s strcache storlek: total = %d / max = %d / min = %d / snitt = %d\n" + +#: strcache.c:241 +#, fuzzy, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s strcache ledigt: total = %d / max = %d / min = %d / snitt = %d\n" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# statistik för filhashtabell:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "normal" + +#: variable.c:1544 +msgid "environment" +msgstr "miljö" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefil" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "miljö enligt -e" + +#: variable.c:1553 +msgid "command line" +msgstr "kommandorad" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "\"override\"-direktiv" + +#: variable.c:1559 +msgid "automatic" +msgstr "automatisk" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (från \"%s\", rad %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# statistik för variabelmängd-hashtabell:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Variabler\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Mönsterspecifika variabelvärden" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Inga mönsterspecifika variabelvärden." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u mönsterspecifika variabelvärden" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "varning: odefinierad variabel \"%.*s\"" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search misslyckades och gav %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Varning: Tom omdirigering\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "internt fel: \"%s\" command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-varning, CTRL-Y-hantering kanske behöver återställas från DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "INBYGGT [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "INBYGGT CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "INBYGGT RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Okänt inbyggt kommando \"%s\"\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Fel, tomt kommando\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Inkanal omdirigerad till %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Felkanal omdirigerad till %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Utkanal omdirigerad till %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Utkanal omdirigerad till %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Utför %s i stället\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Fel vid avknoppning, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH-sökvägar\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Inga \"vpath\"-sökvägar." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u \"vpath\"-sökvägar.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Ingen allmän sökväg (enligt \"VPATH\"-variabeln)." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Allmän sökväg (enligt \"VPATH\"-variabeln):\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() misslyckades med processtart (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sDetta är fri programvara; se källkoden för kopieringsvillkor.\n" +#~ "%sINGA garantier lämnas, inte ens vid KÖP eller FÖR NÅGOT SPECIFIKT\n" +#~ "%sÄNDAMÅL.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "överflödigt \"endef\"" + +#~ msgid "empty `override' directive" +#~ msgstr "tomt \"override\"-direktiv" + +#~ msgid "invalid `override' directive" +#~ msgstr "ogiltigt \"override\"-direktiv" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-varning, CTRL-Y lämnar efter sig underprocess(er).\n" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Inga filer." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u filer i %u hashbehållare.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# i genomsnitt %.3f filer per behållare, högst %u filer i samma " +#~ "behållare.\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Syntaxfel, är fortfarande innanför '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "Erhöll SIGCHLD; %u kvarvarande barnprocesser.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "KATALOG" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Byt till KATALOG först" + +#~ msgid "FLAGS" +#~ msgstr "FLAGGOR" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Suspendera processen för att möjliggöra anslutning av felsökare" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Miljövariabler åsidosätter makefiler" + +#~ msgid "FILE" +#~ msgstr "FIL" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "Använd FIL som makefil" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "Genomsök KATALOG efter inkluderade makefiler" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Påbörja flera jobb endast om lasten understiger N" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "Kör inte kommandona, skriv bara ut dem" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "Betrakta FIL som mycket gammal och återskapa den inte" + +#~ msgid "Don't echo commands" +#~ msgstr "Återge inte kommandon" + +#~ msgid "Turns off -k" +#~ msgstr "Stänger av -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "Betrakta FIL som hur ny som helst" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Ange inte -j eller --jobs om sh.exe inte finns tillgänglig." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Återställer make för enkeljobbsläge." + +#~ msgid "Entering" +#~ msgstr "Går till" + +#~ msgid "Leaving" +#~ msgstr "Lämnar" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "inget filnamn till \"%sinclude\"" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "målet \"%s\" har ett tomt beroendemönster" + +#~ msgid "# No variables." +#~ msgstr "# Inga variabler." + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# i genomsnitt %1.f variabler per behållare, högst %u i samma behållare.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# i genomsnitt %d.%d variabler per behållare, högst %u i samma " +#~ "behållare.\n" diff --git a/po/tr.gmo b/po/tr.gmo new file mode 100644 index 0000000..002a950 Binary files /dev/null and b/po/tr.gmo differ diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..441e10c --- /dev/null +++ b/po/tr.po @@ -0,0 +1,2148 @@ +# Turkish translations for GNU Make messages. +# Copyright (C) 2006 Free Software Foundation, Inc. +# Nilgün Belma Bugüner , 2001, ..., 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2006-04-23 08:45+0300\n" +"Last-Translator: Nilgün Belma Bugüner \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.9.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "desteklenmeyen özelliği kullanmaya çalışıyor: `%s'" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "VMS'de işe yaramayan arşiv üyesine dokunup geçiyor" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "Dokunulup geçildi: Arşiv `%s' yok" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "Dokunulup geçildi: `%s' geçerli bir arşiv değil" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "Dokunulup geçildi: Üye `%s', `%s' içinde yok" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "Dokunulup geçildi: `%s' deki ar_member_touch'dan dönen kod hatalı" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_module modül bilgisini çıkarırken başarısız oldu, durum = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control durum =%d ile başarısız oldu" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "`%s' kaynakçası `%s' üyesine bakmak için açılamadı" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Üye `%s'%s: %ld bayt %ld 'de (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr "(isim kırpılmış olmalı)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Tarih %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " Kull-kim = %d, Grup-kim = %d, kip = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Bırakıldı.\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Arşiv üyesi `%s' sahte olabilir; silinmedi" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Arşiv üyesi `%s' sahte olabilir; silinmedi" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] `%s' dosyası siliniyor" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** `%s' dosyası siliniyor" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# çalıştırma komutları" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (paket içinde):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (`%s'den, satır %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# Dizin\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: durumlanamadı.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (anahtar (key) %s, değişiklik tarihi (mtime) %d): açılamadı.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (aygıt %d, i-düğüm [%d,%d,%d]): açılamadı.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (aygıt %ld, i-düğüm %ld): açılamadı.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (anahtar (key) %s, değişiklik tarihi (mtime) %d):" + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (aygıt %d, i-düğüm [%d,%d,%d]):" + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (aygıt %ld, i-düğüm %ld):" + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Hayır" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " dosyaları," + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "hayır" + +#: dir.c:1071 +msgid " impossibilities" +msgstr "olanaksızlıklar" + +#: dir.c:1075 +msgid " so far." +msgstr " çok uzak." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " %lu dizinde olanaksızlıklar.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Çevrimsel değişken `%s' tekrar kendine bağıntılı (sonuçta)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "sonlandırılmamış değişken bağıntısı" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "`%s' dosyası için komutlar %s:%lu de belirtildi," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "`%s' dosyası için komutlar örtük kural aramasında bulundu," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "fakat `%s' şimdi `%s' dosyası ile aynı dosya olarak düşünülmeli." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "`%s' dosyası için komutlar `%s' lehine yoksayılmış olacak." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "tek-sütun `%s', çift-sütun `%s' olarak yeniden adlandırılamaz" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "çift-sütun `%s', tek-sütun `%s' olarak yeniden adlandırılamaz" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Aracı dosya `%s' siliniyor" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Aracı dosyalar siliniyor...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Tarih damgası kapsamdışı; yerine %s kullanılıyor" + +#: file.c:804 +msgid "Current time" +msgstr "Şu an" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Bir hedef değil:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Kıymetli dosya (.PRECIOUS önceden gerekliliği)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Sahte hedef (.PHONY önceden gerekliliği)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Komut-satırı hedefi." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Bir öntanımlı,MAKEFILES veya -include/sinclude makefile." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Örtük kural araştırması yapılmıştı." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# Örtük kural araştırması yapılmamıştı." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Örtük/değişmeyen kalıp kökü: `%s'\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "" +"# Orta seviyede önceden gerekli bir dosya (öncelikle gerekli dosyalara " +"aracılık eden dosya)" + +#: file.c:946 +msgid "# Also makes:" +msgstr "# Oluştursa da:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# Değişiklik zamanı hiç kontrol edilmedi." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Dosya yok." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Dosya çok eski." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Son değişiklik tarihi %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Dosya güncelleştirilmişti." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Dosya güncelleştirilmemişti." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Komutlar şu an işlemlerini sürdürüyor (BU BÄ°R YAZILIM HATASI)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "" +"# Bağımlılıkların komutları işlemlerini sürdürüyor (BU BÄ°R YAZILIM HATASI)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Tamamen güncellendi." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Güncellenmiş olması gerekir (-q verildi)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Güncellenmiş olamadı." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# `update_status' üyesinde geçersiz değer!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# `command_state' üyesinde geçersiz değer!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Dosyalar" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# dosyaların hash tablosu durumları:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "`word' işlevinde sayısal olmayan ilk argüman" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "`word' işlevinin ilk argümanı sıfırdan büyük olmalı" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "`wordlist' işlevinde sayısal olmayan ilk argüman" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "`wordlist' işlevinde sayısal olmayan ikinci argüman" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(In) başarısız (e=%ld)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "create_child_process: DuplicateHandle(Err) başarısız (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() başarısız (e=%ld)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe (): process_init_fd() başarısız\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Geçici komut-listesi (batch) dosyası %s temizleniyor\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "argüman sayısı (%d) `%s' işlevinde yetersiz" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "bu platformda gerçekleştirilmemiş: işlev `%s'" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "`%s' işlemine çağrı sonlandırılmamış: `%c' kayıp" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: `%s' seçeneği belirsiz\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: `--%s' seçeneği argümansız kullanılır\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: seçenek `%c%s' argümansız kullanılır\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: `%s' seçeneği bir argümanla kullanılır\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: `--%s' seçeneği bilinmiyor\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: `%c%s' seçeneği bilinmiyor\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: kuraldışı seçenek -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: geçersiz seçenek -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: seçenek bir argümanla kullanılır -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: `-W %s' seçeneği belirsiz\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: `-W %s' seçeneği argümansız kullanılır\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "hash tablosu için %ld bayt ayrılamıyor: bellek tükendi" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Yük=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Rehash=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Çakışmalar=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "`%s' için bir örtük kural arıyor.\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "`%s' için arşiv-üyesi örtük kural arıyor.\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Örtük kural çevrimi görmezden geliniyor.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "`%.*s' köküyle kalıp kuralı deneniyor.\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Kural önceden gerekliliği `%s' olanaksız olduğundan reddediliyor.\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Örtük önceden gereklilik `%s' olanaksız olduğundan reddediliyor.\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Kural önceden gerekliliği `%s' deneniyor.\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Örtük önceden gereklilik `%s' deneniyor.\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Önceden gereklilik `%s' VPATH `%s' olarak bulundu.\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Aracı dosya `%s' ile bir kural arıyor.\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Bir geçici dosya oluşturulamıyor\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Hata 0x%x (yoksayıldı)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Hata 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Hata %d (yoksayıldı)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Hata %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (bellek kopyası - core dosyası - diske yazıldı)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Bitmemiş işler için bekliyor...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Ast dosya işini sürdürüyor: 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (karşıdan)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Kaybeden ast dosya sağlanıyor: 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Kazanan ast dosya sağlanıyor: 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Geçici komut-listesi dosyası %s temizleniyor\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Ast 0x%08lx PID %ld%s zincirden kaldırılıyor\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "iş-sunucusu yazıyor" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Ast 0x%08lx (%s) için simge (token) kullanıma sunuldu.\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "Süreci başlatacak process_easy() başarısız oldu (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Sayılan %d argüman ile başarısız oldu\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Ast 0x%08lx (%s) PID %ld%s zincire konuluyor.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Ast 0x%08lx (%s) için simge (token) sağlandı.\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "görev listesi okunuyor" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Hedef `%s' nin yeniden derlenmesine gerek yok" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "işletim sisteminde yük sınırlarına ulaşılamadı " + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "ulaşılamayan yük sınırı: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "başka dosya tutucu yok: standart girdi kopyalanamadı\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "başka dosya tutucu yok: standart çıktı kopyalanamadı\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Standart girdi eski haline getirilemedi\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Standart çıktı eski haline getirilemedi\n" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make %ld pid'li ast süreci kaldırdı ama hala pid %ld için bekliyor\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Komut bulunamadı" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Kabuk uygulaması bulunamadı" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: ortam alanı tükenmiş olabilir" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL değişti (`%s' idi, şimdi `%s')\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "%s geçici komut-liste dosyasını oluşturuyor\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (satır %d) kabuk bağlamı hatalı (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Seçenekler:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Uyumluluk için yoksayıldı.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make Tüm hedefler koşulsuz olarak oluşturulur.\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr " -C DÄ°ZÄ°N, --directory=DIZIN Birşey yapmadan önce DÄ°ZÄ°Ne geçilir.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -b, -m Bir sürü hata ayıklama bilgisi basar.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=SEÇENEKLER] Çeşitli türde hata ayıklama bilgileri basar.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides Ortam değişkenleri makefile'ları değiştirir.\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f DOSYA, --file=DOSYA, --makefile=DOSYA\n" +" DOSYAyı bir makefile olarak okur.\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Bu iletiyi basar ve çıkar.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors Komutların ürettiği hataları yoksayar.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DÄ°ZÄ°N, --include-dir=DÄ°ZÄ°N\n" +" Eklenecek makefile'ları DÄ°ZÄ°Nde arar.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Bir defada N işe izin verir; argumansız iş\n" +" sayısı sınırsızdır.\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going Bazı hedefler yapılmadığında devam eder.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Yük N'den az olmadıkça çoklu işler " +"başlatılmaz.\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times sembolik bağlarla hedef arasında en son mtime\n" +" kullanılır\n" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Gerçekte komutlar çalıştırılmaz, gösterilir.\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o DOSYA, --old-file=DOSYA, --assume-old=DOSYA\n" +" DOSYAnın çok eski olduğu varsayılır ve\n" +" yeniden işlem yapılmaz.\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base make'in içsel veritabanını basar.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question Komut çalıştırmaz; güncelse çıkışta belirtir\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules Oluşumiçi örtük kuralları etkisizleştirir.\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables Oluşumiçi değişken ayarlarını etkisizleştirir\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet Komutlar işlenirken gösterilmez.\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop Bazı hedefler yapılmadığında devam etmez.\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Yeniden derlemek yerine hedeflere bakıp " +"geçer.\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version make sürüm numarasını basar ve çıkar.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory Kullanılan dizini basar.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Dolaylı olarak açılmış olsa bile -w 'yi " +"kapatır\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W DOSYA, --what-if=DOSYA, --new-file=DOSYA, --assume-new=DOSYA\n" +" DOSYA sonsuz yeni varsayılır.\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables Atanmamış bir değişkene bağıntı yapıldığında\n" +" uyarır.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "dosyaismi olarak boş dizge geçersiz" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "Hata ayıklama düzeyi özelliği `%s' bilinmiyor" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s: Kesinti/Olağandışı durum saptandı (kod = 0x%lx, adres = 0x%lx)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"program %s tarafından elde edilmemiş olağandışı-durum süzgeci çağrıldı\n" +"OlağandışılıkKodu = %lx\n" +"OlağandışılıkBayrakları = %lx\n" +"OlağandışılıkAdresi = %lx\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Erişim uyumsuzluğu: %lx adresinde yazma işlemi\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Erişim uyumsuzluğu: %lx adresinde okuma işlemi\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell default_shell = %s olarak belirliyor\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"find_and_set_shell yol aramasını default_shell = %s olarak belirliyor\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s 30 saniyeliğine askıya alınıyor..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "sleep(30) bitti. Devam ediliyor.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Makefile standart girdiden iki kez belirtildi." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (geçici dosya)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (geçici dosya)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Bu platformda paralel işler (-j) desteklenmiyor." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Tek iş kipi (-j1) için make'i başlatma konumuna alıyor" + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "içsel hata: çok sayıda --jobserver-fds seçeneği" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "içsel hata: --jobserver-fds dizgesi `%s' geçersiz" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "uyarı: alt derlemede -jN zorlandı: iş sunucusu kipi kapatılıyor." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "çift iş sunucusu" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"uyarı: iş sunucusu kullanımdışı: -j1 kullanılıyor. Üst make kuralına `+' " +"ekle." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "işleri yaratıyor" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "işleri hazırlıyor" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "Sembolik bağlar desteklenmiyor: -L iptal ediliyor" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "makefile'ları güncelliyor...\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "`%s' make dosyası çevrime girdi; yeniden derlenemez.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "`%s' make dosyası yeniden derlenemiyor." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "İçerilen make dosyası `%s' bulunamadı." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "`%s' make dosyası bulunamadı" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Geriye, özgün dizine geçilemiyor." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Yeniden çalıştırılıyor[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (geçici dosya): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL bir hedeften fazlasını içeriyor" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "Hedefler belirtilmediğinden make dosyası yok" + +#: main.c:2272 +msgid "No targets" +msgstr "Hedef yok" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Amaçlanan hedefler güncelleniyor...\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "uyarı: Clock skew saptandı. Derleme tamamlanamayabilir." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Kullanım: %s [seçenekler] [hedef] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"Bu program %s için kurgulanmış\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"Bu program %s için kurgulanmış (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "" +"Yazılım hatalarını adresine,\n" +"çeviri hatalarını adresine bildiriniz.\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "`-%c' seçeneği bir boş olmayan dizge argüman gerektirir" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "`-%c' seçeneği bir pozitif tümleyici bağımsız değişkenle kullanılır" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sBu program %s için derlenmiş\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sBu program %s için derlenmiş (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# Make veri tabanı, %s üzerine basıldı" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# %s üzerindeki Make veri tabanı tamamlandı\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: bilinmeyen bir dizine giriliyor\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: bilinmeyen dizinden çıkılıyor\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: `%s' dizine giriliyor\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: `%s' dizininden çıkılıyor\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Bilinmeyen bir dizine giriliyor\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Bilinmeyen dizinden çıkılıyor\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]:`%s' dizinine giriliyor\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: `%s' dizininden çıkılıyor\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Durdu.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Bilinmeyen hata %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "sanal bellek tükendi" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: kullanıcı %lu (gerçekte %lu), grup %lu (gerçekte %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Ä°lklendirilmiş erişim" + +#: misc.c:808 +msgid "User access" +msgstr "Kullanıcı erişimi" + +#: misc.c:856 +msgid "Make access" +msgstr "Make erişimi" + +#: misc.c:890 +msgid "Child access" +msgstr "Asta erişim" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "yazma hatası: %s" + +#: misc.c:956 +msgid "write error" +msgstr "yazma hatası" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Makefile'lar okunuyor...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "`%s' make dosyası okunuyor" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (öntanımlı amaç yok)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (arama yolu)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (umurunda değil)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr "( ~ uzantısı yok)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "şartlı ifade de yazılış hatası" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "komutlar ilk hedeften önce başlıyor" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "komutlardan önceki kural kayıp" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "kayıp ayraç%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr "(8 boşluğu TAB'mı zannettiniz?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "hedef kalıp kayıp" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "çok sayıda hedef kalıp" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "hedef kalıp `%%' içermiyor" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "`endif' kayıp" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "boş değişken ismi" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "`endef' yönergesinden sonraki metin yersiz" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "`endef' kayıp, `define' sonlandırılmamış" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "`endef' yönergesinden sonraki metin yersiz" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "`%s' yönergesinden sonraki metin yersiz" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "`%s' yersiz" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "her şartlı ifade de sadece bir `else'" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Hedefe özgü değişken tanımı bozuk" + +#: read.c:1855 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "öngereksinimler komut betiklerinde tanımlanamaz" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "örtük ve durağan kalıp kuralları karışmış" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "örtük ve normal kurallar karışmış" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "hedef `%s' hedef kalıpla eşleşmiyor" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "hedef dosya `%s'hem : hem de :: girdilerine sahip" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "hedef `%s' aynı kuralda birden fazla belirtilmiş." + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "uyarı: hedef `%s' için komutlar geçersiz kılınıyor" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "uyarı: hedef `%s' için eski komutlar yoksayılıyor" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "uyarı: NUL karakteri görüldü; satırın geri kalanı yoksayılıyor" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "`%s' için hiçbir şey yapılmadı." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "`%s' güncel" + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Budanmış dosya `%s'.\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sHedef `%s' i derlemek için hiçbir kural yok%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "" +"%sHedef `%s' i derlemek için hiçbir kural yok, `%s' tarafından gereksinim " +"duyuluyor%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "hedef dosya `%s' hesaba katılıyor.\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "En son `%s'dosyasının güncellenmesi denendi ve başarısız oldu.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "`%s' dosyası zaten hesaba katıldı.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "`%s' dosyası hala güncelleniyor.\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "`%s' dosyasının güncellenmesi tamamlandı.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "`%s' dosyası yok.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Uyarı: .LOW_RESOLUTION_TIME dosyası `%s' yüksek çözünürlüklü bir zaman " +"damgası içeriyor" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "`%s' için bir örtük kural bulundu.\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "`%s' için bir örtük kural yok.\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "`%s' için öntanımlı komutlar kullanılıyor.\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Çevrimsel %s <- %s bağımlılığı iptal edildi." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "`%s' hedef dosyasının önceden gereklilikleri tamamlandı.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "`%s' için önceden gereklilikler derlenmeye devam ediyor.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "`%s' hedef dosyasında umut kesiliyor.\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Hedef `%s' hatalardan dolayı yeniden derlenemez." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "Önceden gerekli `%s' hedef `%s' için şart.\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Hedef `%s' in önceden gereklisi `%s' mevcut değil.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Önceden gerekli `%s' hedef `%s' den daha yeni.\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Önceden gerekli `%s' hedef `%s' den daha eski.\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "Hedef `%s' çift-sütunlu ve önceden gereklilikler gerektirmiyor.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "`%s' için komutlar ve önceden gerekliliklerde bir değişiklik yok.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Daima derle seçeneğinden dolayı `%s' derleniyor.\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Hedef `%s' nin yeniden derlenmesine gerek yok" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; VPATH ismi `%s' kullanılıyor" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Hedef `%s' yeniden derlenmeli.\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " VPATH ismi `%s' yoksayılıyor.\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "`%s' nin komutları çalışmaya devam ediyor.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Hedef dosya `%s' yeniden derlenirken hata oluştu.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Hedef dosya `%s' yeniden derlenmesi başarıyla tamamlandı.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "`%s' hedef dosyasının -q ile yeniden derlenmesi gerekir.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "`%s' için öntanımlı komutlar kullanılıyor.\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Uyarı: `%s' dosyası gelecekteki bir değişiklik tarihini içeriyor" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Uyarı: `%s' dosyasının değişiklik tarihi %.2g s kadar gelecekte" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNS elemanı `%s' bir kalıp değil" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Özelleştirilmiş olanlar dışarı aktarılmayacak: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Örtük Kurallar" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Örtük kural yok." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u örtük kural, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " terminal." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "YAZILIM HATASI: num_pattern_rules yanlış! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "bilinmeyen sinyal" + +#: signame.c:94 +msgid "Hangup" +msgstr "Tıkanma" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Kesme" + +#: signame.c:100 +msgid "Quit" +msgstr "Çık" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Yönergeler uygun değil" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Ä°zleme/kesmenoktası yakalayıcı" + +#: signame.c:111 +msgid "Aborted" +msgstr "Ä°ptal edildi" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT tuzağı" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT tuzağı" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Gerçek sayı olağandışı durumu" + +#: signame.c:123 +msgid "Killed" +msgstr "Süreç durduruldu" + +#: signame.c:126 +msgid "Bus error" +msgstr "Veri yolu hatası" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Parçalama arızası" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Sistem çağrısı hatalı" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Veri alınamıyor" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Alarm saati" + +#: signame.c:141 +msgid "Terminated" +msgstr "Sonlandırıldı" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Kullanıcı tanımlı sinyal 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Kullanıcı tanımlı sinyal 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Ast bıraktı" + +#: signame.c:158 +msgid "Power failure" +msgstr "Güç kesilmesi" + +#: signame.c:161 +msgid "Stopped" +msgstr "Durduruldu" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Durduruldu (konsol girdisi)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Durduruldu (konsol çıktısı)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Durduruldu (sinyal)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "CPU zaman sınırı aşıldı" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Dosya uzunluğu sınırı aşıldı" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Sanal süreölçer kullanım süresi doldu" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Tanıtım süreölçer kullanım süresi doldu" + +#: signame.c:188 +msgid "Window changed" +msgstr "Pencere boyutları değiştirildi" + +#: signame.c:191 +msgid "Continued" +msgstr "Devam ediliyor" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Acil G/Ç koşulu" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "G/Ç mümkün" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Kaynak kaybı" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Tehlike sinyali" + +#: signame.c:219 +msgid "Information request" +msgstr "Bilgi isteği" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Aritmetik işlemci kullanılabilir değil" + +#: strcache.c:235 +#, fuzzy, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s dizge belleğindeki dizgelerin sayısı: %d\n" + +#: strcache.c:237 +#, fuzzy, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s dizge belleği tamponlarının sayısı: %d\n" + +#: strcache.c:239 +#, fuzzy, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s dizge belleği boyu: toplam = %d / max = %d / min = %d / ort = %d\n" + +#: strcache.c:241 +#, fuzzy, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s dizge belleği boş: toplam = %d / max = %d / min = %d / ort = %d\n" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# dosyaların hash tablosu durumları:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "öntanımlı" + +#: variable.c:1544 +msgid "environment" +msgstr "çevre" + +#: variable.c:1547 +msgid "makefile" +msgstr "derleme dosyası" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "çevre -e altında" + +#: variable.c:1553 +msgid "command line" +msgstr "komut satırı" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "`override' yönergesi" + +#: variable.c:1559 +msgid "automatic" +msgstr "otomatik" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (`%s'den, satır %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# değişken kümesi hash tablosunun durumu:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Değişkenler\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Kalıba özgü Değişken Değerleri" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Örneğe duyarlı değişken değeri yok." + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u örneğe duyarlı değişken değeri" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "uyarı: `%.*s' değişkeni atanmamış" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search %d ile başarısız\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Uyarı: Boş yönlendirme\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "içsel hata: `%s' command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"-uyarı, DCL den yönetimi almak için CTRL-Y'yi yeniden " +"etkinleştirebilirsiniz.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "OLUŞUMİÇİ [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "OLUŞUMİÇİ CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "OLUŞUMİÇİ RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Oluşumiçi komut '%s' bilinmiyor\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Hata, boş komut\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "%s den yönlendirilmiş girdi\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "%s e yönlendirilmiş hata\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "%s e yönlendirilmiş çıktı\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "%s e yönlendirilmiş çıktı\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "%s yerine çalıştırılıyor\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "doğum hatası, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH Arama yolu\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# `vpath' arama yolları yok" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u `vpath' arama yolu.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Genel arama yolu (`VPATH' çevre değişkeni) yok." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Genel (`VPATH' çevre değişkeni) arama yolu:\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "Süreci başlatmada process_easy() başarısız oldu (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sBu bir serbest yazılımdır; kopyalama koşulları için kaynak koduna " +#~ "bakınız.\n" +#~ "%sHiçbir garantisi yoktur; hatta SATILABÄ°LÄ°RLİĞİ veya ŞAHSÄ° " +#~ "KULLANIMINIZA\n" +#~ "%sUYGUNLUĞU için bile garanti verilmez.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "yersiz `endef'" + +#~ msgid "empty `override' directive" +#~ msgstr "boş `override' yönergesi" + +#~ msgid "invalid `override' directive" +#~ msgstr "`override' yönergesi geçersiz" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-uyarı, CTRL-Y etraftaki alt-süreç(ler)i bıraktıracak.\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "Dosyada hala yazılış hatası var: '\"'\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "SIGCHLD sinyali alındı; %u sağlanmamış ast dosya.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "sh.exe yoksa -j veya --jobs belirtilemez." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Tek iş kipi için make'i başlatma konumuna alıyor" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "`%sinclude' için dosyaismi yok" + +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "hedef `%s' önceden gereklilik kalıbını boş bırakıyor" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# Dosyalar yok." + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u dosya %u hash kümesinde.\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# her tabloda ortalama %.3f dosya, bir tabloda en çok %u dosya.\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DÄ°ZÄ°N" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "Hiç bir şey yapmadan DÄ°ZÄ°Ne geçer" + +#~ msgid "FLAGS" +#~ msgstr "BAYRAKLAR" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "Bir hata ayıklayıcı eklemeye izin vermek için süreci askıya alır" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "Çevre değişkenleri makefile'ları geçersiz kılıyor" + +#~ msgid "FILE" +#~ msgstr "DOSYA" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "DOSYAyı bir makefile olarak okur" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "İçerilmiş makefile'lar için DÄ°ZÄ°Ni araştırır" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "Yük N'in altında olmadıkça işler başlatılmaz" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "Genellikle hiçbir komut çalıştırılmaz; onları basar" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "DOSYAnın çok eski olduğunu hesaba katarak yeniden derlemez." + +#~ msgid "Don't echo commands" +#~ msgstr "Komutları ekolamaz" + +#~ msgid "Turns off -k" +#~ msgstr "-k 'yı kapatır" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "DOSYAnın ne kadar yeni olduğundaki belirsizliği hesaba katar." + +#~ msgid "Entering" +#~ msgstr " Dizine girdi:" + +#~ msgid "Leaving" +#~ msgstr "Dizini bıraktı:" + +#~ msgid "# No variables." +#~ msgstr "# Değişkenker yok" + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# her tabloda %.1f değişken ortalaması, bir tabloda en çok %u\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# her tabloda %d.%d değişken ortalaması, bir tabloda en çok %u\n" diff --git a/po/uk.gmo b/po/uk.gmo new file mode 100644 index 0000000..e24a088 Binary files /dev/null and b/po/uk.gmo differ diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..ebf1fd6 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,2163 @@ +# ðÅÒÅËÌÁÄ make ÎÁ ÕËÒÁ§ÎÓØËÕ. +# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +# Volodymyr M. Lisivka , 2001-2002. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.80\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2002-12-05 20:07+0200\n" +"Last-Translator: Volodymyr M. Lisivka \n" +"Language-Team: Ukrainian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=koi8-u\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "ÓÐÒÏÂÁ ×ÖÉÔÉ ÍÏÖÌÉצÓÔØ, ÑËÁ ΊЦÄÔÒÉÍÕ¤ÔØÓÑ: \"%s\"" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "ÏÎÏ×ÌÅÎÎÑ ÞÁÓÕ ÚͦÎÉ ÞÌÅÎÁ ÁÒȦ×Õ ÎÅÍÏÖÌÉ×Ï Õ ÓÉÓÔÅͦ VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "ÏÎÏ×ÌÅÎÎÑ ÞÁÓÕ ÚͦÎÉ: áÒÈ¦× \"%s\" ÎÅ ¦ÓÎÕ¤" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "ÏÎÏ×ÌÅÎÎÑ ÞÁÓÕ ÚͦÎÉ: îÅצÒÎÉÊ ÁÒȦ×: \"%s\"" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "ÏÎÏ×ÌÅÎÎÑ ÞÁÓÕ ÚͦÎÉ: þÌÅÎ \"%s\" ΊͦÓÔÉÔØÓÑ Õ \"%s\"" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "" +"ÏÎÏ×ÌÅÎÎÑ ÞÁÓÕ ÚͦÎÉ: æÕÎËÃ¦Ñ ar_member_touch ÐÏ×ÅÒÎÕÌÁ\n" +"ÐÏÇÁÎÉÊ ËÏÄ ×¦ÄÐÏצĦ ÄÌÑ \"%s\"" + +#: arscan.c:69 +#, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "" + +#: arscan.c:175 +#, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "" + +#: arscan.c:187 +#, fuzzy, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "ðÏÍÉÌËÁ צÄËÒÉ×ÁÎÎÑ Â¦Â̦ÏÔÅËÉ %s ÄÌÑ ÐÏÛÕËÕ ÞÌÅÎÁ %s; %d\n" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (¦Í'Ñ ÍÏÖÅ ÂÕÔÉ ÕÓ¦ÞÅÎÅ)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " äÁÔÁ %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr "" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] ÷ÉÄÁÌÅÎÎÑ ÆÁÊÌÕ \"%s\"" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** ÷ÉÄÁÌÅÎÎÑ ÆÁÊÌÕ \"%s\"" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# ËÏÍÁÎÄÉ ÄÏ ×ÉËÏÎÁÎÎÑ" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (×ÂÕÄÏ×ÁÎÅ):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (Ú \"%s\", ÒÑÄÏË %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# ëÁÔÁÌÏÇÉ\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: ÎÅÍÏÖÌÉ×Ï ÏÔÒÉÍÁÔÉ ¦ÎÆÏÒÍÁæÀ (stat).\n" + +#: dir.c:1012 +#, fuzzy, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (ÐÒÉÓÔÒ¦Ê %d, ¦×ÕÚÏÌ %d): ÎÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (ÐÒÉÓÔÒ¦Ê %d, ¦×ÕÚÏÌ [%d,%d,%d]): ÎÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ.\n" + +#: dir.c:1021 +#, fuzzy, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (ÐÒÉÓÔÒ¦Ê %d, ¦×ÕÚÏÌ %d): ÎÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (ËÌÀÞ %s, ÞÁÓ ÍÏÄÉƦËÁæ§ %d): " + +#: dir.c:1052 +#, fuzzy, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (ÐÒÉÓÔÒ¦Ê %d, ¦×ÕÚÏÌ [%d,%d,%d]): ÎÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ.\n" + +#: dir.c:1057 +#, fuzzy, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (ÐÒÉÓÔÒ¦Ê %d, ¦×ÕÚÏÌ %d): ÎÅÍÏÖÌÉ×Ï ×¦ÄËÒÉÔÉ.\n" + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "î¦" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " ÆÁÊ̦×, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "Φ" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " ÎÅÄÏÓÑÖÎÉÈ Ã¦ÌÅÊ" + +#: dir.c:1075 +msgid " so far." +msgstr " ÎÁ ÐÏÔÏÞÎÉÊ ÍÏÍÅÎÔ." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " ÎÅÄÏÓÑÖÎÉÈ Ã¦ÌÅÊ Õ %lu ËÁÔÁÌÏÇÁÈ.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "òÅËÕÒÓÉ×ÎÁ ÚͦÎÎÁ \"%s\" ÐÏÓÉÌÁ¤ÔØÓÑ ÓÁÍÁ ÎÁ ÓÅÂÅ (Õ ÒÅÚÕÌØÔÁÔ¦)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "ÎÅÚÁ×ÅÒÛÅÎÁ ÐÏÓÉÌÁÎÎÑ ÎÁ ÚͦÎÎÕ" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "ëÏÍÁÎÄÉ ÄÌÑ ÆÁÊÌÕ \"%s\" ÂÕÌÉ ÚÁÄÁΦ %s:%u," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "ëÏÍÁÎÄÉ ÄÌÑ ÆÁÊÌÕ \"%s\" ÂÕÌÉ ÚÎÁÊÄÅΦ Ú ÎÅÑ×ÎÏÇÏ ÐÒÁ×ÉÌÁ," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "ÁÌÅ \"%s\" ¦ \"%s\" ÔÅÐÅÒ ××ÁÖÁÀÔØÓÑ ÏÄÎÉÍ ¦ ÔÉÍ ÖÅ Ö ÆÁÊÌÏÍ. " + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "ëÏÍÁÎÄÉ ÄÌÑ \"%s\" ¦ÇÎÏÒÏ×ÁΦ, ÂÕÄÕÔØ ×ÉËÏÒÉÓÔÁΦ ËÏÍÁÎÄÉ ÄÌÑ \"%s\"." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" +"ÎÅÍÏÖÌÉ×Ï ÐÅÒÅÊÍÅÎÕ×ÁÔÉ \"%s\" Ú ÏÄΦ¤À Ä×ÏËÒÁÐËÏÀ Õ \"%s\" Ú Ä×ÏÍÁ " +"Ä×ÏËÒÁÐËÁÍÉ" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" +"ÎÅÍÏÖÌÉ×Ï ÐÅÒÅÊÍÅÎÕ×ÁÔÉ \"%s\" Ú Ä×ÏÍÁ Ä×ÏËÒÁÐËÁÍÉ Õ \"%s\" Ú ÏÄΦ¤À " +"Ä×ÏËÒÁÐËÏÀ" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** ÷ÉÄÁÌÅÎÎÑ ÐÒÏͦÖÎÏÇÏ ÆÁÊÌÕ \"%s\"" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "÷ÉÄÁÌÑÀ ÐÒÏͦÖΦ ÆÁÊÌÉ...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "" + +#: file.c:804 +msgid "Current time" +msgstr "" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# îÅ ¤ ÍÅÔÏÀ:" + +#: file.c:929 +#, fuzzy +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# ëÏÛÔÏ×ÎÉÊ ÆÁÊÌ (ÚÁÌÅÖΦÓÔØ .PRECIOUS)." + +#: file.c:931 +#, fuzzy +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# ðÓÅ×ÄÏæÌØ (ÚÁÌÅÖΦÓÔØ ×¦Ä .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# ã¦ÌØ ËÏÍÁÎÄÎÏÇÏ ÒÑÄËÁ." + +#: file.c:935 +#, fuzzy +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# Makefile ÚÁ ÚÁÍÏ×ÞÕ×ÁÎÎÑÍ ÁÂÏ Ú MAKEFILES." + +#: file.c:937 +#, fuzzy +msgid "# Implicit rule search has been done." +msgstr "# ðÏÛÕË ÎÅÑ×ÎÉÈ ÐÒÁ×ÉÌ%s ÚÁ×ÅÒÛÉ×ÓÑ.\n" + +#: file.c:938 +#, fuzzy +msgid "# Implicit rule search has not been done." +msgstr "# ðÏÛÕË ÎÅÑ×ÎÉÈ ÐÒÁ×ÉÌ%s ÚÁ×ÅÒÛÉ×ÓÑ.\n" + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# ïÓÎÏ×Á ÎÅÑ×ÎÏÇÏ ÁÂÏ ÓÔÁÔÉÞÎÏÇÏ ÛÁÂÌÏÎÕ: \"%s\"\n" + +#: file.c:942 +#, fuzzy +msgid "# File is an intermediate prerequisite." +msgstr "# æÁÊÌ -- ÐÒÏͦÖÎÁ ÚÁÌÅÖΦÓÔØ." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# úÂÉÒÁ¤ ÔÁËÏÖ:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# þÁÓ ÚͦÎÉ Î¦ËÏÌÉ ÎÅ ÐÅÒÅצÒÑ×ÓÑ." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# æÁÊÌ ÎÅ ¦ÓÎÕ¤." + +#: file.c:956 +msgid "# File is very old." +msgstr "# æÁÊÌ ÄÕÖÅ ÓÔÁÒÉÊ." + +#: file.c:961 +#, fuzzy, c-format +msgid "# Last modified %s\n" +msgstr "# þÁÓ ÏÓÔÁÎÎØϧ ÚͦÎÉ %.24s (%ld)\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# æÁÊÌ ÂÕ× ÏÎÏ×ÌÅÎÉÊ." + +#: file.c:964 +#, fuzzy +msgid "# File has not been updated." +msgstr "# æÁÊÌ%s ÏÎÏ×ÌÅÎÏ.\n" + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# úÁÐÕÝÅΦ ÚÁÒÁÚ ËÏÍÁÎÄÉ (ãå ðïíéìëá)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# úÁÐÕÝÅΦ ÚÁÒÁÚ ËÏÍÁÎÄÉ ÄÅÑËϧ ÚÁÌÅÖÎÏÓÔ¦ (ãå ðïíéìëá)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# õÓЦÛÎÏ ÏÎÏ×ÌÅÎÏ." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# ðÏ×ÉÎÎÏ ÂÕÔÉ ÏÎÏ×ÌÅÎÏ (×ÓÔÁÎÏ×ÌÅÎÉÊ ËÌÀÞ -q)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# óÐÒÏÂÁ ÏÎÏ×ÌÅÎÎÑ ÂÅÚÕÓЦÛÎÁ." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# îÅצÒÎÅ ÚÎÁÞÅÎÎÑ ÞÌÅÎÁ \"update_status\"!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# îÅצÒÎÅ ÚÎÁÞÅÎÎÑ ÞÌÅÎÁ \"command_state\"!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# æÁÊÌÉ" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "ÎÅ ÞÉÓÌÏ×ÉÊ ÐÅÒÛÉÊ ÁÒÇÕÍÅÎÔ ÄÌÑ ÆÕÎËæ§ \"word\"" + +#: function.c:763 +#, fuzzy +msgid "first argument to `word' function must be greater than 0" +msgstr "ÎÅ ÞÉÓÌÏ×ÉÊ ÐÅÒÛÉÊ ÁÒÇÕÍÅÎÔ ÄÌÑ ÆÕÎËæ§ \"word\"" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "ÎÅ ÞÉÓÌÏ×ÉÊ ÐÅÒÛÉÊ ÁÒÇÕÍÅÎÔ ÄÌÑ ÆÕÎËæ§ \"wordlist\"" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "ÎÅ ÞÉÓÌÏ×ÉÊ ÄÒÕÇÉÊ ÁÒÇÕÍÅÎÔ ÄÌÑ ÆÕÎËæ§ \"wordlist\"" + +#: function.c:1458 +#, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "" + +#: function.c:1469 +#, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "" + +#: function.c:1479 +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "" + +#: function.c:2150 +#, fuzzy, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "ÎÅ ÞÉÓÌÏ×ÉÊ ÐÅÒÛÉÊ ÁÒÇÕÍÅÎÔ ÄÌÑ ÆÕÎËæ§ \"word\"" + +#: function.c:2162 +#, fuzzy, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "îÅ ÒÅÁ̦ÚÏ×ÁÎÏ ÎÁ Ã¦Ê ÐÌÁÔÆÏÒͦ: ÆÕÎËÃ¦Ñ \"%s\"" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "ÎÅÚÁ×ÅÒÛÅÎÉÊ ×ÉËÌÉË ÆÕÎËæ§ \"%s\"; ÐÒÏÐÕÝÅÎÏ \"%c\"" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: ÐÁÒÁÍÅÔÒ \"%s\" - ÎÅÏÄÎÏÚÎÁÞÎÉÊ\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: ÐÁÒÁÍÅÔÒ \"--%s\" ÎÅ ÍÏÖÅ ÍÁÔÉ ÁÒÇÕÍÅÎÔ¦×\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: ÐÁÒÁÍÅÔÒ \"%c%s\" ÎÅ ÍÏÖÅ ÍÁÔÉ ÁÒÇÕÍÅÎÔ¦×\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: ÐÁÒÁÍÅÔÒÕ \"%s\" ÎÅÏÂȦÄÎÉÊ ÁÒÇÕÍÅÎÔ\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ÎÅ ÒÏÚЦÚÎÁÎÉÊ ÐÁÒÁÍÅÔÒ \"--%s\"\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ÎÅ ÒÏÚЦÚÎÁÎÉÊ ÐÁÒÁÍÅÔÒ \"%c%s\"\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ÎÅצÒÎÉÊ ÐÁÒÁÍÅÔÒ -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ÎÅצÒÎÉÊ ÐÁÒÁÍÅÔÒ -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ÐÁÒÁÍÅÔÒÕ ÎÅÏÂȦÄÎÉÊ ÁÒÇÕÍÅÎÔ -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: ÐÁÒÁÍÅÔÒ \"-W %s\" ÎÅÏÄÎÏÚÎÁÞÎÉÊ\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: ÐÁÒÁÍÅÔÒ \"-W %s\" ÎÅ ÍÏÖÅ ÍÁÔÉ ÁÒÇÕÍÅÎÔ¦×\n" + +#: hash.c:49 +#, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "" + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "" + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "ðÏÛÕË ÎÅÑ×ÎÏÇÏ ÐÒÁ×ÉÌÁ ÄÌÑ \"%s\".\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "ðÏÛÕË ÎÅÑ×ÎÏÇÏ ÐÒÁ×ÉÌÁ ÄÌÑ ÞÌÅÎÁ ÁÒȦ×Õ \"%s\".\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "úÁÐϦÇÁÎÎÑ ÒÅËÕÒÓÉ×ÎÏÇÏ ×ÉËÌÉËÕ ÎÅÑ×ÎÏÇÏ ÐÒÁ×ÉÌÁ.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "óÐÒÏÂÁ ÚÁÓÔÏÓÕ×ÁÎÎÑ ÐÒÁ×ÉÌÁ Ú¦ ÚÒÁÚËÏÍ, ÏÓÎÏ×Á \"%.*s\".\n" + +#: implicit.c:674 +#, fuzzy, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "÷¦ÄËÉÄÁÎÎÑ ÎÅÍÏÖÌÉ×ϧ %s ÚÁÌÅÖÎÏÓÔ¦ \"%s\".\n" + +#: implicit.c:675 +#, fuzzy, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "÷¦ÄËÉÄÁÎÎÑ ÎÅÍÏÖÌÉ×ϧ %s ÚÁÌÅÖÎÏÓÔ¦ \"%s\".\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "ðÒÏÂÕÀ ÚÁÌÅÖΦÓÔØ ÐÒÁ×ÉÌÏ \"%s\".\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "ðÒÏÂÕÀ ÎÅÑ×Φ ÚÁÌÅÖÎÏÓÔ¦ \"%s\".\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "ðÏÛÕË ÐÒÁ×ÉÌÁ Ú ÐÒÏͦÖÎÉÍ ÆÁÊÌÏÍ \"%s\".\n" + +#: job.c:335 +#, fuzzy +msgid "Cannot create a temporary file\n" +msgstr "fwrite (ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ)" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "[%s] ðÏÍÉÌËÁ 0x%x (ÐÒϦÇÎÏÒÏ×ÁÎÁ)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] ðÏÍÉÌËÁ 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] ðÏÍÉÌËÁ %d (¦ÇÎÏÒÏ×ÁÎÁ)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] ðÏÍÉÌËÁ %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (ÚÒÏÂÌÅÎÉÊ ÄÁÍÐ ÐÁÍ'ÑÔ¦)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** ïÞ¦ËÕ×ÁÎÎÑ ÚÁ×ÅÒÛÅÎÎÑ ÚÁ×ÄÁÎØ..." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "îÅÚÁ×ÅÒÛÅÎÉÊ ÎÁÝÁÄÏË 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (צÄÄÁÌÅÎÉÊ)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "ïÂÒÏÂËÁ ÒÅÚÕÌØÔÁÔ¦× %s ÐÒÁæ ÎÁÝÁÄËÁ 0x%08lx PID %d%s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "ïÂÒÏÂËÁ ÒÅÚÕÌØÔÁÔ¦× %s ÐÒÁæ ÎÁÝÁÄËÁ 0x%08lx PID %d%s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "úÎÉÝÅÎÎÑ ÔÉÍÞÁÓÏ×ÏÇÏ ËÏÍÁÎÄÎÏÇÏ ÆÁÊÌÕ %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "÷ÉÄÁÌÅÎÎÑ ÎÁÝÁÄËÁ 0x%08lx PID %d%s Ú ÌÁÎÃÀÖËÁ ÁËÔÉ×ÎÉÈ ÎÁÝÁÄ˦×.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "ïÂÒÏÂËÁ ÒÅÚÕÌØÔÁÔ¦× %s ÐÒÁæ ÎÁÝÁÄËÁ 0x%08lx PID %d%s\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "÷ÓÔÁ×ÌÑÀ ÎÁÝÁÄËÁ 0x%08lx PID %d%s Õ ÌÁÎÃÀÖÏË ÁËÔÉ×ÎÉÈ ÎÁÝÁÄ˦×.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "ïÂÒÏÂËÁ ÒÅÚÕÌØÔÁÔ¦× %s ÐÒÁæ ÎÁÝÁÄËÁ 0x%08lx PID %d%s\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "îÅÍÁ ÎÅÏÂȦÄÎÏÓÔ¦ ÐÅÒÅÚÂÉÒÁÔÉ Ã¦ÌØ \"%s\".\n" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "" +"ÃÑ ÏÐÅÒÁæÊÎÁ ÓÉÓÔÅÍÁ ÎÅ ÄÏÚ×ÏÌѤ ×ÓÔÁÎÏ×ÌÀ×ÁÔÉ ÏÂÍÅÖÅÎÎÑ ÎÁ ÚÁ×ÁÎÔÁÖÅÎÎÑ" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "ÎÅÍÏÖÌÉ×Ï ×ÓÔÁÎÏ×ÉÔÉ ÏÂÍÅÖÅÎÎÑ ÎÁ ÚÁ×ÁÎÔÁÖÅÎÎÑ: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "" + +#: job.c:2127 +#, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: ëÏÍÁÎÄÁ ÎÅ ÚÎÁÊÄÅÎÁ" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: ëÏÍÁÎÄÎÉÊ ÐÒÏÃÅÓÏÒ ÎÅ ÚÎÁÊÄÅÎÉÊ" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "" + +#: job.c:2461 +#, fuzzy, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL ÚͦÎÅÎÏ (ÂÕÌÏ \"%s\", ÔÅÐÅÒ \"%s\")" + +#: job.c:2951 +#, fuzzy, c-format +msgid "Creating temporary batch file %s\n" +msgstr "fopen (ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ)" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (ÒÑÄÏË %d) ðÏÇÁÎÉÊ ËÏÎÔÅËÓÔ ÏÂÏÌÎÉË (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "ëÌÀÞ¦:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr "" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr "" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr "" + +#: main.c:325 +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr "" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" + +#: main.c:339 +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "îÅ ×ÉËÏÎÕ×ÁÔÉ ËÏÍÁÎÄÉ, ËÏÄ ÚÁ×ÅÒÛÅÎÎÑ ÐÏËÁÖÅ ÞÉ ÏÎÏ×ÌÅÎÏ" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" + +#: main.c:353 +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr "" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "ÐÏÒÏÖÎ¦Ê ÒÑÄÏË ÎÅÐÒÉÐÕÓÔÉÍÉÊ Õ ÑËÏÓÔ¦ ¦ÍÅΦ ÆÁÊÌÕ" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "" + +#: main.c:690 +#, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" + +#: main.c:697 +#, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" + +#: main.c:705 +#, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "" + +#: main.c:706 +#, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "" + +#: main.c:781 main.c:792 +#, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" + +#: main.c:834 +#, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "" + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "" + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "" + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "" + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" + +#: main.c:1750 +msgid "dup jobserver" +msgstr "" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "ïÎÏ×ÌÅÎÎÑ make-ÆÁÊ̦×...\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Make-ÆÁÊÌ \"%s\", ÍÏÖÌÉ×Ï, ÚÁÃÉËÌÅÎÉÊ, צΠÎÅ ÐÅÒÅÚÂÉÒÁÔÉÍÅÔØÓÑ.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "óÐÒÏÂÁ ÐÅÒÅÚ¦ÂÒÁÔÉ make-ÆÁÊÌ \"%s\" ÂÅÚÕÓЦÛÎÁ." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Make-ÆÁÊÌ \"%s\", ÑËÉÊ ×ËÌÀÞÁ¤ÔØÓÑ, ÎÅ ÂÕÌÏ ÚÎÁÊÄÅÎÏ." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Make-ÆÁÊÌ \"%s\" ÎÅ ÂÕÌÏ ÚÎÁÊÄÅÎÏ" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "îÅÍÏÖÌÉ×Ï ÐÅÒÅÊÔÉ Õ ÐÅÒצÓÎÉÊ ËÁÔÁÌÏÇ." + +#: main.c:2102 +#, fuzzy, c-format +msgid "Re-executing[%u]:" +msgstr "ðÏ×ÔÏÒÎÅ ×ÉËÏÎÁÎÎÑ:" + +#: main.c:2215 +#, fuzzy +msgid "unlink (temporary file): " +msgstr "fopen (ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ)" + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "îÅ ÚÁÄÁΦ æ̦ ¦ ÎÅ ÚÎÁÊÄÅÎÉÊ make-ÆÁÊÌ" + +#: main.c:2272 +msgid "No targets" +msgstr "îÅÍÁ æÌÅÊ" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "ïÎÏ×ÌÅÎÎÑ Ã¦ÌÅÊ ÍÅÔÉ...\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "÷ÉËÏÒÉÓÔÁÎÎÑ: %s [ëìàþ¶]... [ã¶ìø]...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "ðÏצÄÏÍÌÀÊÔÅ ÐÒÏ ÐÏÍÉÌËÉ ÄÏ \n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "ËÌÀÞ \"-%c\" ÐÏ×ÉÎÅÎ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉÓÑ Ú Ã¦ÌÉÍ ÐÏÚÉÔÉ×ÎÉÍ ÁÒÇÕÍÅÎÔÏÍ" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "ËÌÀÞ \"-%c\" ÐÏ×ÉÎÅÎ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉÓÑ Ú Ã¦ÌÉÍ ÐÏÚÉÔÉ×ÎÉÍ ÁÒÇÕÍÅÎÔÏÍ" + +#: main.c:3054 +#, c-format +msgid "%sBuilt for %s\n" +msgstr "" + +#: main.c:3056 +#, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# âÁÚÁ ÄÁÎÉÈ Make, ÎÁÄÒÕËÏ×ÁÎÁ %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# äÒÕË ÂÁÚÉ ÄÁÎÉÈ Make ÚÁ×ÅÒÛÅÎÏ %s\n" + +#: main.c:3237 +#, fuzzy, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: ÷ÈÏÖÕ Õ ÎÅצÄÏÍÉÊ ËÁÔÁÌÏÇ" + +#: main.c:3239 +#, fuzzy, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: úÁÌÉÛÁÀ ÎÅצÄÏÍÉÊ ËÁÔÁÌÏÇ" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: ÷ÈÏÖÕ Õ ËÁÔÁÌÏÇ \"%s\"\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: úÁÌÉÛÁÀ ËÁÔÁÌÏÇ \"%s\"\n" + +#: main.c:3250 +#, fuzzy, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: ÷ÈÏÖÕ Õ ÎÅצÄÏÍÉÊ ËÁÔÁÌÏÇ " + +#: main.c:3253 +#, fuzzy, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: úÁÌÉÛÁÀ ÎÅצÄÏÍÉÊ ËÁÔÁÌÏÇ" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: ÷ÈÏÖÕ Õ ËÁÔÁÌÏÇ \"%s\"\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: úÁÌÉÛÁÀ ËÁÔÁÌÏÇ \"%s\"\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". úÕÐÉÎËÁ.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "îÅצÄÏÍÁ ÐÏÍÉÌËÁ %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "צÒÔÕÁÌØÎÁ ÐÁÍ'ÑÔØ ×ÉÞÅÒÐÁÎÁ" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "" + +#: misc.c:729 +msgid "Initialized access" +msgstr "" + +#: misc.c:808 +msgid "User access" +msgstr "äÏÓÔÕÐ ËÏÒÉÓÔÕ×ÁÞÁ" + +#: misc.c:856 +msgid "Make access" +msgstr "" + +#: misc.c:890 +msgid "Child access" +msgstr "" + +#: misc.c:954 +#, fuzzy, c-format +msgid "write error: %s" +msgstr "ËÁÔÁÌÏÇ \"%s\"\n" + +#: misc.c:956 +#, fuzzy +msgid "write error" +msgstr "ðÏÍÉÌËÁ ÎÁ ÛÉΦ" + +#: read.c:179 +#, fuzzy +msgid "Reading makefiles...\n" +msgstr "þÉÔÁÎÎÑ make-ÆÁÊ̦×..." + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "þÉÔÁÎÎÑ make-ÆÁÊÌÕ \"%s\"" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (ÎÅÍÁ¤ ÍÅÔÉ ÚÁ ÚÁÍÏ×ÞÕ×ÁÎÎÑÍ)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (ÛÌÑÈ ÐÏÛÕËÕ)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (ÎÅ Ú×ÁÖÁÔÉ)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (ÎÅ ÒÏÚÛÉÒÀ×ÁÔÉ ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "ÎÅצÒÎÉÊ ÓÉÎÔÁËÓÉÓ Õ ÕÍÏ×ÎÏÍÕ ×ÉÒÁÖÅÎΦ" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "ËÏÍÁÎÄÉ ÚÕÓÔÒ¦ÎÕÔ¦ ÄÏ ÐÅÒÛÏÇÏ ×ÉÚÎÁÞÅÎÎÑ Ã¦Ì¦" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "ÐÅÒÅÄ ËÏÍÁÎÄÁÍÉ ÐÒÏÐÕÝÅÎÅ ÐÒÁ×ÉÌÏ" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "ÐÒÏÐÕÝÅÎÉÊ ÒÏÚĦÌÀ×ÁÞ%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr "" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "ÐÒÏÐÕÝÅÎÉÊ ÛÁÂÌÏΠæ̦" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "ÎÅ ÏÄÉÎ ÛÁÂÌÏΠæ̦" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "ÛÁÂÌÏΠæ̦ ΊͦÓÔÉÔØ \"%%\"" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "ÐÒÏÐÕÝÅÎÁ \"endif\"" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "ÐÏÒÏÖΤ ¦Í'Ñ ÚͦÎÎϧ" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "úÁÊ×ÉÊ ÔÅËÓÔ Ð¦ÓÌÑ ÄÉÒÅËÔÉ×É \"endef\"" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "ÐÒÏÐÕÝÅÎÁ \"endif\", ÎÅÚÁ×ÅÒÛÅÎÁ \"define\"" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "úÁÊ×ÉÊ ÔÅËÓÔ Ð¦ÓÌÑ ÄÉÒÅËÔÉ×É \"endef\"" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "úÁÊ×ÉÊ ÔÅËÓÔ Ð¦ÓÌÑ ÄÉÒÅËÔÉ×É \"%s\"" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "ÚÁÊ×Á \"%s\"" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "× ÕÍÏ×ÎÏÍÕ ×ÉÒÁÚ¦ ÍÏÖÌÉ×Á ÌÉÛÅ ÏÄÎÁ ÄÉÒÅËÔÉ×Á `else'" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "" + +#: read.c:1855 +msgid "prerequisites cannot be defined in recipes" +msgstr "" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "ÚͦÛÁΦ ÎÅÑ×Φ ÐÒÁ×ÉÌÁ ¦ ÐÒÁ×ÉÌÁ Ú¦ ÓÔÁÔÉÞÎÉÍÉ ÚÒÁÚËÁÍÉ" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "ÚͦÛÁΦ ÎÅÑ×Φ ¦ Ú×ÉÞÁÊΦ ÐÒÁ×ÉÌÁ" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "æÌØ \"%s\" ΊצÄÐÏצÄÁ¤ ÚÒÁÚËÕ Ã¦ÌÅÊ" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "æÌØÏ×ÉÊ ÆÁÊÌ \"%s\" ÍÁ¤ ×ÈÏÄÖÅÎÎÑ ¦ Ú \":\", ¦ Ú \"::\" " + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "æÌØ \"%s\" ÚÁÚÎÁÞÅÎÁ ÄÅ˦ÌØËÁ ÒÁÚ × ÏÄÎÏÍÕ ÐÒÁ×É̦" + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "ÐÏÐÅÒÅÄÖÅÎÎÑ: ÐÅÒÅËÒÉÔÔÑ ËÏÍÁÎÄ ÄÌÑ Ã¦Ì¦ \"%s\"" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "ÐÏÐÅÒÅÄÖÅÎÎÑ: ¦ÇÎÏÒÕ×ÁÎÎÑ ÓÔÁÒÉÈ ËÏÍÁÎÄ ÄÌÑ Ã¦Ì¦ \"%s\"" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "ÐÏÐÅÒÅÄÖÅÎÎÑ: ÚÕÓÔÒ¦ÎÕÔÉÊ ÓÉÍ×ÏÌ NUL; ¦ÇÎÏÒÕ¤ÔØÓÑ ÄÏ Ë¦ÎÃÑ ÒÑÄËÉ" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "ã¦ÌØ \"%s\" ÎÅ ×ÉÍÁÇÁ¤ ×ÉËÏÎÁÎÎÑ ËÏÍÁÎÄ." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "\"%s\" ÎÅ ×ÉÍÁÇÁ¤ ÏÎÏ×ÌÅÎÎÑ." + +#: remake.c:306 +#, fuzzy, c-format +msgid "Pruning file `%s'.\n" +msgstr "÷ÓÅ ÝÅ ÏÎÏ×ÌÀ¤ÔØÓÑ ÆÁÊÌ \"%s\".\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sîÅÍÁ ÐÒÁ×ÉÌÁ ÄÌÑ ÓÔ×ÏÒÅÎÎÑ Ã¦Ì¦ \"%s\"%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sîÅÍÁ ÐÒÁ×ÉÌÁ ÄÌÑ ÓÔ×ÏÒÅÎÎÑ Ã¦Ì¦ \"%s\", ÎÅÏÂȦÄÎϧ ÄÌÑ \"%s\"%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "ïÂÒÏÂËÁ æÌØÏ×ÏÇÏ ÆÁÊÌÕ \"%s\".\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "ðÏÐÅÒÅÄÎÑ ÓÐÒÏÂÁ ÏÎÏ×ÉÔÉ ÆÁÊÌ \"%s\" ÚÁ×ÅÒÛÉÌÁÓÑ ÂÅÚÕÓЦÛÎÏ.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "æÁÊÌ \"%s\" ×ÖÅ ÂÕÌÏ ÏÂÒÏÂÌÅÎÏ.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "÷ÓÅ ÝÅ ÏÎÏ×ÌÀ¤ÔØÓÑ ÆÁÊÌ \"%s\".\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "ïÎÏ×ÌÅÎÎÑ ÆÁÊÌÕ \"%s\" ÚÁ×ÅÒÛÅÎÏ.\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "æÁÊÌ \"%s\" ÎÅ ¦ÓÎÕ¤.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "úÎÁÊÄÅÎÏ ÎÅÑ×ÎÅ ÐÒÁ×ÉÌÏ ÄÌÑ \"%s\".\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "îÅ ÚÎÁÊÄÅÎÏ ÎÅÑ×ÎÉÈ ÐÒÁ×ÉÌ ÄÌÑ \"%s\".\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "÷ÉËÏÒÉÓÔÁÎÎÑ ËÏÍÁÎÄ ÐÏ ÚÁÍÏ×ÞÕ×ÁÎÎÀ ÄÌÑ \"%s\".\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "ãÉË̦ÞÎÁ ÚÁÌÅÖΦÓÔØ %s <- %s ÐÒÏÐÕÝÅÎÁ." + +#: remake.c:651 +#, fuzzy, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "ïÎÏ×ÌÅÎÎÑ Ã¦ÌÅÊ, ×¦Ä ÑËÉÈ ÚÁÌÅÖÉÔØ Ã¦ÌØÏ×ÉÊ ÆÁÊÌ \"%s\", ÄÏ×ÅÒÛÅÎÏ.\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "ã¦Ì¦, ×¦Ä ÑËÉÈ ÚÁÌÅÖÉÔØ \"%s\", ÚÂÉÒÁÀÔØÓÑ.\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "á×ÁÒ¦ÊÎÉÊ ÚÕÐÉÎËÁ ÎÁ æÌØÏ×ÏÍÕ ÆÁÊ̦ \"%s\".\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "ã¦ÌØ \"%s\" ÎÅ ÂÕÌÁ ÐÅÒÅÚ¦ÂÒÁÎÁ ÞÅÒÅÚ ÐÏÍÉÌËÉ." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "" + +#: remake.c:732 +#, fuzzy, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "æÁÊÌ \"%s\" ÎÅ ¦ÓÎÕ¤.\n" + +#: remake.c:737 +#, fuzzy, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "úÁÌÅÖÎÁ æÌØ \"%s\" ÏÎÏ×ÌÑÌÁÓÑ %s Î¦Ö ÚÁÌÅÖÎÁ ×¦Ä Îŧ \"%s\".\n" + +#: remake.c:740 +#, fuzzy, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "úÁÌÅÖÎÁ æÌØ \"%s\" ÏÎÏ×ÌÑÌÁÓÑ %s Î¦Ö ÚÁÌÅÖÎÁ ×¦Ä Îŧ \"%s\".\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "ã¦ÌØ \"%s\" ÏÇÏÌÏÛÅÎÁ Ú Ä×ÏÍÁ Ä×ÏËÒÁÐËÁÍÉ ¦ ÎÅ ÍÁ¤ ÚÁÌÅÖÎÏÓÔÅÊ.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "ëÏÍÁÎÄÉ ÄÌÑ \"%s\" ÎÅ ÚÁÄÁΦ, ¦ ÚÁÌÅÖÎÏÓÔ¦ ÎÅ ÂÕÌÉ ÚͦÎÅΦ.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "" + +#: remake.c:778 +#, fuzzy, c-format +msgid "No need to remake target `%s'" +msgstr "îÅÍÁ ÎÅÏÂȦÄÎÏÓÔ¦ ÐÅÒÅÚÂÉÒÁÔÉ Ã¦ÌØ \"%s\".\n" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "îÅÏÂȦÄÎÏ ÐÅÒÅÚ¦ÂÒÁÔÉ Ã¦ÌØ \"%s\".\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr "" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "ëÏÍÁÎÄÉ ÄÌÑ \"%s\" ÚÁÒÁÚ ×ÉËÏÎÕÀÔØÓÑ.\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "óÐÒÏÂÁ ÐÅÒÅÚ¦ÂÒÁÔÉ Ã¦ÌØÏ×ÉÊ ÆÁÊÌ \"%s\" ÂÅÚÕÓЦÛÎÁ.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "ã¦ÌØÏ×ÉÊ ÆÁÊÌ \"%s\" ÕÓЦÛÎÏ ÐÅÒÅÚ¦ÂÒÁÎÉÊ.\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "ã¦ÌØÏ×ÉÊ ÆÁÊÌ \"%s\" ×ÉÍÁÇÁ¤ ÐÅÒÅÚ¦ÒËÉ Ú ËÌÀÞÏÍ -q.\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "÷ÉËÏÒÉÓÔÁÎÎÑ ËÏÍÁÎÄ ÐÏ ÚÁÍÏ×ÞÕ×ÁÎÎÀ ÄÌÑ \"%s\".\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "õ×ÁÇÁ: æÁÊÌ \"%s\" ÍÁ¤ ÍÁÊÂÕÔÎ¦Ê ÞÁÓ ÚͦÎÉ" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "õ×ÁÇÁ: æÁÊÌ \"%s\" ÍÁ¤ ÞÁÓ ÚͦÎÉ %.2g Ó × ÍÁÊÂÕÔÎØÏÍÕ" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# îÅÑ×ÎÉÈ ÐÒÁ×ÉÌ ÎÅÍÁ." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# îÅÑ×ÎÉÈ ÐÒÁ×ÉÌ: %u, ÔÅÒͦÎÁÌØÎÉÈ: %u" + +#: rule.c:526 +msgid " terminal." +msgstr "." + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "ðïíéìëá: ÎÅצÒÎÅ ÚÎÁÞÅÎÎÑ num_pattern_rules! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "ÎÅצÄÏÍÉÊ ÓÉÇÎÁÌ" + +#: signame.c:94 +msgid "Hangup" +msgstr "ïÂÒÉ×" + +#: signame.c:97 +msgid "Interrupt" +msgstr "ðÅÒÅÒÉ×ÁÎÎÑ" + +#: signame.c:100 +msgid "Quit" +msgstr "÷ÉȦÄ" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "îÅÐÒÉÐÕÓÔÉÍÁ ¦ÎÓÔÒÕËæÑ" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "ðÁÓÔËÁ ÔÒÁÓÕ×ÁÎÎÑ ÞÉ ÔÏÞËÉ ÚÕÐÉÎËÉ" + +#: signame.c:111 +msgid "Aborted" +msgstr "ðÒÉÐÉÎÅÎÏ" + +#: signame.c:114 +msgid "IOT trap" +msgstr "ðÁÓÔËÁ IOT" + +#: signame.c:117 +msgid "EMT trap" +msgstr "ðÁÓÔËÁ EMT" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "ðÏÍÉÌËÁ ÏÐÅÒÁæ§ Ú ËÒÁÐËÏÀ, ÝÏ ÐÌÁ×Á¤" + +#: signame.c:123 +msgid "Killed" +msgstr "úÎÉÝÅÎÎÑ" + +#: signame.c:126 +msgid "Bus error" +msgstr "ðÏÍÉÌËÁ ÎÁ ÛÉΦ" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "úÂ¦Ê ÓÅÇÍÅÎÔÁæ§" + +#: signame.c:132 +msgid "Bad system call" +msgstr "ðÏÇÁÎÉÊ ÓÉÓÔÅÍÎÉÊ ×ÉËÌÉË" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "ïÂÒÉ× ËÁÎÁÌÕ" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "óÉÇÎÁÌ ÐÏ ÔÁÊÍÅÒÕ" + +#: signame.c:141 +msgid "Terminated" +msgstr "úÁ×ÅÒÛÅÎÏ" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "ïÂÕÍÏ×ÌÅÎÉÊ ËÏÒÉÓÔÕ×ÁÞÅÍ ÓÉÇÎÁÌ 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "ïÂÕÍÏ×ÌÅÎÉÊ ËÏÒÉÓÔÕ×ÁÞÅÍ ÓÉÇÎÁÌ 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "îÁÝÁÄÏË ÚÁ×ÅÒÛÉ× ÒÏÂÏÔÕ" + +#: signame.c:158 +msgid "Power failure" +msgstr "úÂ¦Ê ÖÉ×ÌÅÎÎÑ" + +#: signame.c:161 +msgid "Stopped" +msgstr "úÕÐÉÎÅÎÏ" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "úÕÐÉÎÅÎÏ (××¦Ä Ú ÔÅÒͦÎÁÌÁ) " + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "úÕÐÉÎÅÎÏ (×É×¦Ä ÎÁ ÔÅÒͦÎÁÌ)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "úÕÐÉÎÅÎÏ (ÓÉÇÎÁÌ)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "ðÅÒÅ×ÉÝÅÎÅ ÏÂÍÅÖÅÎÎÑ ÎÁ ÐÒÏÃÅÓÏÒÎÉÊ ÞÁÓ" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "ðÅÒÅ×ÉÝÅÎÉÊ ÍÅÖÁ ÒÏÚͦÒÕ ÆÁÊÌÕ" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "÷¦ÒÔÕÁÌØÎÉÊ ÞÁÓ ÍÉÎÕ×" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "þÁÓ ÐÒÏƦÌÀ×ÁÎÎÑ ÍÉÎÕ×" + +#: signame.c:188 +msgid "Window changed" +msgstr "÷¦ËÎÏ ÚͦÎÅÎÏ" + +#: signame.c:191 +msgid "Continued" +msgstr "ðÒÏÄÏ×ÖÅÎÏ" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "õÍÏ×Á ÅËÓÔÒÅÎÏÇÏ ××ÏÄÕ/×É×ÏÄÕ" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "íÏÖÌÉ×ÉÊ ×צÄ/×ÉצÄ" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "òÅÓÕÒÓ ×ÔÒÁÞÅÎÏ" + +#: signame.c:216 +msgid "Danger signal" +msgstr "óÉÇÎÁÌ ÎÅÂÅÚÐÅËÉ" + +#: signame.c:219 +msgid "Information request" +msgstr "úÁÐÉÔ ¦ÎÆÏÒÍÁæ§" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "" + +#: strcache.c:235 +#, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" + +#: strcache.c:237 +#, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "" + +#: strcache.c:239 +#, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:241 +#, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" + +#: strcache.c:244 +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" + +#: variable.c:1541 +msgid "default" +msgstr "ÐÏ ÚÁÍÏ×ÞÕ×ÁÎÎÀ" + +#: variable.c:1544 +msgid "environment" +msgstr "×ÉÚÎÁÞÅÎÁ Õ ÓÅÒÅÄÏ×Éݦ" + +#: variable.c:1547 +msgid "makefile" +msgstr "ÆÁÊÌ make" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "ÚÁÄÁÎÉÊ ËÌÀÞ -e" + +#: variable.c:1553 +msgid "command line" +msgstr "×ÉÚÎÁÞÅÎÁ Õ ËÏÍÁÎÄÎÏÍÕ ÒÑÄËÕ" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "äÉÒÅËÔÉ×Á `override'" + +#: variable.c:1559 +msgid "automatic" +msgstr "Á×ÔÏÍÁÔÉÞÎÁ" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (Ú \"%s\", ÒÑÄÏË %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# úͦÎΦ\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "ÐÏÐÅÒÅÄÖÅÎÎÑ: ÎÅ×ÉÚÎÁÞÅÎÁ ÚͦÎÎÁ \"%.*s\"" + +#: vmsfunctions.c:92 +#, c-format +msgid "sys$search() failed with %d\n" +msgstr "" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "" + +#: vmsjobs.c:184 +#, fuzzy, c-format +msgid "internal error: `%s' command_state" +msgstr "×ÎÕÔÒ¦ÛÎÑ ÐÏÍÉÌËÁ: \"%s\" command_state %d Õ child_handler" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "îÅצÄÏÍÁ ×ÂÕÄÏ×ÁÎÁ ËÏÍÁÎÄÁ \"%s\".\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "" + +#: vmsjobs.c:513 +#, fuzzy, c-format +msgid "Redirected error to %s\n" +msgstr "ËÁÔÁÌÏÇ \"%s\"\n" + +#: vmsjobs.c:523 +#, c-format +msgid "Append output to %s\n" +msgstr "" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "úÁͦÓÔØ ÚÁÄÁÎÏÇÏ ×ÉËÏÎÕ¤ÔØÓÑ %s\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "ðÏÍÉÌËÁ ÐÏÒÏÄÖÅÎÎÑ ÐÒÏÃÅÓÕ, %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# ûÌÑÈÉ ÐÏÛÕËÕ VPATH\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# îÅ ×ÉÚÎÁÞÅÎÉÊ ÛÌÑÈ ÐÏÛÕËÕ \"vpath\"." + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u \"vpath\" ÛÌÑÈÉ ÐÏÛÕËÕ.\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# îÅ ×ÉÚÎÁÞÅÎÉÊ ÚÁÇÁÌØÎÉÊ (ÚͦÎÎÁ \"VPATH\") ÛÌÑÈ ÐÏÛÕËÕ." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# úÁÇÁÌØÎÉÊ (ÚͦÎÎÁ \"VPATH\") ÛÌÑÈ ÐÏÛÕËÕ:\n" +"# " + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "óÉÎÔÁËÓÉÞÎÁ ÐÏÍÉÌËÁ, ×ÓÅ ÝÅ ×ÓÅÒÅÄÉΦ '\"'\n" + +#, fuzzy +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "" +#~ "ïÔÒÉÍÁÎÉÊ ÓÉÇÎÁÌ SIGCHLD; ÎÁÝÁÄË¦× Ú ÎÅÏÐÒÁÃØÏ×ÁÎÉÍÉ ÒÅÚÕÌØÔÁÔÁÍÉ %d.\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "ÚÁÊ×ÉÊ \"endef\"" + +#~ msgid "empty `override' directive" +#~ msgstr "ÐÏÒÏÖÎÑ ÄÉÒÅËÔÉ×Á `override'" + +#, fuzzy +#~ msgid "invalid `override' directive" +#~ msgstr "äÉÒÅËÔÉ×Á `override'" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "ÎÅ ×ËÁÚÁÎÏ ¦Í'Ñ ÆÁÊÌÕ ÄÌÑ \"%sinclude\"" + +#, fuzzy +#~ msgid "target `%s' leaves prerequisite pattern empty" +#~ msgstr "æÌØ \"%s\" ΊצÄÐÏצÄÁ¤ ÚÒÁÚËÕ Ã¦ÌÅÊ" + +#~ msgid " impossibilities in %u directories.\n" +#~ msgstr " ÎÅÄÏÓÑÖÎÉÈ Ã¦ÌÅÊ Õ %u ËÁÔÁÌÏÇÁÈ.\n" + +#~ msgid "# %u variables in %u hash buckets.\n" +#~ msgstr "# %u ÚͦÎÎÉÈ Õ %u ÏÓÅÒÅÄËÁÈ ÈÅÛ-ÔÁÂÌÉæ.\n" + +#~ msgid "# No variables." +#~ msgstr "# úͦÎÎÉÈ ÎÅÍÁ." + +#, fuzzy +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "" +#~ "# Õ ÓÅÒÅÄÎØÏÍÕ %.1f ÆÁÊÌ¦× Õ ÏÓÅÒÅÄËÕ, ÍÁËÓ. %u ÆÁÊÌ¦× Õ ÏÄÎÏÍÕ " +#~ "ÏÓÅÒÅÄËÕ.\n" + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# Õ ÓÅÒÅÄÎØÏÍÕ %.1f ÚͦÎÎÉÈ × ÏÓÅÒÅÄËÕ, ÍÁËÓ. %u × ÏÄÎÏÍÕ ÏÓÅÒÅÄËÕ.\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "" +#~ "# Õ ÓÅÒÅÄÎØÏÍÕ %d.%d ÚͦÎÎÉÈ × ÏÓÅÒÅÄËÕ, ÍÁËÓ. %u × ÏÄÎÏÍÕ ÏÓÅÒÅÄËÕ.\n" + +#, fuzzy +#~ msgid "%s access: user %lu (real %lu), group %lu (real %lu)\n" +#~ msgstr "" +#~ "ðÒÁ×Á ÄÏÓÔÕÐÕ ÄÏ %s: ËÏÒÉÓÔÕ×ÁÞ %d (ĦÊÓÎÉÊ %d), ÇÒÕÐÁ %d (ĦÊÓÎÁ %d)\n" + +#~ msgid "*** Warning: File `%s' has modification time in the future (%s > %s)" +#~ msgstr "*** õ×ÁÇÁ: ÆÁÊÌ \"%s\" ÍÁ¤ ÞÁÓ ÚͦÎÉ Õ ÍÁÊÂÕÔÎØÏÍÕ (%s > %s)" + +#~ msgid "" +#~ ", by Richard Stallman and Roland McGrath.\n" +#~ "%sBuilt for %s\n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s\tFree Software Foundation, Inc.\n" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ "\n" +#~ "%sReport bugs to .\n" +#~ "\n" +#~ msgstr "" +#~ ", Á×ÔÏÒÉ Richard Stallman ¦ Roland McGrath.\n" +#~ "%sðÏÂÕÄÏ×ÁÎÁ ÄÌÑ %s\n" +#~ "%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n" +#~ "%s Free Software Foundation, Inc.\n" +#~ "%sãŠצÌØÎÁ ÐÒÏÇÒÁÍÁ; ÐÏÄÒÏÂÉæ ÐÒÏ ÕÍÏ×ÁÈ ÐÏÛÉÒÅÎÎÑ ÄÉצÔØÓÑ\n" +#~ "%sÕ ×ÉȦÄÎÏÍÕ ÔÅËÓÔ¦. íÉ îå ÎÁÄÁ¤ÍÏ ÇÁÒÁÎÔ¦Ê; ÎÁצÔØ ÇÁÒÁÎÔ¦Ê\n" +#~ "%sëïíåòã¶êîï· ã¶îîïóô¶ ÁÂÏ ðòéäáôîïóô¶ äìñ ëïîëòåôîï· ã¶ì¶.\n" +#~ "\n" +#~ "%sðÏצÄÏÍÌÑÊÔÅ ÐÒÏ ÐÏÍÉÌËÉ .\n" + +#~ msgid "Allow N jobs at once; infinite jobs with no arg" +#~ msgstr "" +#~ "úÁÐÕÓËÁÔÉ ÏÄÎÏÞÁÓÎÏ ÄÏ î ÚÁ×ÄÁÎØ; ÑËÝÏ ÁÒÇÕÍÅÎÔ ÎÅ ÚÁÄÁÎÉÊ,\n" +#~ " ÞÉÓÌÏ ÚÁ×ÄÁÎØ ÎÅÏÂÍÅÖÅÎÏ" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "ðÅÒÅÊÔÉ Õ ëáôáìïç ÐÅÒÅÄ ÐÏÞÁÔËÏÍ ÐÒÁæ" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "÷×ÁÖÁÔÉ æáêì ÎÅÏÂÍÅÖÅÎÏ ÎÏ×ÉÍ" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "÷×ÁÖÁÔÉ æáêì ÄÕÖÅ ÓÔÁÒÉÍ ¦ ÎÅ ÐÅÒÅÚÂÉÒÁÔÉ ÊÏÇÏ" + +#~ msgid "DIRECTORY" +#~ msgstr "ëáôáìïç" + +#~ msgid "Disable the built-in implicit rules" +#~ msgstr "îÅ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ ×ÂÕÄÏ×ÁΦ ÎÅÑ×Φ ÐÒÁ×ÉÌÁ" + +#, fuzzy +#~ msgid "Disable the built-in variable settings" +#~ msgstr "îÅ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ ×ÂÕÄÏ×ÁΦ ÎÅÑ×Φ ÐÒÁ×ÉÌÁ" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "îÅ ×ÉËÏÎÕ×ÁÔÉ ËÏÍÁÎÄÉ, ÐÒÏÓÔÏ ÎÁÄÒÕËÕ×ÁÔÉ §È" + +#~ msgid "Don't echo commands" +#~ msgstr "îÅ ×É×ÏÄÉÔÉ ËÏÍÁÎÄÉ" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "" +#~ "îÅ ÚÁÐÕÓËÁÔÉ ÐÁÒÁÌÅÌØΦ ÚÁ×ÄÁÎÎÑ ÐÏËÉ ÚÁ×ÁÎÔÁÖÅÎÎÑ ÎÅ ÚÎÉÚÉÔØÓÑ ÄÏ N" + +#~ msgid "Entering" +#~ msgstr "÷ÈÏÖÕ Õ" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "úͦÎΦ ÓÅÒÅÄÏ×ÉÝÁ ÐÅÒÅËÒÉ×ÁÀÔØ ÚͦÎΦ, ×ÉÚÎÁÞÅΦ Õ make-ÆÁÊ̦" + +#~ msgid "FILE" +#~ msgstr "æáêì" + +#~ msgid "FLAGS" +#~ msgstr "ïúîáëé" + +#~ msgid "Ignore errors from commands" +#~ msgstr "¶ÇÎÏÒÕ×ÁÔÉ ÐÏÍÉÌËÉ ËÏÍÁÎÄ" + +#~ msgid "Ignored for compatibility" +#~ msgstr "¶ÇÎÏÒÏ×ÁÎÏ ÄÌÑ ÓÕͦÓÎÏÓÔ¦" + +#~ msgid "Initialized" +#~ msgstr "¶Î¦Ã¦Á̦ÚÏ×ÁÎÉÊ" + +#~ msgid "Keep going when some targets can't be made" +#~ msgstr "ðÒÏÄÏ×ÖÕ×ÁÔÉ ÒÏÂÏÔÕ, ÎÁצÔØ ÑËÝÏ ÄÅÑ˦ æ̦ ÎÅ ÄÏÓÑÇÎÕÔ¦" + +#~ msgid "Leaving" +#~ msgstr "úÁÌÉÛÁÀ" + +#~ msgid "Print lots of debugging information" +#~ msgstr "÷É×ÏÄÉÔÉ ÐÏצÄÏÍÌÅÎÎÑ ÄÌÑ ×¦ÄÌÁÇÏÄÖÅÎÎÑ" + +#~ msgid "Print make's internal database" +#~ msgstr "îÁÄÒÕËÕ×ÁÔÉ ×ÎÕÔÒ¦ÛÎÀ ÂÁÚÕ ÄÁÎÉÈ make" + +#~ msgid "Print the current directory" +#~ msgstr "îÁÄÒÕËÕ×ÁÔÉ ÐÏÔÏÞÎÉÊ ËÁÔÁÌÏÇ" + +#~ msgid "Print the version number of make and exit" +#~ msgstr "ðÏËÁÚÁÔÉ ¦ÎÆÏÒÍÁæÀ ÐÒÏ ×ÅÒÓ¦§ ¦ ×ÉÊÔÉ" + +#~ msgid "Print this message and exit" +#~ msgstr "ðÏËÁÚÁÔÉ ÃÀ ÄÏצÄËÕ ¦ ×ÉÊÔÉ" + +#, fuzzy +#~ msgid "Print various types of debugging information" +#~ msgstr "÷É×ÏÄÉÔÉ ÐÏצÄÏÍÌÅÎÎÑ ÄÌÑ ×¦ÄÌÁÇÏÄÖÅÎÎÑ" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "ðÒÏÞÉÔÁÔÉ æáêì ÑË make-ÆÁÊÌ" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "ûÕËÁÔÉ make-ÆÁÊÌÉ, Ñ˦ ÎÅÏÂȦÄÎÏ ×ËÌÀÞÉÔÉ, Õ ÃØÏÍÕ ëáôáìïú¶" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "ðÒÉÚÕÐÉÎÉÔÉ ÐÒÏÃÅÓÉ ÄÌÑ ÐÒɤÄÎÁÎÎÑ ×¦ÄÌÁÇÏÄÖÕ×ÁÞÁ" + +#~ msgid "Touch targets instead of remaking them" +#~ msgstr "ðÏÎÏ×ÉÔÉ ÞÁÓ ÓÔ×ÏÒÅÎÎÑ Ã¦ÌÅÊ, Á ÎÅ ÐÅÒÅÚÂÉÒÁÔÉ §È" + +#~ msgid "Turn off -w, even if it was turned on implicitly" +#~ msgstr "÷¦ÄͦÎÉÔÉ ËÌÀÞ -w, ÎÁצÔØ ÑËÝÏ ÊÏÇÏ ÂÕÌÏ Ñ×ÎÏ ÚÁÚÎÁÞÅÎÏ" + +#~ msgid "Turns off -k" +#~ msgstr "÷¦ÄͦÎÉÔÉ ËÌÀÞ -k" + +#~ msgid "Warn when an undefined variable is referenced" +#~ msgstr "÷ÉÄÁ×ÁÔÉ ÐÏÐÅÒÅÄÖÅÎÎÑ ÐÒÉ ÐÏÓÉÌÁÎΦ ÎÁ ÎÅ×ÉÚÎÁÞÅÎÕ ÚͦÎÎÕ" + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# %u ÆÁÊÌ¦× × %u ÏÓÅÒÅÄËÁÈ ÈÅÛ-ÔÁÂÌÉæ.\n" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# æÁÊÌ¦× ÎÅÍÁ." + +#~ msgid "an unknown directory" +#~ msgstr "ÎÅצÄÏÍÉÊ ËÁÔÁÌÏÇ" + +#~ msgid "directory `%s'\n" +#~ msgstr "ËÁÔÁÌÏÇ \"%s\"\n" diff --git a/po/vi.gmo b/po/vi.gmo new file mode 100644 index 0000000..acfdd46 Binary files /dev/null and b/po/vi.gmo differ diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..94b3402 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,2118 @@ +# Vietnamese translation for Make. +# Copyright © 2006 Free Software Foundation, Inc. +# Clytie Siddall , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2006-05-04 20:26+0930\n" +"Last-Translator: Clytie Siddall \n" +"Language-Team: Vietnamese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" +"X-Generator: LocFactoryEditor 1.6b36\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "đã cố sá»­ dụng tính năng không được hỗ trợ « %s »" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "bộ phạn kho touch chÆ°a sẵn sàng trên VMS" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch: kho « %s » không tồn tại" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch: « %s » không phải là một kho hợp lệ" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch: bộ phạn « %s » không tồn tại trong « %s »" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch: mới nhận mã trả lại sai từ « ar_member_touch » trên « %s »" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "« lbr$set_module » đã không rút được thông tin mô-đun, trạng thái = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "« lbr$ini_control » bị lỗi với trạng thái = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "không thể mở thÆ° viên « %s » để tra tìm bộ phạn « %s »" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "Bộ phạn « %s »%s: %ld byte với %ld (%ld).\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (có lẽ tên bị cụt)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " Ngày %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d, gid = %d, chế độ = 0%o.\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** Ngắt\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] Có lẽ bộ phạn « %s » là giả; chÆ°a bị xóa bỏ" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** Có lẽ bộ phạn « %s » là giả; chÆ°a bị xóa bỏ" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] Đang xóa bỏ tập tin « %s »..." + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** Đang xóa bỏ tập tin « %s »..." + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# các lệnh cần thi hành" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (sẵn có):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (từ « %s », dòng %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# ThÆ° mục\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s: không thể lấy các thông tin về nó.\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (khóa %s, giờ_m %d): không thể được mở.\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (thiết bị %d, nút thông tin [%d,%d,%d]): không thể được mở.\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (thiết bị %ld, nút thông tin %ld): không thể được mở.\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (khóa %s, giờ_m %d): " + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (thiết bị %d, nút thông tin [%d,%d,%d]): " + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (thiết bị %ld, nút thông tin %ld): " + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "Không" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " tập tin, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "không" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " điều không thể" + +#: dir.c:1075 +msgid " so far." +msgstr " cho đến đây." + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " điều không thể trong %lu thÆ° mục.\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "Biến đệ qui « %s » tham chiếu chính nó (cuối cùng)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "tham chiếu biến chÆ°a có kết thúc" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "Các lệnh được ghi rõ cho tập tin « %s » vào %s:%lu," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "" +"Các lệnh cho tập tin « %s » đã được tìm bằng việc tìm kiếm quy tắc ngầm," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "nhÆ°ng « %s » hiện thời được xem là cùng một tập tin với « %s »." + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "Các lệnh cho « %s » sẽ bị bỏ qua để ủng hộ các điều cho « %s »." + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "" +"không thể thay đổi tên dấu hai chấm đơn « %s » thành dấu hai chấm đôi « %s »" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "" +"không thể thay đổi tên dấu hai chấm đôi « %s » thành dấu hai chấm đơn « %s »" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** Đang xóa bỏ tập tin trung cấp « %s »..." + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "Đang gỡ bỏ các tập tin trung cấp...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s: Nhãn thời gian ở ngoại phạm vị nên thay thế %s" + +#: file.c:804 +msgid "Current time" +msgstr "Giờ hiện thời" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# Không phải là đĩch:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# Tập tin qúy (điều kiện tiên quyết của .PRECIOUS)." + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# Đích giả (điều kiện tiên quyết của .PHONY)." + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# Đích dòng lệnh." + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "" +"# Tập tin tạo (makefile) mặc định, kiểu MAKEFILES, hay kiểu « -include/" +"sinclude »." + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# Mới tìm kiếm kiểu quy tắc ngầm." + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# ChÆ°a tìm kiếm kiểu quy tắc ngầm." + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# Cuống mẫu ngầm/tÄ©nh: « %s »\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# Tập tin là điều kiện tiên quyết trung cấp." + +#: file.c:946 +msgid "# Also makes:" +msgstr "# CÅ©ng tạo :" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# ChÆ°a bao giờ kiểm tra giờ sá»­a đổi." + +#: file.c:954 +msgid "# File does not exist." +msgstr "# Tập tin không tồn tại." + +#: file.c:956 +msgid "# File is very old." +msgstr "# Tập tin rất cÅ©." + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# Sá»­a đổi cuối cùng %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# Tập tin đã được cập nhật." + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# Tập tin chÆ°a được cập nhật." + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# Các lệnh đang chạy (ĐÂY LÀ LỖI)." + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# Các lệnh phụ thuộc đang chạy (ĐÂY LÀ LỖI)." + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# Đã được cập nhật." + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# Cần thiết cập nhật (« -q » đã lập)." + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# Việc cập nhật bị lỗi." + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "" +"# Giá trị không hợp lệ trong bộ phạn « update_status » (trạng thái cập nhật)!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "" +"# Giá trị không hợp lệ trong bộ phạn « command_state » (tính trạng lệnh)!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# Tập tin" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# thống kê bảng băm các tập tin:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "đối số thứ nhất không dạng số đối với hàm « word » (từ)" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "đối số thứ nhất đối với hàm « word » (từ) phải là lớn hÆ¡n 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "đối số thứ nhất không dạng số đối với hàm « wordlist » (danh sách từ)" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "đối số thứ hai không dạng số đối với hàm « wordlist » (danh sách từ)" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "" +"Việc « create_child_process: DuplicateHandle(In) » (tạo tiến trình con: bộ " +"quản lý trùng) bị lỗi (e=%ld)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "" +"Việc « create_child_process: DuplicateHandle(Err) » (tạo tiến trình con: bộ " +"quản lý trùng(lỗi)) bị lỗi (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "Việc « CreatePipe() » (tạo ống dẫn) bị lỗi (e=%ld)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "" +"Việc « windows32_openpipe (): process_init_fd() » (mở ống dẫn windows32: tiến " +"trình sở khởi fd) bị lỗi\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "Đang làm sạch tập tin bó tạm thời %s...\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "Không có đủ đối số (%d) tới hàm « %s »" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "chÆ°a được thá»±c hiện trên nền tảng này: hàm « %s »" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "cuộc gọi chÆ°a được kết thúc cho hàm « %s »: thiếu « %c »" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: tùy chọn « %s » là mÆ¡ hồ\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: tùy chọn « --%s » không cho phép đối số\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: tùy chọn « %c%s » không cho phép đối số\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: tùy chọn « %s » cần đến đối số\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: không nhận ra tùy chọn « --%s »\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: không nhận ra tùy chọn « %c%s »\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: không cho phép tùy chọn « -- %c »\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: tùy chọn không hợp lệ « -- %c »\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: tùy chọn cần đến đối số « -- %c »\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: tùy chọn « -W %s » là mÆ¡ hồ\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: tùy chọn « -W %s » không cho phép đối số\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "không thể cấp phát %ld byte cho bảng băm: hết bộ nhớ hoàn toàn" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "Trọng tải=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "Băm lại=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "Xung đột=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "Đang tìm quy tắc nguầm cho « %s ».\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "Đang tìm quy tắc ngầm về bộ phạn kho cho « %s ».\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "Đang tránh sá»± đệ qui quy tắc ngầm.\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "Đang thá»­ quy tắc mẫu với cuống « %.*s ».\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "Đang từ chối điều kiện tiên quyết không thể « %s ».\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "Đang từ chối điều kiện tiên quyết ngầm không thể « %s ».\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "Đang thá»­ điều kiện tiên quyết quy tắc « %s ».\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "Đang thá»­ điều kiện tiên quyết ngầm « %s ».\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "Mới tìm điều kiện tiên quyết « %s » dạng VPATH « %s »\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "Đang tìm quy tắc với tập tin trung cấp « %s ».\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "Không thể tạo tên tập tin tạm thời\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] Lỗi 0x%x (bị bỏ qua)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] Lỗi 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] Lỗi %d (bị bỏ qua)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] Lỗi %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (lõi bị đổ)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** Đang đợi các việc chÆ°a xong..." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "Điều con động 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (từ xa)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "Đang bắt điều con thua 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "Đang bắt điều con thắng 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "Đang làm sạch tập tin bó tạm thời: %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "Đang gỡ bỏ điều con 0x%08lx PID %ld%s ra dây.\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "ghi trình phục vụ công việc" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "Mới nhả hiệu bài cho điều con 0x%08lx (%s).\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "" +"Việc « process_easy() » (tiến trình dễ) bị lỗi khi cố khởi chạy tiến trình (e=" +"%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"Đã đếm %d đối số trong việc khởi chạy bị lỗi\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "Đang để điều con 0x%08lx (%s) PID %ld%s trên dây.\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "Đã lấy hiệu bài cho điều con 0x%08lx (%s).\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "đọc ống dẫn của các cộng việc" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "Không cần tạo lại đích « %s »." + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "không thể buộc hạn chế trọng tải với hệ điều hành này" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "không thể buộc hạn chế trọng tải: " + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "" +"không có bộ quản lý tập tin nữa: không thể nhân bản thiết bị nhập chuẩn\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "" +"không có bộ quản lý tập tin nữa: không thể nhân bản thiết bị xuất chuẩn\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "Không thể phục hồi thiết bị nhập chuẩn\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "Không thể phục hồi thiết bị xuất chuẩn\n" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "đặt điều con đã bắt là PID %ld, vẫn còn đợi PID %ld\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s: Không tìm thấy lệnh." + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s: Không tìm thấy chÆ°Æ¡ng trình hệ vỏ" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: có lẽ hết sức chứa môi trường hoàn toàn" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL đã thay đổi (đã « %s », là « %s »)\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "Đang tạo tập tin bó tạm thời: %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (dòng %d) Ngữ cảnh hệ vỏ sai (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "Tùy chọn:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m Bị bỏ qua để tÆ°Æ¡ng thích.\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr "" +" -B, --always-make _Luôn luôn tạo_ mọi đích (không điều kiện).\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C THƯ_MỤC, --directory=THƯ_MỤC\n" +" Chuyển đổi sang thÆ° mục này, trước hết.\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d In ra rất nhiều thông tin _gỡ lỗi_.\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr "" +" --debug[=CỜ...] In ra các kiểu thông tin _gỡ lỗi_ khác nhau.\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" Các biến _môi trường có quyền cao hÆ¡n_\n" +"\t\t\t\t\tcác tập tin tạo (makefile).\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f TẬP_TIN, --file=TẬP_TIN, --makefile=TẬP_TIN\n" +" Đọc tập tin này dạng tập tin tạo (makefile).\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help Hiển thị _trợ giúp_ này rồi thoát.\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors _Bỏ qua các lỗi_ từ các lệnh.\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I THƯ_MỤC, --include-dir=THƯ_MỤC\n" +" Tìm kiếm tập tin tạo (makefile) đã _bao gồm_\n" +"\t\t\t\t\ttrong _thÆ° mục_ này.\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] Cho phép N (số) _công việc_ đồng thời;\n" +"\t\t\t\t\t\tvô hạn khi không có đối số\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr "" +" -k, --keep-going _Cứ làm_ khi không thể tạo một số đích.\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Đừng khởi chạy nhiều công việc, trừ trọng tải dưới N " +"(số).\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times\n" +"\t\t\tDùng giờ_m cuối cùng giữa liên kết tượng trÆ°ng và đích.\n" +"\t(_kiểm tra giờ liên kết tượng trÆ°ng_)\n" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" Đừng thật chạy lệnh nào, chỉ in ra hết.\n" +"\t(_chỉ in, chạy thá»±c hành, sá»± thăm dò_)\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o TẬP_TIN, --old-file=TẬP_TIN, --assume-old=TẬP_TIN\n" +" Xem tập tin này là rất cÅ© nên đừng tạo lại nó.\n" +"\t(_cÅ©, tập tin cÅ©, giả sá»­ cÅ©_)\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr "" +" -p, --print-data-base _In ra cÆ¡ sở dữ liệu_ nội bộ của trình make.\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question\n" +"\tĐừng chạy lệnh nào; trạng thái thoát nói nếu hiện thời hay không.\n" +"\t(_câu hỏi_)\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr "" +" -r, --no-builtin-rules \t\tTắt các quy tắc ngầm có sẵn.\n" +"\t(_không có quy tắc có sẵn_)\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr "" +" -R, --no-builtin-variables \tTắt các thiết lập biến có sẵn.\n" +"\t(_không có biến có sẵn_)\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr "" +" -s, --silent, --quiet Đừng vọng (hiển thị) lệnh.\n" +"\t(_câm, im_)\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\t\tTắt « -k ».\n" +"\t(không cứ làm, dừng)\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr "" +" -t, --touch Touch các đích thay vào tạo lại chúng.\n" +"\t(_sờ_)\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr "" +" -v, --version In ra số thứ tá»± _phiên bản_ của trình make, " +"rồi thoát.\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory _In ra thÆ° mục_ hiện thời.\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr "" +" --no-print-directory Tắt « -w », dù khi nó được bật ngầm\n" +"\t(_không in ra thÆ° mục_)\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W TẬP_TIN\n" +" --what-if=TẬP_TIN\n" +" --new-file=TẬP_TIN\n" +" --assume-new=TẬP_TIN\n" +" \t\t\tXem là tập tin này là mới vô hạn.\n" +"\t(_gì nếu, tập tin mới, giả sá»­ mới_)\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr "" +" --warn-undefined-variables\n" +"\t\t_Cảnh báo_ khi tham chiếu một _biến chÆ°a được định nghÄ©a_.\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "chuỗi rỗng không hợp lệ dạng tên tập tin" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "không biết đặc tả cấp gỡ lỗi « %s »" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "" +"%s: Mới bắt Interrupt/Exception (ngắt/ngoài lệ) (mã = 0x%lx, địa chỉ = 0x%" +"lx)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"Bộ lọc ngoại lệ không đã quản lý được gọi từ chÆ°Æ¡ng trình %s\n" +"ExceptionCode \t\tmã ngoại lệ\t %lx\n" +"ExceptionFlags \t\tcác cờ ngoại lệ %lx\n" +"ExceptionAddress \t\tđịa chỉ ngoại lệ %lx\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "Vi phạm truy cập: thao tác ghi tại địa chỉ %lx\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "Vi phạm truy cập: thao tác đọc tại địa chỉ %lx\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "" +"« find_and_set_shell » (tìm và lập hệ vỏ) đang lập « default_shell » (hệ vỏ " +"mặc định) = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "" +"Việc tìm kiếm đường dẫn « find_and_set_shell » (tìm và lập hệ vỏ) đang lập « " +"default_shell » (hệ vỏ mặc định) = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s đang ngÆ°ng được 30 giây..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "đã ngủ(30). Đang tiếp tục.\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "Tập tin tạo (makefile) từ thiết bị nhập chuẩn đã được ghi rõ hai lần." + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "" +"fopen (tập tin tạm thời)\n" +" (_mở tập tin_)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "" +"fwrite (tập tin tạm thời)\n" +" (_ghi tập tin_)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "Công việc song song (-j) không được hỗ trợ trên nền tảng này." + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "Đang lập lại thành chế độ công việc đơn (-j1)." + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "" +"lỗi nội bộ: có nhiều tùy chọn « --jobserver-fds » (trình phục vụ công việc -" +"fds)." + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "" +"lỗi nội bộ: gặp chuỗi « --jobserver-fds » (trình phục vụ công việc -fds) " +"không hợp lệ « %s »." + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "" +"cảnh báo : « -jN » bị buộc trong tiến trình submake: nên tắt chế độ trình " +"phục vụ công việc (jobserver)." + +#: main.c:1750 +msgid "dup jobserver" +msgstr "dup jobserver (sao lục trình phục vụ công việc)" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "" +"cảnh báo : trình phục vụ công việc không sẵn sàng: nên dùng « -j1 ». Hãy thêm " +"« + » vào quy tắc make mẹ." + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "đang tạo ống dẫn công việc" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "init jobserver pipe (sở khởi ống dẫn trình phục vụ công việc)" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "Không hỗ trợ liên kết tượng trÆ°ng: nên tắt « -L »." + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "Đạng cập nhật các tập tin tạo (makefile)...\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Tập tin tạo (makefile) « %s » có lẽ sẽ vòng lặp; sẽ không tạo lại nó.\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "Việc tạo lại tập tin tạo (makefile) « %s » bị lỗi." + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "Không tìm thấy tập tin tạo (makefile) đã bao gồm « %s »." + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "Không tìm thấy tập tin tạo (makefile) « %s »." + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "Không thể chuyển đổi về thÆ° mục gốc." + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "Đang thá»±c hiện lại[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "unlink (bỏ liên kết) (tập tin tạm thời): " + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr "« .DEFAULT_GOAL » (đích mặc định) chứa nhiều đích." + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "ChÆ°a ghi rõ đích nào, và không tìm thấy tập tin tạo (makefile) nào" + +#: main.c:2272 +msgid "No targets" +msgstr "Không có đích" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "Đạng cập nhật các đích mục tiêu...\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "" +"cảnh báo : mới phát hiện đối xứng lệch đồng hồ. NhÆ° thế thì bản xây dụng có " +"lẽ không hoàn toàn." + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "Cách sá»­ dụng: %s [tùy_chọn...] [đích] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"ChÆ°Æ¡ng trình này đã được xây dụng cho %s\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"ChÆ°Æ¡ng trình này đã được xây dụng cho %s (%s)\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "Hãy thông báo lỗi cho .\n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "tùy chọn « -%c » cần đến một đối số dạng chuỗi không rỗng" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "tùy chọn « -%c » cần đến một đối số dạng số nguyên dÆ°Æ¡ng" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%sChÆ°Æ¡ng trình này đã được xây dụng cho %s\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%sChÆ°Æ¡ng trình này đã được xây dụng cho %s (%s)\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# CÆ¡ sở dữ liệu Make, được in ra vào %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# Mới xong cÆ¡ sở dữ liệu Make vào %s\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: Đang vào một thÆ° mục lạ\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: Đang rời khỏi một thÆ° mục lạ\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: Đang vào thÆ° mục « %s »\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: Đang rời khỏi thÆ° mục « %s »\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: Đang vào một thÆ° mục lạ\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: Đang rời khỏi một thÆ° mục lạ\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: Đang vào thÆ° mục « %s »\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: Đang rời khỏi thÆ° mục « %s »\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr ". Dừng.\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "Không biết lỗi: %d" + +# Variable: don't translate / Biến: đừng dịch +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +# Variable: do not translate/ biến: đừng dịch +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "hết bộ nhớ ảo hoàn toàn" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: người dùng %lu (thật %lu), nhóm %lu (thật %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "Truy cấp đã sở khởi" + +#: misc.c:808 +msgid "User access" +msgstr "Truy cập người dùng" + +#: misc.c:856 +msgid "Make access" +msgstr "Truy cập Make" + +#: misc.c:890 +msgid "Child access" +msgstr "Truy cập điều con" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "lỗi ghi: %s" + +#: misc.c:956 +msgid "write error" +msgstr "lỗi ghi" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "Đạng đọc các tập tin tạo (makefile)...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "Đạng đọc tập tin tạo (makefile) « %s »..." + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (không có mục tiêu mặc định)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (đường dẫn tìm kiếm)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (cÅ©ng được)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (không mở rộng ~)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "gặp cú pháp không hợp lệ trong đồ điều kiện" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "lệnh bắt đầu trước đích thứ nhất" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "thiếu quy tắc trước các lệnh" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "thiếu bộ phân cách%s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (bạn có muốn dùng TAB thay vào 8 dấu cách chứ?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "thiếu mẫu đích" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "nhiều mẫu đích" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "mẫu đích không chứa « %% »" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "thiếu « endif »" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "tên biến rỗng" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "Gặp chuỗi chữ bắt nguồn ở ngoài sau chi thị « endef »" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "thiếu « endef », « define » (định nghÄ©a) chÆ°a kết thúc" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "Gặp chuỗi chữ bắt nguồn ở ngoài sau chi thị « endef »" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "Gặp chuỗi chữ bắt nguồn ở ngoài sau chi thị « %s »" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "gặp « %s » bắt nguồn ở ngoài" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "chỉ cho phép một « else » (nếu không thì) cho mỗi đồ điều kiện thôi" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "Lời định nghÄ©a biến đặc trÆ°ng cho đích dạng sai" + +#: read.c:1855 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "không thể định nghÄ©a điều kiện tiên quyết trong tập lệnh kiểu lệnh" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "gặp quy tắc mẫu kiểu ngầm và tÄ©nh được trộn với nhau" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "gặp quy tắc mẫu kiểu ngầm và chuẩn được trộn với nhau" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "đích « %s » không khớp với mẫu đích" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "tập tin đích « %s » có mục nhập kiểu cả « : » lẫn « :: » đều" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "đích « %s » được đưa ra nhiều lần trong cùng một quy tắc" + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "cảnh báo : đang đè lên các lệnh cho đích « %s »" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "cảnh báo : đang bỏ qua các lệnh cÅ© cho đích « %s »" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "cảnh báo : đã xem ký tá»± NUL (rỗng) nên bỏ qua phần còn lại của dòng đó" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "Không có gì cần làm cho « %s »." + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "« %s » là hiện thời." + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "Đang xén bớt tập tin « %s ».\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%sKhông có quy tắc tới đích make « %s »%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%sKhông có quy tắc tới đích make « %s », cần thiết bởi « %s »%s" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "Đang suy nghÄ© tập tin đích « %s ».\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "Vừa cố cập nhật tập tin « %s » nhÆ°ng bị lỗi.\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "Tập tin « %s » đã được suy nghÄ©.\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "Vẫn còn đang cập nhật tập tin « %s »...\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "Mới cập nhật xong tập tin « %s ».\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "Tập tin « %s » không tồn tại.\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "" +"*** Cảnh báo : tập tin « .LOW_RESOLUTION_TIME » (thời gian giải pháp thấp) « %" +"s » có nhãn thời gian cao" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "Tìm thấy một quy tắc ngầm cho « %s ».\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "Không tìm thấy quy tắc ngầm cho « %s »\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "Đang dùng các lệnh mặc định cho « %s ».\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "Cách phụ thuộc vòng tròn « %s ← %s » bị gỡ bỏ." + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "Mới xong các điều kiện tiên quyết của tập tin đích « %s ».\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "Đang tạo các điều kiện tiên quyết của « %s ».\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "Đang chịu thua về tập tin đích « %s ».\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "Đích « %s » không được tạo lại vì gặp lỗi." + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "" +"Điều kiện tiên quyết « %s » là order-only (chỉ thứ tá»±) cho đích « %s ».\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "Điều kiện tiên quyết « %s » của đích « %s » không tồn tại.\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "Điều kiện tiên quyết « %s » là mới hÆ¡n đích « %s » .\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "Điều kiện tiên quyết « %s » là cÅ© hÆ¡n đích « %s » .\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "" +"Đích « %s » là kiểu dấu hai chấm đôi và không có điều kiện tiên quyết nào.\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "" +"Không có lệnh cho « %s », và chÆ°a thật sá»± thay đổi điều kiện tiên quyết nào.\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "Đang tạo « %s » vì gặp cờ always-make (luôn luôn tạo).\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "Không cần tạo lại đích « %s »." + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr "; đang dùng tên VPATH (đường dẫn V) « %s »" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "Phải tạo lại đích « %s ».\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " Đang bỏ qua tên đường dẫn VPATH « %s ».\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "Đang chạy các lệnh của « %s ».\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "Việc tạo lại tập tin đích « %s » bị lỗi.\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "Mới tạo lại tập tin đích « %s ».\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "Tập tin đích « %s » cần được tạo lại dưới « -q ».\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "Đang dùng các lệnh mặc định cho « %s ».\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "Cảnh báo : tập tin « %s » có giờ sá»­a đổi trong tÆ°Æ¡ng lai." + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "Cảnh báo : tập tin « %s » có giờ sá»­a đổi « %.2g s » trong tÆ°Æ¡ng lai." + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr "Yếu tố « .LIBPATTERNS » (các mẫu thÆ° viên) « %s » không phải là mẫu" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "Thuế quan không xuất được: %s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# Quy tắc ngầm" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# Không có quy tắc ngầm." + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u quy tắc ngầm, %u" + +#: rule.c:526 +msgid " terminal." +msgstr " thiết bị cuối" + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "LỖI: « num_pattern_rules » (số quy tắc mẫu) không đúng! %u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "tín hiệu lạ" + +#: signame.c:94 +msgid "Hangup" +msgstr "Ngừng nói" + +#: signame.c:97 +msgid "Interrupt" +msgstr "Ngắt" + +#: signame.c:100 +msgid "Quit" +msgstr "Thoát" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "Lệnh cấm" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "Bẫy vết/điểm ngắt" + +#: signame.c:111 +msgid "Aborted" +msgstr "Bị hủy bỏ" + +#: signame.c:114 +msgid "IOT trap" +msgstr "Bẫy IOT" + +#: signame.c:117 +msgid "EMT trap" +msgstr "Bẫy EMT" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "Ngoại lệ điểm phù động" + +#: signame.c:123 +msgid "Killed" +msgstr "Bị buộc kết thúc" + +#: signame.c:126 +msgid "Bus error" +msgstr "Lỗi mạch nối" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "Lỗi phân đoạn" + +#: signame.c:132 +msgid "Bad system call" +msgstr "Cuộc gọi hệ thống sai" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "Ống dẫn bị ngắt" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "Đồng hồ báo động" + +#: signame.c:141 +msgid "Terminated" +msgstr "Bị kết thúc" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "Tín hiệu tá»± định nghÄ©a 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "Tín hiệu tá»± định nghÄ©a 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "Tiến trình con đã thoát" + +#: signame.c:158 +msgid "Power failure" +msgstr "Bị cúp điện đột ngột" + +#: signame.c:161 +msgid "Stopped" +msgstr "Bị ngừng" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "Bị ngừng (kết nhập tty)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "Bị ngừng (kết xuất tty)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "Bị ngừng (tín hiệu)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "Giới hạn thời gian CPU (đơn vị xá»­ lý trung tâm) bị vượt quá" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "Giới hạn kích cỡ tập tin bị vượt quá" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "Bộ đếm thời gian ảo đã mãn hạn" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "Bộ đếm khi theo dõi cách sá»­ dụng tiềm năng hệ thống đã mãn hạn" + +#: signame.c:188 +msgid "Window changed" +msgstr "Cá»­a sổ đã thay đổi" + +#: signame.c:191 +msgid "Continued" +msgstr "Đã tiếp tục" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "Tình trạng I/O (nhập/xuất) khẩn cấp" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O (nhập/xuất) có thể" + +# Literal: don't translate / NghÄ©a chữ: đừng dịch +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +# Literal: don't translate / NghÄ©a chữ: đừng dịch +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "Tài nguyên bị mất" + +#: signame.c:216 +msgid "Danger signal" +msgstr "Tín hiệu nguy hiểm" + +#: signame.c:219 +msgid "Information request" +msgstr "Yêu cầu thông tin" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "Không có sẵn sàng bộ đồng xá»­ lý điểm phù động" + +#: strcache.c:235 +#, fuzzy, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s # chuỗi trong bộ nhớ tạm chuỗi : %d\n" + +#: strcache.c:237 +#, fuzzy, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s # bộ đệm nhớ tạm chuỗi: %d\n" + +#: strcache.c:239 +#, fuzzy, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s cỡ bộ nhớ tạm chuỗi: tổng = %d / đa = %d / thiểu = %d / tbình = %d\n" + +#: strcache.c:241 +#, fuzzy, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "" +"%s rảnh bộ nhớ tạm chuỗi: tổng = %d / đa = %d / thiểu = %d / tbình = %d\n" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# thống kê bảng băm các tập tin:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "mặc định" + +#: variable.c:1544 +msgid "environment" +msgstr "môi trường" + +#: variable.c:1547 +msgid "makefile" +msgstr "tập tin tạo" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "môi trường dưới « -e »" + +#: variable.c:1553 +msgid "command line" +msgstr "dòng lệnh" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "chỉ thị « override » (đè)" + +#: variable.c:1559 +msgid "automatic" +msgstr "tá»± động" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (từ « %s », dòng %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# thống kê bảng băm lập biến:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# Biến\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Giá trị biến đặc trÆ°ng cho mẫu" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# Không có giá trị biến đặc trÆ°ng cho mẫu" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u giá trị biến đặc trÆ°ng cho mẫu" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "cảnh báo : chÆ°a định nghÄ©a biến « %.*s »" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "việc « search » (tìm kiếm hệ thống) bị lỗi với %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "Cảnh báo : việc chuyển hướng rỗng\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "lỗi nội bộ : tính trạng lệnh « %s »" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "" +"• cảnh báo, có lẽ bạn sẽ phải bật lại khả năng quản lý bằng CTRL-Y từ DCL.\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "BUILTIN RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "Không biết lệnh builtin (có sẵn) « %s »\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "Lỗi, lệnh rỗng\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "Kết nhập đã được chuyển hướng từ %s\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "Lỗi đã được chuyển hướng đến %s\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "Kết xuất đã được chuyển hướng đến %s\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "Kết xuất đã được chuyển hướng đến %s\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "Đang thá»±c hiện %s thay thế\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "Gặp lỗi khi tạo và thá»±c hiện (spawn), %d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# Đường dẫn tìm kiếm VPATH\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# Không có đường dẫn tìm kiếm VPATH nào" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u Đường dẫn tìm kiếm « vpath ».\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# Không có đường dẫn tìm kiếm chung (biến « VPATH »)." + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# Đường dẫn tìm kiếm chung (biến « VPATH »).\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "" +#~ "Việc « process_easy() » (tiến trình dễ) bị lỗi khi cố khởi chạy tiến trình " +#~ "(e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%sPhần mềm này tá»± do; hãy xem mã nguồn để tìm thấy điều kiện sao chép.\n" +#~ "%sKhông bảo đảm gì cả, dù khả năng bán hay khả năng làm việc dứt khoát.\n" +#~ "%s\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "gặp « endef » bắt nguồn ở ngoài" + +#~ msgid "empty `override' directive" +#~ msgstr "chỉ thị « override » (đè) rỗng" + +#~ msgid "invalid `override' directive" +#~ msgstr "chỉ thị « override » (đè) không hợp lệ" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "• cảnh báo, CTRL-Y sẽ để một số tiến trình con còn lại.\n" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "Đừng ghi rõ « -j » hay « --jobs » nếu không sẵn sàng." + +#~ msgid "Resetting make for single job mode." +#~ msgstr "Đang lập lại trình make cho chế độ công việc đơn." diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo new file mode 100644 index 0000000..61cffca Binary files /dev/null and b/po/zh_CN.gmo differ diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..657264f --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,2118 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2002 Free Software Foundation, Inc. +# This file is distributed under the same license as the make package. +# Wang Li , 2002. +# LI Daobing , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: make 3.81\n" +"Report-Msgid-Bugs-To: bug-make@gnu.org\n" +"POT-Creation-Date: 2010-07-28 01:42-0400\n" +"PO-Revision-Date: 2008-02-05 23:44+0800\n" +"Last-Translator: LI Daobing \n" +"Language-Team: Chinese (simplified) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ar.c:48 +#, c-format +msgid "attempt to use unsupported feature: `%s'" +msgstr "试图使用不支持的功能:“%s”" + +#: ar.c:125 +msgid "touch archive member is not available on VMS" +msgstr "VMS 系统上不支持 touch 归档成员" + +#: ar.c:149 +#, c-format +msgid "touch: Archive `%s' does not exist" +msgstr "touch:归档文件“%s”不存在" + +#: ar.c:152 +#, c-format +msgid "touch: `%s' is not a valid archive" +msgstr "touch:“%s”不是合法的归档文件" + +#: ar.c:159 +#, c-format +msgid "touch: Member `%s' does not exist in `%s'" +msgstr "touch:在“%2$s”中不存在成员“%1$s”" + +#: ar.c:166 +#, c-format +msgid "touch: Bad return code from ar_member_touch on `%s'" +msgstr "touch:来自“%s”上的 ar_member_touch 的错误返回码" + +#: arscan.c:69 +#, fuzzy, c-format +msgid "lbr$set_module() failed to extract module info, status = %d" +msgstr "lbr$set_modules 获取模块信息失败,返回状态 = %d" + +#: arscan.c:175 +#, fuzzy, c-format +msgid "lbr$ini_control() failed with status = %d" +msgstr "lbr$ini_control 失败,返回状态 = %d" + +#: arscan.c:187 +#, c-format +msgid "unable to open library `%s' to lookup member `%s'" +msgstr "无法打开库“%s”以寻找成员“%s”" + +#: arscan.c:850 +#, c-format +msgid "Member `%s'%s: %ld bytes at %ld (%ld).\n" +msgstr "成员“%s”%s: %ld 字节在 %ld (%ld)。\n" + +#: arscan.c:851 +msgid " (name might be truncated)" +msgstr " (名称可能被截短)" + +#: arscan.c:853 +#, c-format +msgid " Date %s" +msgstr " 日期 %s" + +#: arscan.c:854 +#, c-format +msgid " uid = %d, gid = %d, mode = 0%o.\n" +msgstr " uid = %d,gid = %d,mode = 0%o。\n" + +#: commands.c:499 +msgid "*** Break.\n" +msgstr "*** 中断。\n" + +#: commands.c:622 +#, c-format +msgid "*** [%s] Archive member `%s' may be bogus; not deleted" +msgstr "*** [%s] 归档成员“%s”可能是假的;未删除" + +#: commands.c:625 +#, c-format +msgid "*** Archive member `%s' may be bogus; not deleted" +msgstr "*** 归档成员“%s”可能是假的;未删除" + +#: commands.c:638 +#, c-format +msgid "*** [%s] Deleting file `%s'" +msgstr "*** [%s] 正在删除文件“%s”" + +#: commands.c:640 +#, c-format +msgid "*** Deleting file `%s'" +msgstr "*** 正在删除文件“%s”" + +#: commands.c:676 +#, fuzzy +msgid "# recipe to execute" +msgstr "# 要执行的命令" + +#: commands.c:679 +msgid " (built-in):" +msgstr " (内置):" + +#: commands.c:681 +#, c-format +msgid " (from `%s', line %lu):\n" +msgstr " (从“%s”,行 %lu):\n" + +#: dir.c:996 +msgid "" +"\n" +"# Directories\n" +msgstr "" +"\n" +"# 目录\n" + +#: dir.c:1008 +#, c-format +msgid "# %s: could not be stat'd.\n" +msgstr "# %s:无法对其进行 stat 操作。\n" + +#: dir.c:1012 +#, c-format +msgid "# %s (key %s, mtime %d): could not be opened.\n" +msgstr "# %s (关键字 %s,修改时间 %d):无法打开。\n" + +#: dir.c:1016 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n" +msgstr "# %s (设备 %d,i-节点 [%d,%d,%d]):无法打开。\n" + +#: dir.c:1021 +#, c-format +msgid "# %s (device %ld, inode %ld): could not be opened.\n" +msgstr "# %s (设备 %ld,i-节点 %ld):无法打开。\n" + +#: dir.c:1048 +#, c-format +msgid "# %s (key %s, mtime %d): " +msgstr "# %s (关键字 %s,修改时间 %d):" + +#: dir.c:1052 +#, c-format +msgid "# %s (device %d, inode [%d,%d,%d]): " +msgstr "# %s (设备 %d,i-节点 [%d,%d,%d]):" + +#: dir.c:1057 +#, c-format +msgid "# %s (device %ld, inode %ld): " +msgstr "# %s (设备 %ld,i-节点 %ld):" + +#: dir.c:1063 dir.c:1084 +msgid "No" +msgstr "无" + +#: dir.c:1066 dir.c:1087 +msgid " files, " +msgstr " 文件, " + +#: dir.c:1068 dir.c:1089 +msgid "no" +msgstr "无" + +#: dir.c:1071 +msgid " impossibilities" +msgstr " 不可能" + +#: dir.c:1075 +msgid " so far." +msgstr " 迄今为止。" + +#: dir.c:1092 +#, c-format +msgid " impossibilities in %lu directories.\n" +msgstr " 不可能在 %lu 目录中。\n" + +#: expand.c:127 +#, c-format +msgid "Recursive variable `%s' references itself (eventually)" +msgstr "递归变量“%s”应用自身 (最终)" + +#: expand.c:276 +msgid "unterminated variable reference" +msgstr "未终止的变量引用" + +#: file.c:267 +#, fuzzy, c-format +msgid "Recipe was specified for file `%s' at %s:%lu," +msgstr "关于文件“%s”的命令在 %s:%lu 处指定," + +#: file.c:272 +#, fuzzy, c-format +msgid "Recipe for file `%s' was found by implicit rule search," +msgstr "关于文件“%s”的命令通过隐含规则搜索而找到," + +#: file.c:275 +#, c-format +msgid "but `%s' is now considered the same file as `%s'." +msgstr "但“%s”现在被看做“%s”的同一个文件。" + +#: file.c:278 +#, fuzzy, c-format +msgid "Recipe for `%s' will be ignored in favor of the one for `%s'." +msgstr "“%2$s”更优先,“%1$s”的命令被忽略。" + +#: file.c:298 +#, c-format +msgid "can't rename single-colon `%s' to double-colon `%s'" +msgstr "无法将单冒号“%s”重命名为双冒号“%s”" + +#: file.c:303 +#, c-format +msgid "can't rename double-colon `%s' to single-colon `%s'" +msgstr "无法将双冒号“%s”重命名为单冒号“%s”" + +#: file.c:392 +#, c-format +msgid "*** Deleting intermediate file `%s'" +msgstr "*** 正在删除中间文件“%s”" + +#: file.c:396 +msgid "Removing intermediate files...\n" +msgstr "正在删除中间文件...\n" + +#: file.c:803 +#, c-format +msgid "%s: Timestamp out of range; substituting %s" +msgstr "%s:时间标记超出范围;正在替换 %s" + +#: file.c:804 +msgid "Current time" +msgstr "当前时间" + +#: file.c:924 +msgid "# Not a target:" +msgstr "# 不是一个目标:" + +#: file.c:929 +msgid "# Precious file (prerequisite of .PRECIOUS)." +msgstr "# 重要文件 (.PRECIOUS的前提)。" + +#: file.c:931 +msgid "# Phony target (prerequisite of .PHONY)." +msgstr "# 假目标 (.PHONY的前提)。" + +#: file.c:933 +#, fuzzy +msgid "# Command line target." +msgstr "# 命令行目标。" + +#: file.c:935 +msgid "# A default, MAKEFILES, or -include/sinclude makefile." +msgstr "# 缺省的、MAKEFILES 指定的、-include/sinclude 包含的 makefile。" + +#: file.c:937 +msgid "# Implicit rule search has been done." +msgstr "# 对隐含规则的搜索已完成。" + +#: file.c:938 +msgid "# Implicit rule search has not been done." +msgstr "# 对隐含规则的搜索尚未完成。" + +#: file.c:940 +#, c-format +msgid "# Implicit/static pattern stem: `%s'\n" +msgstr "# 隐含/静态模式主干:“%s”\n" + +#: file.c:942 +msgid "# File is an intermediate prerequisite." +msgstr "# 文件是一个中间前提。" + +#: file.c:946 +msgid "# Also makes:" +msgstr "# 还要创建:" + +#: file.c:952 +msgid "# Modification time never checked." +msgstr "# 从不检查修改时间。" + +#: file.c:954 +msgid "# File does not exist." +msgstr "# 文件不存在。" + +#: file.c:956 +msgid "# File is very old." +msgstr "# 文件非常陈旧。" + +#: file.c:961 +#, c-format +msgid "# Last modified %s\n" +msgstr "# 最近更新 %s\n" + +#: file.c:964 +msgid "# File has been updated." +msgstr "# 文件已经被更新。" + +#: file.c:964 +msgid "# File has not been updated." +msgstr "# 文件尚未被更新。" + +#: file.c:968 +#, fuzzy +msgid "# Recipe currently running (THIS IS A BUG)." +msgstr "# 正在运行的命令 (这是个错误)。" + +#: file.c:971 +#, fuzzy +msgid "# Dependencies recipe running (THIS IS A BUG)." +msgstr "# 正在运行的依赖性命令 (这是个错误)。" + +#: file.c:980 +msgid "# Successfully updated." +msgstr "# 更新成功。" + +#: file.c:984 +msgid "# Needs to be updated (-q is set)." +msgstr "# 需要更新 (用 -q 设定)。" + +#: file.c:987 +msgid "# Failed to be updated." +msgstr "# 更新失败。" + +#: file.c:990 +msgid "# Invalid value in `update_status' member!" +msgstr "# “update_status”成员中无效的值!" + +#: file.c:997 +msgid "# Invalid value in `command_state' member!" +msgstr "# “command_state”成员中无效的值!" + +#: file.c:1016 +msgid "" +"\n" +"# Files" +msgstr "" +"\n" +"# 文件" + +#: file.c:1020 +msgid "" +"\n" +"# files hash-table stats:\n" +"# " +msgstr "" +"\n" +"# 文件杂凑表状态:\n" +"# " + +#: function.c:758 +msgid "non-numeric first argument to `word' function" +msgstr "“word”函数的第一个参数不是数值参数" + +#: function.c:763 +msgid "first argument to `word' function must be greater than 0" +msgstr "“word”函数的第一个参数必须大于 0" + +#: function.c:783 +msgid "non-numeric first argument to `wordlist' function" +msgstr "“wordlist”函数的第一个参数不是数值参数" + +#: function.c:785 +msgid "non-numeric second argument to `wordlist' function" +msgstr "“wordlist”函数的第二个参数不是数值参数" + +#: function.c:1458 +#, fuzzy, c-format +msgid "windows32_openpipe(): DuplicateHandle(In) failed (e=%ld)\n" +msgstr "创建子进程:复制句柄(In)失败 (e=%ld)\n" + +#: function.c:1469 +#, fuzzy, c-format +msgid "windows32_open_pipe(): DuplicateHandle(Err) failed (e=%ld)\n" +msgstr "创建子进程:复制句柄(Err)失败 (e=%ld)\n" + +#: function.c:1474 +#, c-format +msgid "CreatePipe() failed (e=%ld)\n" +msgstr "CreatePipe() 失败 (e=%ld)\n" + +#: function.c:1479 +#, fuzzy +msgid "windows32_openpipe(): process_init_fd() failed\n" +msgstr "windows32_openpipe ():process_init_fd() 失败\n" + +#: function.c:1728 +#, c-format +msgid "Cleaning up temporary batch file %s\n" +msgstr "正在清除临时批处理文件 %s\n" + +#: function.c:2150 +#, c-format +msgid "insufficient number of arguments (%d) to function `%s'" +msgstr "函数“%2$s”的参数数量(%1$d)不够" + +#: function.c:2162 +#, c-format +msgid "unimplemented on this platform: function `%s'" +msgstr "在本平台上未实现:函数“%s”" + +#: function.c:2212 +#, c-format +msgid "unterminated call to function `%s': missing `%c'" +msgstr "对函数“%s”的未终止的调用:遗漏“%c”" + +#: getopt.c:661 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s:选项“%s”含义不清\n" + +#: getopt.c:685 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s:选项“--%s”不需要参数\n" + +#: getopt.c:690 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s:选项“%c%s”不需要参数\n" + +#: getopt.c:707 getopt.c:880 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s:选项“%s”需要一个参数\n" + +#: getopt.c:736 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s:无法识别的选项“--%s”\n" + +#: getopt.c:740 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s:无法识别的选项“%c%s”\n" + +#: getopt.c:766 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s:非法选项 -- %c\n" + +#: getopt.c:769 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s:非法选项 -- %c\n" + +#: getopt.c:799 getopt.c:929 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s:选项需要一个参数 -- %c\n" + +#: getopt.c:846 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s:选项“-W %s”含义不清\n" + +#: getopt.c:864 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s:选项“-W %s”不允许给出参数\n" + +#: hash.c:49 +#, fuzzy, c-format +msgid "can't allocate %lu bytes for hash table: memory exhausted" +msgstr "无法为杂凑表分配 %ld 字节: 内存耗尽" + +#: hash.c:280 +#, c-format +msgid "Load=%ld/%ld=%.0f%%, " +msgstr "负载=%ld/%ld=%.0f%%, " + +#: hash.c:282 +#, c-format +msgid "Rehash=%d, " +msgstr "重新杂凑=%d, " + +#: hash.c:283 +#, c-format +msgid "Collisions=%ld/%ld=%.0f%%" +msgstr "碰撞=%ld/%ld=%.0f%%" + +#: implicit.c:40 +#, c-format +msgid "Looking for an implicit rule for `%s'.\n" +msgstr "正在为“%s”寻找隐含规则。\n" + +#: implicit.c:56 +#, c-format +msgid "Looking for archive-member implicit rule for `%s'.\n" +msgstr "正在为“%s”寻找归档成员隐含规则。\n" + +#: implicit.c:317 +msgid "Avoiding implicit rule recursion.\n" +msgstr "避免隐含规则递归。\n" + +#: implicit.c:491 +#, c-format +msgid "Trying pattern rule with stem `%.*s'.\n" +msgstr "以主干“%.*s”尝试匹配模式规则。\n" + +#: implicit.c:674 +#, c-format +msgid "Rejecting impossible rule prerequisite `%s'.\n" +msgstr "拒绝不可能的规则前提“%s”。\n" + +#: implicit.c:675 +#, c-format +msgid "Rejecting impossible implicit prerequisite `%s'.\n" +msgstr "拒绝不可能的隐含前提“%s”。\n" + +#: implicit.c:688 +#, c-format +msgid "Trying rule prerequisite `%s'.\n" +msgstr "尝试规则前提“%s”。\n" + +#: implicit.c:689 +#, c-format +msgid "Trying implicit prerequisite `%s'.\n" +msgstr "尝试隐含前提“%s”。\n" + +#: implicit.c:728 +#, c-format +msgid "Found prerequisite `%s' as VPATH `%s'\n" +msgstr "前提“%s”在 VPATH “%s” 中发现\n" + +#: implicit.c:742 +#, c-format +msgid "Looking for a rule with intermediate file `%s'.\n" +msgstr "正在寻找使用中间文件“%s”的规则。\n" + +#: job.c:335 +msgid "Cannot create a temporary file\n" +msgstr "无法创建临时文件\n" + +#: job.c:449 +#, c-format +msgid "*** [%s] Error 0x%x (ignored)" +msgstr "*** [%s] 错误 0x%x (忽略)" + +#: job.c:450 +#, c-format +msgid "*** [%s] Error 0x%x" +msgstr "*** [%s] 错误 0x%x" + +#: job.c:454 +#, c-format +msgid "[%s] Error %d (ignored)" +msgstr "[%s] 错误 %d (忽略)" + +#: job.c:455 +#, c-format +msgid "*** [%s] Error %d" +msgstr "*** [%s] 错误 %d" + +#: job.c:460 +msgid " (core dumped)" +msgstr " (core dumped)" + +#: job.c:549 +msgid "*** Waiting for unfinished jobs...." +msgstr "*** 正在等待未完成的任务...." + +#: job.c:579 +#, fuzzy, c-format +msgid "Live child %p (%s) PID %s %s\n" +msgstr "活跃子进程 0x%08lx (%s) PID %ld %s\n" + +#: job.c:581 job.c:760 job.c:862 job.c:1527 +msgid " (remote)" +msgstr " (远程)" + +#: job.c:758 +#, fuzzy, c-format +msgid "Reaping losing child %p PID %s %s\n" +msgstr "正在中止失败的子进程 0x%08lx PID %ld %s\n" + +#: job.c:759 +#, fuzzy, c-format +msgid "Reaping winning child %p PID %s %s\n" +msgstr "正在中止获胜的子进程 0x%08lx PID %ld %s\n" + +#: job.c:763 +#, c-format +msgid "Cleaning up temp batch file %s\n" +msgstr "正在清除临时批文件 %s\n" + +#: job.c:861 +#, fuzzy, c-format +msgid "Removing child %p PID %s%s from chain.\n" +msgstr "从链中删除子进程 0x%08lx PID %ld%s。\n" + +#: job.c:920 +msgid "write jobserver" +msgstr "写入任务服务器" + +#: job.c:922 +#, fuzzy, c-format +msgid "Released token for child %p (%s).\n" +msgstr "为子进程 0x%08lx (%s) 释放令牌(token)。\n" + +#: job.c:1453 job.c:2094 +#, c-format +msgid "process_easy() failed to launch process (e=%ld)\n" +msgstr "process_easy() 启动进程失败 (e=%ld)\n" + +#: job.c:1457 job.c:2098 +#, c-format +msgid "" +"\n" +"Counted %d args in failed launch\n" +msgstr "" +"\n" +"失败执行中共有 %d 个参数。\n" + +#: job.c:1525 +#, fuzzy, c-format +msgid "Putting child %p (%s) PID %s%s on the chain.\n" +msgstr "将子进程 0x%08lx (%s) PID %ld%s 放入链。\n" + +#: job.c:1778 +#, fuzzy, c-format +msgid "Obtained token for child %p (%s).\n" +msgstr "获得至进程 0x%08lx (%s) 的标记。\n" + +#: job.c:1787 +msgid "read jobs pipe" +msgstr "读取任务管道" + +#: job.c:1798 +#, c-format +msgid "Invoking recipe from %s:%lu to update target `%s'.\n" +msgstr "" + +#: job.c:1802 +#, fuzzy, c-format +msgid "Invoking builtin recipe to update target `%s'.\n" +msgstr "不需要重新创建目标“%s”" + +#: job.c:1910 +msgid "cannot enforce load limits on this operating system" +msgstr "无法在本操作系统中实施负载限制" + +#: job.c:1912 +msgid "cannot enforce load limit: " +msgstr "无法实施负载限制:" + +#: job.c:1985 +msgid "no more file handles: could not duplicate stdin\n" +msgstr "没有剩余的文件句柄: 无法复制标准输入\n" + +#: job.c:1987 +msgid "no more file handles: could not duplicate stdout\n" +msgstr "没有剩余的文件句柄: 无法复制标准输出\n" + +#: job.c:2015 +msgid "Could not restore stdin\n" +msgstr "无法还原标准输入\n" + +#: job.c:2023 +msgid "Could not restore stdout\n" +msgstr "无法还原标准输出\n" + +#: job.c:2127 +#, fuzzy, c-format +msgid "make reaped child pid %s, still waiting for pid %s\n" +msgstr "make 已中止的子进程 pid %ld,仍在等待 pid %ld\n" + +#: job.c:2168 +#, c-format +msgid "%s: Command not found" +msgstr "%s:命令未找到" + +#: job.c:2228 +#, c-format +msgid "%s: Shell program not found" +msgstr "%s:未找到 shell 程序" + +#: job.c:2237 +msgid "spawnvpe: environment space might be exhausted" +msgstr "spawnvpe: 环境变量空间可能会耗尽" + +#: job.c:2461 +#, c-format +msgid "$SHELL changed (was `%s', now `%s')\n" +msgstr "$SHELL 已改变 (原为“%s”,现为“%s”)\n" + +#: job.c:2951 +#, c-format +msgid "Creating temporary batch file %s\n" +msgstr "正在创建临时批文件 %s\n" + +#: job.c:2963 +#, c-format +msgid "" +"Batch file contents:%s\n" +"\t%s\n" +msgstr "" + +#: job.c:3065 +#, c-format +msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n" +msgstr "%s (行 %d) 错误的 shell 上下文 (!unixy && !batch_mode_shell)\n" + +#: main.c:303 +msgid "Options:\n" +msgstr "选项:\n" + +#: main.c:304 +msgid " -b, -m Ignored for compatibility.\n" +msgstr " -b, -m 忽略兼容性。\n" + +#: main.c:306 +msgid " -B, --always-make Unconditionally make all targets.\n" +msgstr " -B, --always-make 无条件 make 所有目标。\n" + +#: main.c:308 +msgid "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" Change to DIRECTORY before doing anything.\n" +msgstr "" +" -C DIRECTORY, --directory=DIRECTORY\n" +" 在执行钱先切换到 DIRECTORY 目录。\n" + +#: main.c:311 +msgid " -d Print lots of debugging information.\n" +msgstr " -d 打印大量调试信息。\n" + +#: main.c:313 +msgid "" +" --debug[=FLAGS] Print various types of debugging information.\n" +msgstr " --debug[=FLAGS] 打印各种调试信息。\n" + +#: main.c:315 +msgid "" +" -e, --environment-overrides\n" +" Environment variables override makefiles.\n" +msgstr "" +" -e, --environment-overrides\n" +" 环境变量覆盖 makefile 中的变量。\n" + +#: main.c:318 +msgid "" +" --eval=STRING Evaluate STRING as a makefile statement.\n" +msgstr "" + +#: main.c:320 +msgid "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" Read FILE as a makefile.\n" +msgstr "" +" -f FILE, --file=FILE, --makefile=FILE\n" +" 从 FILE 中读入 makefile。\n" + +#: main.c:323 +msgid " -h, --help Print this message and exit.\n" +msgstr " -h, --help 打印该消息并退出。\n" + +#: main.c:325 +#, fuzzy +msgid " -i, --ignore-errors Ignore errors from recipes.\n" +msgstr " -i, --ignore-errors 忽略来自命令的错误。\n" + +#: main.c:327 +msgid "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" Search DIRECTORY for included makefiles.\n" +msgstr "" +" -I DIRECTORY, --include-dir=DIRECTORY\n" +" 在 DIRECTORY 中搜索被包含的 makefile。\n" + +#: main.c:330 +msgid "" +" -j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no " +"arg.\n" +msgstr "" +" -j [N], --jobs[=N] 同时允许 N 个任务;无参数表明允许无限个任务。\n" + +#: main.c:332 +msgid "" +" -k, --keep-going Keep going when some targets can't be made.\n" +msgstr " -k, --keep-going 当某些目标无法创建时仍然继续。\n" + +#: main.c:334 +msgid "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" Don't start multiple jobs unless load is below " +"N.\n" +msgstr "" +" -l [N], --load-average[=N], --max-load[=N]\n" +" 在系统负载高于 N 时不启动多任务。\n" + +#: main.c:337 +msgid "" +" -L, --check-symlink-times Use the latest mtime between symlinks and " +"target.\n" +msgstr "" +" -L, --check-symlink-times 使用软链接及软链接目标中修改时间较晚的一个。\n" + +#: main.c:339 +#, fuzzy +msgid "" +" -n, --just-print, --dry-run, --recon\n" +" Don't actually run any recipe; just print " +"them.\n" +msgstr "" +" -n, --just-print, --dry-run, --recon\n" +" 只打印命令,不实际执行。\n" + +#: main.c:342 +msgid "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" Consider FILE to be very old and don't remake " +"it.\n" +msgstr "" +" -o FILE, --old-file=FILE, --assume-old=FILE\n" +" 将 FILE 当做很旧,不必重新生成。\n" + +#: main.c:345 +msgid " -p, --print-data-base Print make's internal database.\n" +msgstr " -p, --print-data-base 打印 make 的内部数据库。\n" + +#: main.c:347 +#, fuzzy +msgid "" +" -q, --question Run no recipe; exit status says if up to " +"date.\n" +msgstr "" +" -q, --question 不运行任何命令;退出状态说明是否已全部更新。\n" + +#: main.c:349 +msgid " -r, --no-builtin-rules Disable the built-in implicit rules.\n" +msgstr " -r, --no-builtin-rules 禁用内置隐含规则。\n" + +#: main.c:351 +msgid " -R, --no-builtin-variables Disable the built-in variable settings.\n" +msgstr " -R, --no-builtin-variables 禁用内置变量设置。\n" + +#: main.c:353 +#, fuzzy +msgid " -s, --silent, --quiet Don't echo recipes.\n" +msgstr " -s, --silent, --quiet 不输出命令。\n" + +#: main.c:355 +msgid "" +" -S, --no-keep-going, --stop\n" +" Turns off -k.\n" +msgstr "" +" -S, --no-keep-going, --stop\n" +" 关闭 -k。\n" + +#: main.c:358 +msgid " -t, --touch Touch targets instead of remaking them.\n" +msgstr " -t, --touch touch 目标而不是重新创建它们。\n" + +#: main.c:360 +msgid "" +" -v, --version Print the version number of make and exit.\n" +msgstr " -v, --version 打印 make 的版本号并退出。\n" + +#: main.c:362 +msgid " -w, --print-directory Print the current directory.\n" +msgstr " -w, --print-directory 打印当前目录。\n" + +#: main.c:364 +msgid "" +" --no-print-directory Turn off -w, even if it was turned on " +"implicitly.\n" +msgstr " --no-print-directory 关闭 -w,即使 -w 默认开启。\n" + +#: main.c:366 +msgid "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" Consider FILE to be infinitely new.\n" +msgstr "" +" -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n" +" 将 FILE 当做最新。\n" + +#: main.c:369 +msgid "" +" --warn-undefined-variables Warn when an undefined variable is " +"referenced.\n" +msgstr " --warn-undefined-variables 当引用未定义变量的时候发出警告。\n" + +#: main.c:564 +msgid "empty string invalid as file name" +msgstr "空字符串是无效的文件名" + +#: main.c:650 +#, c-format +msgid "unknown debug level specification `%s'" +msgstr "未知的调试级别“%s”" + +#: main.c:690 +#, fuzzy, c-format +msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n" +msgstr "%s:捕获中断/异常 (代码 = 0x%lx, 地址 = 0x%lx)\n" + +#: main.c:697 +#, fuzzy, c-format +msgid "" +"\n" +"Unhandled exception filter called from program %s\n" +"ExceptionCode = %lx\n" +"ExceptionFlags = %lx\n" +"ExceptionAddress = 0x%p\n" +msgstr "" +"\n" +"从程序 %s 产生的未处理的异常过滤器\n" +"异常码 = %lx\n" +"异常标志 = %lx\n" +"异常地址 = %lx\n" + +#: main.c:705 +#, fuzzy, c-format +msgid "Access violation: write operation at address 0x%p\n" +msgstr "访问冲突:地址 %lx 处的写操作\n" + +#: main.c:706 +#, fuzzy, c-format +msgid "Access violation: read operation at address 0x%p\n" +msgstr "访问冲突:地址 %lx处的读操作\n" + +#: main.c:781 main.c:792 +#, fuzzy, c-format +msgid "find_and_set_shell() setting default_shell = %s\n" +msgstr "find_and_set_shell 设置 default_shell = %s\n" + +#: main.c:834 +#, fuzzy, c-format +msgid "find_and_set_shell() path search set default_shell = %s\n" +msgstr "find_and_set_shell 路径搜索结果设置 default_shell = %s\n" + +#: main.c:1273 +#, c-format +msgid "%s is suspending for 30 seconds..." +msgstr "%s 正在挂起 30 秒..." + +#: main.c:1275 +#, c-format +msgid "done sleep(30). Continuing.\n" +msgstr "睡眠完成(30)。继续。\n" + +#: main.c:1501 +msgid "Makefile from standard input specified twice." +msgstr "两次指明来自标准输入的 makefile。" + +#: main.c:1539 vmsjobs.c:500 +msgid "fopen (temporary file)" +msgstr "fopen (临时文件)" + +#: main.c:1545 +msgid "fwrite (temporary file)" +msgstr "fwrite (临时文件)" + +#: main.c:1703 +msgid "Parallel jobs (-j) are not supported on this platform." +msgstr "本平台不支持并行任务 (-j)。" + +#: main.c:1704 +msgid "Resetting to single job (-j1) mode." +msgstr "重置为单任务模式 (-j1)。" + +#: main.c:1719 +msgid "internal error: multiple --jobserver-fds options" +msgstr "内部错误:多个 --jobserver-fds 选项" + +#: main.c:1727 +#, c-format +msgid "internal error: invalid --jobserver-fds string `%s'" +msgstr "内部错误:非法 --jobserver-fds 字符串“%s”" + +#: main.c:1730 +#, c-format +msgid "Jobserver client (fds %d,%d)\n" +msgstr "" + +#: main.c:1740 +msgid "warning: -jN forced in submake: disabling jobserver mode." +msgstr "警告: 子 make 中强制 -jN: 关闭 jobserver 模式。" + +#: main.c:1750 +msgid "dup jobserver" +msgstr "复制任务服务器" + +#: main.c:1753 +msgid "" +"warning: jobserver unavailable: using -j1. Add `+' to parent make rule." +msgstr "警告: jobserver 不存在: 使用 -j1。添加 “+” 到父 make 的规则。" + +#: main.c:1777 +msgid "creating jobs pipe" +msgstr "正在创建任务管道" + +#: main.c:1792 +msgid "init jobserver pipe" +msgstr "创始化任务服务器管道" + +#: main.c:1812 +msgid "Symbolic links not supported: disabling -L." +msgstr "不支持软链接: 关闭 -L" + +#: main.c:1892 +msgid "Updating makefiles....\n" +msgstr "正在更新 makefile....\n" + +#: main.c:1917 +#, c-format +msgid "Makefile `%s' might loop; not remaking it.\n" +msgstr "Makefile “%s”可能循环;不会重新创建它。\n" + +#: main.c:1996 +#, c-format +msgid "Failed to remake makefile `%s'." +msgstr "重新创建 makefile “%s” 失败。" + +#: main.c:2013 +#, c-format +msgid "Included makefile `%s' was not found." +msgstr "找不到被引入的 makefile “%s”" + +#: main.c:2018 +#, c-format +msgid "Makefile `%s' was not found" +msgstr "找不到 makefile “%s”" + +#: main.c:2086 +msgid "Couldn't change back to original directory." +msgstr "无法回到原始目录。" + +#: main.c:2102 +#, c-format +msgid "Re-executing[%u]:" +msgstr "重新执行[%u]:" + +#: main.c:2215 +msgid "unlink (temporary file): " +msgstr "删除 (临时文件):" + +#: main.c:2247 +msgid ".DEFAULT_GOAL contains more than one target" +msgstr ".DEFAULT_GOAL 包含多余一个目标" + +#: main.c:2270 +msgid "No targets specified and no makefile found" +msgstr "没有指明目标并且找不到 makefile" + +#: main.c:2272 +msgid "No targets" +msgstr "无目标" + +#: main.c:2277 +msgid "Updating goal targets....\n" +msgstr "更新目标....\n" + +#: main.c:2306 +msgid "warning: Clock skew detected. Your build may be incomplete." +msgstr "警告:检测到时钟错误。您的创建可能是不完整的。" + +#: main.c:2470 +#, c-format +msgid "Usage: %s [options] [target] ...\n" +msgstr "用法:%s [选项] [目标] ...\n" + +#: main.c:2476 +#, c-format +msgid "" +"\n" +"This program built for %s\n" +msgstr "" +"\n" +"该程序为 %s 编译\n" + +#: main.c:2478 +#, c-format +msgid "" +"\n" +"This program built for %s (%s)\n" +msgstr "" +"\n" +"该程序为 %s (%s) 编译\n" + +#: main.c:2481 +#, c-format +msgid "Report bugs to \n" +msgstr "报告错误到 \n" + +#: main.c:2562 +#, fuzzy, c-format +msgid "the `%s%s' option requires a non-empty string argument" +msgstr "“-%c”选项需要非空字符串参数" + +#: main.c:2617 +#, c-format +msgid "the `-%c' option requires a positive integral argument" +msgstr "“-%c”选项需要正整数参数" + +#: main.c:3054 +#, fuzzy, c-format +msgid "%sBuilt for %s\n" +msgstr "" +"\n" +"%s该程序为 %s 编译\n" + +#: main.c:3056 +#, fuzzy, c-format +msgid "%sBuilt for %s (%s)\n" +msgstr "" +"\n" +"%s该程序为 %s (%s) 编译\n" + +#: main.c:3066 +#, c-format +msgid "" +"%sLicense GPLv3+: GNU GPL version 3 or later \n" +"%sThis is free software: you are free to change and redistribute it.\n" +"%sThere is NO WARRANTY, to the extent permitted by law.\n" +msgstr "" + +#: main.c:3086 +#, c-format +msgid "" +"\n" +"# Make data base, printed on %s" +msgstr "" +"\n" +"# make 数据基础,打印在 %s" + +#: main.c:3096 +#, c-format +msgid "" +"\n" +"# Finished Make data base on %s\n" +msgstr "" +"\n" +"# 在 %s 上完成 make 数据基础\n" + +#: main.c:3237 +#, c-format +msgid "%s: Entering an unknown directory\n" +msgstr "%s: 进入一个未知的目录\n" + +#: main.c:3239 +#, c-format +msgid "%s: Leaving an unknown directory\n" +msgstr "%s: 离开一个未知的目录\n" + +#: main.c:3242 +#, c-format +msgid "%s: Entering directory `%s'\n" +msgstr "%s: 进入目录“%s”\n" + +#: main.c:3245 +#, c-format +msgid "%s: Leaving directory `%s'\n" +msgstr "%s: 离开目录“%s”\n" + +#: main.c:3250 +#, c-format +msgid "%s[%u]: Entering an unknown directory\n" +msgstr "%s[%u]: 进入一个未知的目录\n" + +#: main.c:3253 +#, c-format +msgid "%s[%u]: Leaving an unknown directory\n" +msgstr "%s[%u]: 离开一个未知的目录\n" + +#: main.c:3257 +#, c-format +msgid "%s[%u]: Entering directory `%s'\n" +msgstr "%s[%u]: 进入目录“%s”\n" + +#: main.c:3260 +#, c-format +msgid "%s[%u]: Leaving directory `%s'\n" +msgstr "%s[%u]: 离开目录“%s”\n" + +#: misc.c:316 +msgid ". Stop.\n" +msgstr "。 停止。\n" + +#: misc.c:337 +#, c-format +msgid "Unknown error %d" +msgstr "未知错误 %d" + +#: misc.c:347 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: misc.c:355 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: misc.c:376 misc.c:387 misc.c:402 misc.c:419 misc.c:438 read.c:3118 +msgid "virtual memory exhausted" +msgstr "虚拟内存耗尽" + +#: misc.c:708 +#, c-format +msgid "%s: user %lu (real %lu), group %lu (real %lu)\n" +msgstr "%s: 用户 %lu (真实用户 %lu), 组 %lu (真实组 %lu)\n" + +#: misc.c:729 +msgid "Initialized access" +msgstr "初始化成功" + +#: misc.c:808 +msgid "User access" +msgstr "用户权限" + +#: misc.c:856 +msgid "Make access" +msgstr "Make 权限" + +#: misc.c:890 +msgid "Child access" +msgstr "子进程 权限" + +#: misc.c:954 +#, c-format +msgid "write error: %s" +msgstr "写错误: %s" + +#: misc.c:956 +msgid "write error" +msgstr "写错误" + +#: read.c:179 +msgid "Reading makefiles...\n" +msgstr "正在读入 makefiles...\n" + +#: read.c:333 +#, c-format +msgid "Reading makefile `%s'" +msgstr "正在读入 makefile “%s”" + +#: read.c:335 +#, c-format +msgid " (no default goal)" +msgstr " (没有缺省目标)" + +#: read.c:337 +#, c-format +msgid " (search path)" +msgstr " (搜索路径)" + +#: read.c:339 +#, c-format +msgid " (don't care)" +msgstr " (不用理)" + +#: read.c:341 +#, c-format +msgid " (no ~ expansion)" +msgstr " (没有 ~ 扩展)" + +#: read.c:759 +msgid "invalid syntax in conditional" +msgstr "条件中含有无效语法" + +#: read.c:891 +#, fuzzy +msgid "recipe commences before first target" +msgstr "命令在第一个目标前开始" + +#: read.c:940 +#, fuzzy +msgid "missing rule before recipe" +msgstr "命令之前遗漏了规则" + +#: read.c:1027 +#, c-format +msgid "missing separator%s" +msgstr "遗漏分隔符 %s" + +#: read.c:1029 +msgid " (did you mean TAB instead of 8 spaces?)" +msgstr " (您的意思是用 TAB 代替 8 个空格?)" + +#: read.c:1163 +msgid "missing target pattern" +msgstr "无目标匹配" + +#: read.c:1165 +msgid "multiple target patterns" +msgstr "多个目标匹配" + +#: read.c:1169 +#, c-format +msgid "target pattern contains no `%%'" +msgstr "目标模式不含有“%%”" + +#: read.c:1293 +msgid "missing `endif'" +msgstr "遗漏“endif”" + +#: read.c:1332 read.c:1377 variable.c:1488 +msgid "empty variable name" +msgstr "空变量名" + +#: read.c:1367 +#, fuzzy +msgid "extraneous text after `define' directive" +msgstr "“endef”指令后含有不该出现的文字" + +#: read.c:1392 +msgid "missing `endef', unterminated `define'" +msgstr "遗漏“endef”,未终止的“define”" + +#: read.c:1420 +#, fuzzy +msgid "extraneous text after `endef' directive" +msgstr "“endef”指令后含有不该出现的文字" + +#: read.c:1490 +#, c-format +msgid "Extraneous text after `%s' directive" +msgstr "在“%s”指令之后含有不该出现的文字" + +#: read.c:1499 read.c:1513 +#, c-format +msgid "extraneous `%s'" +msgstr "不该出现的“%s”" + +#: read.c:1518 +msgid "only one `else' per conditional" +msgstr "每个条件只能有一个“else”" + +#: read.c:1797 +msgid "Malformed target-specific variable definition" +msgstr "畸形的针对目标的标量定义" + +#: read.c:1855 +#, fuzzy +msgid "prerequisites cannot be defined in recipes" +msgstr "依赖无法在命令脚本中定义" + +#: read.c:1908 +msgid "mixed implicit and static pattern rules" +msgstr "混和的隐含和静态模式规则" + +#: read.c:1931 read.c:2112 +msgid "mixed implicit and normal rules" +msgstr "混和的隐含和普通规则" + +#: read.c:1976 +#, c-format +msgid "target `%s' doesn't match the target pattern" +msgstr "目标“%s”不匹配目标模式" + +#: read.c:1991 read.c:2036 +#, c-format +msgid "target file `%s' has both : and :: entries" +msgstr "目标文件“%s”含有 : 和 :: 两种条目" + +#: read.c:1997 +#, c-format +msgid "target `%s' given more than once in the same rule." +msgstr "目标“%s”在同一个规则中给出了多次。" + +#: read.c:2006 +#, fuzzy, c-format +msgid "warning: overriding recipe for target `%s'" +msgstr "警告:覆盖关于目标“%s”的命令" + +#: read.c:2009 +#, fuzzy, c-format +msgid "warning: ignoring old recipe for target `%s'" +msgstr "警告:忽略关于目标“%s”的旧命令" + +#: read.c:2392 +msgid "warning: NUL character seen; rest of line ignored" +msgstr "警告:遇到了 NUL 字符;忽略行的剩余部分" + +#: remake.c:234 +#, c-format +msgid "Nothing to be done for `%s'." +msgstr "对“%s”无需做任何事。" + +#: remake.c:235 +#, c-format +msgid "`%s' is up to date." +msgstr "“%s”是最新的。" + +#: remake.c:306 +#, c-format +msgid "Pruning file `%s'.\n" +msgstr "正在删除文件“%s”。\n" + +#: remake.c:359 +#, c-format +msgid "%sNo rule to make target `%s'%s" +msgstr "%s没有规则可以创建目标“%s”%s" + +#: remake.c:361 +#, c-format +msgid "%sNo rule to make target `%s', needed by `%s'%s" +msgstr "%1$s没有规则可以创建“%3$s”%4$s需要的目标“%2$s”" + +#: remake.c:413 +#, c-format +msgid "Considering target file `%s'.\n" +msgstr "正在考虑目标文件“%s”。\n" + +#: remake.c:420 +#, c-format +msgid "Recently tried and failed to update file `%s'.\n" +msgstr "最近已尝试过更新文件“%s”并失败。\n" + +#: remake.c:432 +#, c-format +msgid "File `%s' was considered already.\n" +msgstr "已考虑过文件“%s”。\n" + +#: remake.c:442 +#, c-format +msgid "Still updating file `%s'.\n" +msgstr "仍然在更新文件“%s”。\n" + +#: remake.c:445 +#, c-format +msgid "Finished updating file `%s'.\n" +msgstr "更新文件“%s”完成。\n" + +#: remake.c:474 +#, c-format +msgid "File `%s' does not exist.\n" +msgstr "文件“%s”不存在。\n" + +#: remake.c:481 +#, c-format +msgid "" +"*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp" +msgstr "*** 警告: .LOW_RESOLUTION_TIME 文件 `%s' 有一个精细的时间标志" + +#: remake.c:494 remake.c:1016 +#, c-format +msgid "Found an implicit rule for `%s'.\n" +msgstr "找到一条关于“%s”的隐含规则。\n" + +#: remake.c:496 remake.c:1018 +#, c-format +msgid "No implicit rule found for `%s'.\n" +msgstr "找不到关于“%s”的隐含规则。\n" + +#: remake.c:502 +#, fuzzy, c-format +msgid "Using default recipe for `%s'.\n" +msgstr "使用关于“%s”的默认命令。\n" + +#: remake.c:535 remake.c:1057 +#, c-format +msgid "Circular %s <- %s dependency dropped." +msgstr "放弃循环依赖 %s <- %s 。" + +#: remake.c:651 +#, c-format +msgid "Finished prerequisites of target file `%s'.\n" +msgstr "目标文件“%s”的前提已完成。\n" + +#: remake.c:657 +#, c-format +msgid "The prerequisites of `%s' are being made.\n" +msgstr "正在创建“%s”的前提。\n" + +#: remake.c:670 +#, c-format +msgid "Giving up on target file `%s'.\n" +msgstr "放弃目标文件“%s”。\n" + +#: remake.c:675 +#, c-format +msgid "Target `%s' not remade because of errors." +msgstr "由于错误目标“%s”并未重新创建。" + +#: remake.c:727 +#, c-format +msgid "Prerequisite `%s' is order-only for target `%s'.\n" +msgstr "“%s”是目标“%s”的一个仅用于指定执行顺序(order-only)的前提。\n" + +#: remake.c:732 +#, c-format +msgid "Prerequisite `%s' of target `%s' does not exist.\n" +msgstr "目标“%2$s”的前提“%1$s”不存在。\n" + +#: remake.c:737 +#, c-format +msgid "Prerequisite `%s' is newer than target `%s'.\n" +msgstr "前提“%s”比目标“%s”新。\n" + +#: remake.c:740 +#, c-format +msgid "Prerequisite `%s' is older than target `%s'.\n" +msgstr "前提“%s”比目标“%s”旧。\n" + +#: remake.c:758 +#, c-format +msgid "Target `%s' is double-colon and has no prerequisites.\n" +msgstr "目标“%s”是双冒号目标并且没有前提。\n" + +#: remake.c:765 +#, fuzzy, c-format +msgid "No recipe for `%s' and no prerequisites actually changed.\n" +msgstr "没有关于“%s”的命令,并且实际上改变了的前提。\n" + +#: remake.c:770 +#, c-format +msgid "Making `%s' due to always-make flag.\n" +msgstr "由于 always-make 标志所以 make “%s”。\n" + +#: remake.c:778 +#, c-format +msgid "No need to remake target `%s'" +msgstr "不需要重新创建目标“%s”" + +#: remake.c:780 +#, c-format +msgid "; using VPATH name `%s'" +msgstr ";使用 VPATH 名称“%s”" + +#: remake.c:800 +#, c-format +msgid "Must remake target `%s'.\n" +msgstr "必须重新创建目标“%s”。\n" + +#: remake.c:806 +#, c-format +msgid " Ignoring VPATH name `%s'.\n" +msgstr " 忽略 VPATH 名称 `%s'。\n" + +#: remake.c:815 +#, fuzzy, c-format +msgid "Recipe of `%s' is being run.\n" +msgstr "“%s”的命令正在被执行。\n" + +#: remake.c:822 +#, c-format +msgid "Failed to remake target file `%s'.\n" +msgstr "重新创建目标文件“%s”失败。\n" + +#: remake.c:825 +#, c-format +msgid "Successfully remade target file `%s'.\n" +msgstr "重新创建目标文件“%s”成功。\n" + +#: remake.c:828 +#, c-format +msgid "Target file `%s' needs remade under -q.\n" +msgstr "目标文件“%s”需要以 -q 选项重新创建。\n" + +#: remake.c:1024 +#, c-format +msgid "Using default commands for `%s'.\n" +msgstr "使用关于“%s”的默认命令。\n" + +#: remake.c:1357 +#, c-format +msgid "Warning: File `%s' has modification time in the future" +msgstr "警告:文件“%s”的修改时间在未来" + +#: remake.c:1370 +#, fuzzy, c-format +msgid "Warning: File `%s' has modification time %s s in the future" +msgstr "警告:文件“%s”的修改时间在 %.2g 秒后" + +#: remake.c:1569 +#, c-format +msgid ".LIBPATTERNS element `%s' is not a pattern" +msgstr ".LIBPATTERNS 的元素“%s”不是一个模式" + +#: remote-cstms.c:125 +#, c-format +msgid "Customs won't export: %s\n" +msgstr "用户不希望导出:%s\n" + +#: rule.c:499 +msgid "" +"\n" +"# Implicit Rules" +msgstr "" +"\n" +"# 隐含规则。" + +#: rule.c:514 +msgid "" +"\n" +"# No implicit rules." +msgstr "" +"\n" +"# 没有隐含规则。" + +#: rule.c:517 +#, c-format +msgid "" +"\n" +"# %u implicit rules, %u" +msgstr "" +"\n" +"# %u 条隐含规则,%u" + +#: rule.c:526 +msgid " terminal." +msgstr " 终端。" + +#: rule.c:534 +#, fuzzy, c-format +msgid "BUG: num_pattern_rules is wrong! %u != %u" +msgstr "错误:num_pattern_rules 出错!%u != %u" + +#: signame.c:86 +msgid "unknown signal" +msgstr "未知的信号" + +#: signame.c:94 +msgid "Hangup" +msgstr "挂起" + +#: signame.c:97 +msgid "Interrupt" +msgstr "中断" + +#: signame.c:100 +msgid "Quit" +msgstr "退出" + +#: signame.c:103 +msgid "Illegal Instruction" +msgstr "非法指令" + +#: signame.c:106 +msgid "Trace/breakpoint trap" +msgstr "跟踪/断点陷阱" + +#: signame.c:111 +msgid "Aborted" +msgstr "已失败" + +#: signame.c:114 +msgid "IOT trap" +msgstr "IOT 陷阱" + +#: signame.c:117 +msgid "EMT trap" +msgstr "EMT 陷阱" + +#: signame.c:120 +msgid "Floating point exception" +msgstr "浮点数异常" + +#: signame.c:123 +msgid "Killed" +msgstr "已杀死" + +#: signame.c:126 +msgid "Bus error" +msgstr "总线错误" + +#: signame.c:129 +msgid "Segmentation fault" +msgstr "段错误" + +#: signame.c:132 +msgid "Bad system call" +msgstr "错误的系统调用" + +#: signame.c:135 +msgid "Broken pipe" +msgstr "断开的管道" + +#: signame.c:138 +msgid "Alarm clock" +msgstr "闹钟" + +#: signame.c:141 +msgid "Terminated" +msgstr "已终止" + +#: signame.c:144 +msgid "User defined signal 1" +msgstr "用户定义信号 1" + +#: signame.c:147 +msgid "User defined signal 2" +msgstr "用户定义信号 2" + +#: signame.c:152 signame.c:155 +msgid "Child exited" +msgstr "子进程已退出" + +#: signame.c:158 +msgid "Power failure" +msgstr "电源失效" + +#: signame.c:161 +msgid "Stopped" +msgstr "已停止" + +#: signame.c:164 +msgid "Stopped (tty input)" +msgstr "已停止 (tty 输入)" + +#: signame.c:167 +msgid "Stopped (tty output)" +msgstr "已停止 (tty 输出)" + +#: signame.c:170 +msgid "Stopped (signal)" +msgstr "已停止 (信号)" + +#: signame.c:173 +msgid "CPU time limit exceeded" +msgstr "CPU 时间超出限制" + +#: signame.c:176 +msgid "File size limit exceeded" +msgstr "文件大小超出限制" + +#: signame.c:179 +msgid "Virtual timer expired" +msgstr "虚拟时钟超时" + +#: signame.c:182 +msgid "Profiling timer expired" +msgstr "测试时钟超市" + +#: signame.c:188 +msgid "Window changed" +msgstr "窗口已改变" + +#: signame.c:191 +msgid "Continued" +msgstr "继续" + +#: signame.c:194 +msgid "Urgent I/O condition" +msgstr "紧急 I/O 条件" + +#: signame.c:201 signame.c:210 +msgid "I/O possible" +msgstr "I/O 可行" + +#: signame.c:204 +msgid "SIGWIND" +msgstr "SIGWIND" + +#: signame.c:207 +msgid "SIGPHONE" +msgstr "SIGPHONE" + +#: signame.c:213 +msgid "Resource lost" +msgstr "资源丢失" + +#: signame.c:216 +msgid "Danger signal" +msgstr "危险信号" + +#: signame.c:219 +msgid "Information request" +msgstr "信息请求" + +#: signame.c:222 +msgid "Floating point co-processor not available" +msgstr "浮点数协处理器不可用" + +#: strcache.c:235 +#, fuzzy, c-format +msgid "" +"\n" +"%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n" +msgstr "" +"\n" +"%s strcache 中的字符串数量: %d\n" + +#: strcache.c:237 +#, fuzzy, c-format +msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n" +msgstr "%s strcache 缓冲区数量: %d\n" + +#: strcache.c:239 +#, fuzzy, c-format +msgid "%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s strcache 大小: 总共 = %d / 最大 = %d / 最小 = %d / 平均 = %d\n" + +#: strcache.c:241 +#, fuzzy, c-format +msgid "%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n" +msgstr "%s strcache 剩余: 总共 = %d / 最大 = %d / 最小 = %d / 平均 = %d\n" + +#: strcache.c:244 +#, fuzzy +msgid "" +"\n" +"# strcache hash-table stats:\n" +"# " +msgstr "" +"\n" +"# 文件杂凑表状态:\n" +"# " + +#: variable.c:1541 +msgid "default" +msgstr "默认" + +#: variable.c:1544 +msgid "environment" +msgstr "环境" + +#: variable.c:1547 +msgid "makefile" +msgstr "makefile" + +#: variable.c:1550 +msgid "environment under -e" +msgstr "-e 指定的环境变量" + +#: variable.c:1553 +msgid "command line" +msgstr "命令行" + +#: variable.c:1556 +msgid "`override' directive" +msgstr "“override”指令" + +#: variable.c:1559 +msgid "automatic" +msgstr "自动" + +#: variable.c:1570 +#, c-format +msgid " (from `%s', line %lu)" +msgstr " (从“%s”,行 %lu)" + +#: variable.c:1612 +msgid "# variable set hash-table stats:\n" +msgstr "# 变量的杂凑表状态:\n" + +#: variable.c:1623 +msgid "" +"\n" +"# Variables\n" +msgstr "" +"\n" +"# 变量\n" + +#: variable.c:1627 +msgid "" +"\n" +"# Pattern-specific Variable Values" +msgstr "" +"\n" +"# Pattern-specific 变量值" + +#: variable.c:1641 +msgid "" +"\n" +"# No pattern-specific variable values." +msgstr "" +"\n" +"# 没有 pattern-specific 变量的值。" + +#: variable.c:1643 +#, c-format +msgid "" +"\n" +"# %u pattern-specific variable values" +msgstr "" +"\n" +"# %u 个 pattern-specific 变量的值" + +#: variable.h:219 +#, c-format +msgid "warning: undefined variable `%.*s'" +msgstr "警告:未定义的变量“%.*s”" + +#: vmsfunctions.c:92 +#, fuzzy, c-format +msgid "sys$search() failed with %d\n" +msgstr "sys$search 失败并返回 %d\n" + +#: vmsjobs.c:71 +#, c-format +msgid "Warning: Empty redirection\n" +msgstr "警告:空的重定向\n" + +#: vmsjobs.c:184 +#, c-format +msgid "internal error: `%s' command_state" +msgstr "内部错误:“%s” command_state" + +#: vmsjobs.c:289 +#, c-format +msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n" +msgstr "-警告, 你可能必须从 DCL 重新启用 CTRL-Y。\n" + +#: vmsjobs.c:421 +#, c-format +msgid "BUILTIN [%s][%s]\n" +msgstr "BUILTIN [%s][%s]\n" + +#: vmsjobs.c:432 +#, c-format +msgid "BUILTIN CD %s\n" +msgstr "BUILTIN CD %s\n" + +#: vmsjobs.c:450 +#, c-format +msgid "BUILTIN RM %s\n" +msgstr "BUILTIN RM %s\n" + +#: vmsjobs.c:471 +#, c-format +msgid "Unknown builtin command '%s'\n" +msgstr "未知的内置命令“%s”\n" + +#: vmsjobs.c:493 +#, c-format +msgid "Error, empty command\n" +msgstr "错误,空命令\n" + +#: vmsjobs.c:506 +#, c-format +msgid "Redirected input from %s\n" +msgstr "来自 %s 的重定向输入\n" + +#: vmsjobs.c:513 +#, c-format +msgid "Redirected error to %s\n" +msgstr "到 %s 的重定向错误输出\n" + +#: vmsjobs.c:523 +#, fuzzy, c-format +msgid "Append output to %s\n" +msgstr "到 %s 的重定向输出\n" + +#: vmsjobs.c:529 +#, c-format +msgid "Redirected output to %s\n" +msgstr "到 %s 的重定向输出\n" + +#: vmsjobs.c:599 +#, c-format +msgid "Append %.*s and cleanup\n" +msgstr "" + +#: vmsjobs.c:606 +#, c-format +msgid "Executing %s instead\n" +msgstr "执行 %s 作为替代\n" + +#: vmsjobs.c:712 +#, c-format +msgid "Error spawning, %d\n" +msgstr "错误产生,%d\n" + +#: vpath.c:586 +msgid "" +"\n" +"# VPATH Search Paths\n" +msgstr "" +"\n" +"# VPATH 搜索路径\n" + +#: vpath.c:603 +msgid "# No `vpath' search paths." +msgstr "# 没有“vpath”搜索路径。" + +#: vpath.c:605 +#, c-format +msgid "" +"\n" +"# %u `vpath' search paths.\n" +msgstr "" +"\n" +"# %u “vpath”搜索路径。\n" + +#: vpath.c:608 +msgid "" +"\n" +"# No general (`VPATH' variable) search path." +msgstr "" +"\n" +"# 没有通用搜索路径(“VPATH”变量)。" + +#: vpath.c:614 +msgid "" +"\n" +"# General (`VPATH' variable) search path:\n" +"# " +msgstr "" +"\n" +"# 通用搜索路径(“VPATH”变量):\n" +"# " + +#~ msgid "process_easy() failed failed to launch process (e=%ld)\n" +#~ msgstr "process_easy() 启动进程失败 (e=%ld)\n" + +#~ msgid "" +#~ "%sThis is free software; see the source for copying conditions.\n" +#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n" +#~ "%sPARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "%s该程序为自由软件,详情可参阅版权条款。在法律允许的范围内\n" +#~ "%s我们不作任何担保,这包含但不限于任何商业适售性以及针对特\n" +#~ "%s定目的的适用性的担保。\n" + +#~ msgid "extraneous `endef'" +#~ msgstr "多于的“endef”" + +#~ msgid "empty `override' directive" +#~ msgstr "空“override”指令" + +#~ msgid "invalid `override' directive" +#~ msgstr "无效的“override”指令" + +#~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n" +#~ msgstr "-警告, CTRL-Y 将利刀子进程环境。\n" + +#~ msgid "" +#~ "\n" +#~ "# No files." +#~ msgstr "" +#~ "\n" +#~ "# 无文件。" + +#~ msgid "" +#~ "\n" +#~ "# %u files in %u hash buckets.\n" +#~ msgstr "" +#~ "\n" +#~ "# 有 %u 个文件存储在 %u 个杂凑单元中。\n" + +#~ msgid "# average %.3f files per bucket, max %u files in one bucket.\n" +#~ msgstr "# 每个单元平均含有 %.3f 个文件,一个单元最多含有 %u 个文件。\n" + +#~ msgid "Syntax error, still inside '\"'\n" +#~ msgstr "语法错误,仍然在“\"”之中\n" + +#~ msgid "Got a SIGCHLD; %u unreaped children.\n" +#~ msgstr "收到 SIGCHLD 信号;尚有 %u 个子进程存在。\n" + +#~ msgid "DIRECTORY" +#~ msgstr "DIRECTORY" + +#~ msgid "Change to DIRECTORY before doing anything" +#~ msgstr "在做任何事之前转移到 DIRECTORY 中" + +#~ msgid "FLAGS" +#~ msgstr "标志" + +#~ msgid "Suspend process to allow a debugger to attach" +#~ msgstr "挂起进程以便调试器进行连接" + +#~ msgid "Environment variables override makefiles" +#~ msgstr "环境变量覆盖 makefile" + +#~ msgid "FILE" +#~ msgstr "FILE" + +#~ msgid "Read FILE as a makefile" +#~ msgstr "将 FILE 作为 makefile 读入" + +#~ msgid "Search DIRECTORY for included makefiles" +#~ msgstr "在 DIRECTORY 中搜索引入的 makefile" + +#~ msgid "Don't start multiple jobs unless load is below N" +#~ msgstr "除非负载低于 N 否则就不启动多个任务" + +#~ msgid "Don't actually run any commands; just print them" +#~ msgstr "不会实际运行任何命令;只是打印它们" + +#~ msgid "Consider FILE to be very old and don't remake it" +#~ msgstr "将 FILE 认定为过于陈旧而不重现创建它" + +#~ msgid "Don't echo commands" +#~ msgstr "不要回显命令" + +#~ msgid "Turns off -k" +#~ msgstr "关闭 -k" + +#~ msgid "Consider FILE to be infinitely new" +#~ msgstr "将 FILE 看做无限新" + +#~ msgid "Do not specify -j or --jobs if sh.exe is not available." +#~ msgstr "如果 sh.exe 不可用,就不要给出 -j 或 --jobs。" + +#~ msgid "Resetting make for single job mode." +#~ msgstr "将 make 重置为单任务模式。" + +#~ msgid "Entering" +#~ msgstr "正在进入" + +#~ msgid "Leaving" +#~ msgstr "正在离开" + +#~ msgid "no file name for `%sinclude'" +#~ msgstr "“%sinclude” 没有文件名" + +#~ msgid "# No variables." +#~ msgstr "# 没有变量。" + +#~ msgid "# average of %.1f variables per bucket, max %u in one bucket.\n" +#~ msgstr "# 每个杂凑单元平均存储 %.1f 个变量,一个单元最多存储 %u 个。\n" + +#~ msgid "# average of %d.%d variables per bucket, max %u in one bucket.\n" +#~ msgstr "# 每个杂凑单元平均存储 %d.%d 个变量,一个单元最多存储 %u 个。\n" diff --git a/read.c b/read.c new file mode 100644 index 0000000..a3ad88e --- /dev/null +++ b/read.c @@ -0,0 +1,3190 @@ +/* Reading and parsing of makefiles for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +#include + +#include + +#include "dep.h" +#include "filedef.h" +#include "job.h" +#include "commands.h" +#include "variable.h" +#include "rule.h" +#include "debug.h" +#include "hash.h" + + +#ifndef WINDOWS32 +#ifndef _AMIGA +#ifndef VMS +#include +#else +struct passwd *getpwnam (char *name); +#endif +#endif +#endif /* !WINDOWS32 */ + +/* A 'struct ebuffer' controls the origin of the makefile we are currently + eval'ing. +*/ + +struct ebuffer + { + char *buffer; /* Start of the current line in the buffer. */ + char *bufnext; /* Start of the next line in the buffer. */ + char *bufstart; /* Start of the entire buffer. */ + unsigned int size; /* Malloc'd size of buffer. */ + FILE *fp; /* File, or NULL if this is an internal buffer. */ + struct floc floc; /* Info on the file in fp (if any). */ + }; + +/* Track the modifiers we can have on variable assignments */ + +struct vmodifiers + { + unsigned int assign_v:1; + unsigned int define_v:1; + unsigned int undefine_v:1; + unsigned int export_v:1; + unsigned int override_v:1; + unsigned int private_v:1; + }; + +/* Types of "words" that can be read in a makefile. */ +enum make_word_type + { + w_bogus, w_eol, w_static, w_variable, w_colon, w_dcolon, w_semicolon, + w_varassign + }; + + +/* A `struct conditionals' contains the information describing + all the active conditionals in a makefile. + + The global variable `conditionals' contains the conditionals + information for the current makefile. It is initialized from + the static structure `toplevel_conditionals' and is later changed + to new structures for included makefiles. */ + +struct conditionals + { + unsigned int if_cmds; /* Depth of conditional nesting. */ + unsigned int allocated; /* Elts allocated in following arrays. */ + char *ignoring; /* Are we ignoring or interpreting? + 0=interpreting, 1=not yet interpreted, + 2=already interpreted */ + char *seen_else; /* Have we already seen an `else'? */ + }; + +static struct conditionals toplevel_conditionals; +static struct conditionals *conditionals = &toplevel_conditionals; + + +/* Default directories to search for include files in */ + +static const char *default_include_directories[] = + { +#if defined(WINDOWS32) && !defined(INCLUDEDIR) +/* This completely up to the user when they install MSVC or other packages. + This is defined as a placeholder. */ +# define INCLUDEDIR "." +#endif + INCLUDEDIR, +#ifndef _AMIGA + "/usr/gnu/include", + "/usr/local/include", + "/usr/include", +#endif + 0 + }; + +/* List of directories to search for include files in */ + +static const char **include_directories; + +/* Maximum length of an element of the above. */ + +static unsigned int max_incl_len; + +/* The filename and pointer to line number of the + makefile currently being read in. */ + +const struct floc *reading_file = 0; + +/* The chain of makefiles read by read_makefile. */ + +static struct dep *read_makefiles = 0; + +static int eval_makefile (const char *filename, int flags); +static void eval (struct ebuffer *buffer, int flags); + +static long readline (struct ebuffer *ebuf); +static void do_undefine (char *name, enum variable_origin origin, + struct ebuffer *ebuf); +static struct variable *do_define (char *name, enum variable_origin origin, + struct ebuffer *ebuf); +static int conditional_line (char *line, int len, const struct floc *flocp); +static void record_files (struct nameseq *filenames, const char *pattern, + const char *pattern_percent, char *depstr, + unsigned int cmds_started, char *commands, + unsigned int commands_idx, int two_colon, + const struct floc *flocp); +static void record_target_var (struct nameseq *filenames, char *defn, + enum variable_origin origin, + struct vmodifiers *vmod, + const struct floc *flocp); +static enum make_word_type get_next_mword (char *buffer, char *delim, + char **startp, unsigned int *length); +static void remove_comments (char *line); +static char *find_char_unquote (char *string, int stop1, int stop2, + int blank, int ignorevars); + + +/* Compare a word, both length and contents. + P must point to the word to be tested, and WLEN must be the length. +*/ +#define word1eq(s) (wlen == sizeof(s)-1 && strneq (s, p, sizeof(s)-1)) + + +/* Read in all the makefiles and return the chain of their names. */ + +struct dep * +read_all_makefiles (const char **makefiles) +{ + unsigned int num_makefiles = 0; + + /* Create *_LIST variables, to hold the makefiles, targets, and variables + we will be reading. */ + + define_variable_cname ("MAKEFILE_LIST", "", o_file, 0); + + DB (DB_BASIC, (_("Reading makefiles...\n"))); + + /* If there's a non-null variable MAKEFILES, its value is a list of + files to read first thing. But don't let it prevent reading the + default makefiles and don't let the default goal come from there. */ + + { + char *value; + char *name, *p; + unsigned int length; + + { + /* Turn off --warn-undefined-variables while we expand MAKEFILES. */ + int save = warn_undefined_variables_flag; + warn_undefined_variables_flag = 0; + + value = allocated_variable_expand ("$(MAKEFILES)"); + + warn_undefined_variables_flag = save; + } + + /* Set NAME to the start of next token and LENGTH to its length. + MAKEFILES is updated for finding remaining tokens. */ + p = value; + + while ((name = find_next_token ((const char **)&p, &length)) != 0) + { + if (*p != '\0') + *p++ = '\0'; + eval_makefile (name, RM_NO_DEFAULT_GOAL|RM_INCLUDED|RM_DONTCARE); + } + + free (value); + } + + /* Read makefiles specified with -f switches. */ + + if (makefiles != 0) + while (*makefiles != 0) + { + struct dep *tail = read_makefiles; + register struct dep *d; + + if (! eval_makefile (*makefiles, 0)) + perror_with_name ("", *makefiles); + + /* Find the right element of read_makefiles. */ + d = read_makefiles; + while (d->next != tail) + d = d->next; + + /* Use the storage read_makefile allocates. */ + *makefiles = dep_name (d); + ++num_makefiles; + ++makefiles; + } + + /* If there were no -f switches, try the default names. */ + + if (num_makefiles == 0) + { + static char *default_makefiles[] = +#ifdef VMS + /* all lower case since readdir() (the vms version) 'lowercasifies' */ + { "makefile.vms", "gnumakefile.", "makefile.", 0 }; +#else +#ifdef _AMIGA + { "GNUmakefile", "Makefile", "SMakefile", 0 }; +#else /* !Amiga && !VMS */ + { "GNUmakefile", "makefile", "Makefile", 0 }; +#endif /* AMIGA */ +#endif /* VMS */ + register char **p = default_makefiles; + while (*p != 0 && !file_exists_p (*p)) + ++p; + + if (*p != 0) + { + if (! eval_makefile (*p, 0)) + perror_with_name ("", *p); + } + else + { + /* No default makefile was found. Add the default makefiles to the + `read_makefiles' chain so they will be updated if possible. */ + struct dep *tail = read_makefiles; + /* Add them to the tail, after any MAKEFILES variable makefiles. */ + while (tail != 0 && tail->next != 0) + tail = tail->next; + for (p = default_makefiles; *p != 0; ++p) + { + struct dep *d = alloc_dep (); + d->file = enter_file (strcache_add (*p)); + d->dontcare = 1; + /* Tell update_goal_chain to bail out as soon as this file is + made, and main not to die if we can't make this file. */ + d->changed = RM_DONTCARE; + if (tail == 0) + read_makefiles = d; + else + tail->next = d; + tail = d; + } + if (tail != 0) + tail->next = 0; + } + } + + return read_makefiles; +} + +/* Install a new conditional and return the previous one. */ + +static struct conditionals * +install_conditionals (struct conditionals *new) +{ + struct conditionals *save = conditionals; + + memset (new, '\0', sizeof (*new)); + conditionals = new; + + return save; +} + +/* Free the current conditionals and reinstate a saved one. */ + +static void +restore_conditionals (struct conditionals *saved) +{ + /* Free any space allocated by conditional_line. */ + if (conditionals->ignoring) + free (conditionals->ignoring); + if (conditionals->seen_else) + free (conditionals->seen_else); + + /* Restore state. */ + conditionals = saved; +} + +static int +eval_makefile (const char *filename, int flags) +{ + struct dep *deps; + struct ebuffer ebuf; + const struct floc *curfile; + char *expanded = 0; + int makefile_errno; + + filename = strcache_add (filename); + ebuf.floc.filenm = filename; + ebuf.floc.lineno = 1; + + if (ISDB (DB_VERBOSE)) + { + printf (_("Reading makefile `%s'"), filename); + if (flags & RM_NO_DEFAULT_GOAL) + printf (_(" (no default goal)")); + if (flags & RM_INCLUDED) + printf (_(" (search path)")); + if (flags & RM_DONTCARE) + printf (_(" (don't care)")); + if (flags & RM_NO_TILDE) + printf (_(" (no ~ expansion)")); + puts ("..."); + } + + /* First, get a stream to read. */ + + /* Expand ~ in FILENAME unless it came from `include', + in which case it was already done. */ + if (!(flags & RM_NO_TILDE) && filename[0] == '~') + { + expanded = tilde_expand (filename); + if (expanded != 0) + filename = expanded; + } + + ebuf.fp = fopen (filename, "r"); + /* Save the error code so we print the right message later. */ + makefile_errno = errno; + + /* If the makefile wasn't found and it's either a makefile from + the `MAKEFILES' variable or an included makefile, + search the included makefile search path for this makefile. */ + if (ebuf.fp == 0 && (flags & RM_INCLUDED) && *filename != '/') + { + unsigned int i; + for (i = 0; include_directories[i] != 0; ++i) + { + const char *included = concat (3, include_directories[i], + "/", filename); + ebuf.fp = fopen (included, "r"); + if (ebuf.fp) + { + filename = strcache_add (included); + break; + } + } + } + + /* Add FILENAME to the chain of read makefiles. */ + deps = alloc_dep (); + deps->next = read_makefiles; + read_makefiles = deps; + deps->file = lookup_file (filename); + if (deps->file == 0) + deps->file = enter_file (filename); + filename = deps->file->name; + deps->changed = flags; + if (flags & RM_DONTCARE) + deps->dontcare = 1; + + if (expanded) + free (expanded); + + /* If the makefile can't be found at all, give up entirely. */ + + if (ebuf.fp == 0) + { + /* If we did some searching, errno has the error from the last + attempt, rather from FILENAME itself. Restore it in case the + caller wants to use it in a message. */ + errno = makefile_errno; + return 0; + } + + /* Set close-on-exec to avoid leaking the makefile to children, such as + $(shell ...). */ +#ifdef HAVE_FILENO + CLOSE_ON_EXEC (fileno (ebuf.fp)); +#endif + + /* Add this makefile to the list. */ + do_variable_definition (&ebuf.floc, "MAKEFILE_LIST", filename, o_file, + f_append, 0); + + /* Evaluate the makefile */ + + ebuf.size = 200; + ebuf.buffer = ebuf.bufnext = ebuf.bufstart = xmalloc (ebuf.size); + + curfile = reading_file; + reading_file = &ebuf.floc; + + eval (&ebuf, !(flags & RM_NO_DEFAULT_GOAL)); + + reading_file = curfile; + + fclose (ebuf.fp); + + free (ebuf.bufstart); + alloca (0); + + return 1; +} + +void +eval_buffer (char *buffer) +{ + struct ebuffer ebuf; + struct conditionals *saved; + struct conditionals new; + const struct floc *curfile; + + /* Evaluate the buffer */ + + ebuf.size = strlen (buffer); + ebuf.buffer = ebuf.bufnext = ebuf.bufstart = buffer; + ebuf.fp = NULL; + + if (reading_file) + ebuf.floc = *reading_file; + else + ebuf.floc.filenm = NULL; + + curfile = reading_file; + reading_file = &ebuf.floc; + + saved = install_conditionals (&new); + + eval (&ebuf, 1); + + restore_conditionals (saved); + + reading_file = curfile; + + alloca (0); +} + +/* Check LINE to see if it's a variable assignment or undefine. + + It might use one of the modifiers "export", "override", "private", or it + might be one of the conditional tokens like "ifdef", "include", etc. + + If it's not a variable assignment or undefine, VMOD.V_ASSIGN is 0. + Returns LINE. + + Returns a pointer to the first non-modifier character, and sets VMOD + based on the modifiers found if any, plus V_ASSIGN is 1. + */ +static char * +parse_var_assignment (const char *line, struct vmodifiers *vmod) +{ + const char *p; + memset (vmod, '\0', sizeof (*vmod)); + + /* Find the start of the next token. If there isn't one we're done. */ + line = next_token (line); + if (*line == '\0') + return (char *)line; + + p = line; + while (1) + { + int wlen; + const char *p2; + enum variable_flavor flavor; + + p2 = parse_variable_definition (p, &flavor); + + /* If this is a variable assignment, we're done. */ + if (p2) + break; + + /* It's not a variable; see if it's a modifier. */ + p2 = end_of_token (p); + wlen = p2 - p; + + if (word1eq ("export")) + vmod->export_v = 1; + else if (word1eq ("override")) + vmod->override_v = 1; + else if (word1eq ("private")) + vmod->private_v = 1; + else if (word1eq ("define")) + { + /* We can't have modifiers after 'define' */ + vmod->define_v = 1; + p = next_token (p2); + break; + } + else if (word1eq ("undefine")) + { + /* We can't have modifiers after 'undefine' */ + vmod->undefine_v = 1; + p = next_token (p2); + break; + } + else + /* Not a variable or modifier: this is not a variable assignment. */ + return (char *)line; + + /* It was a modifier. Try the next word. */ + p = next_token (p2); + if (*p == '\0') + return (char *)line; + } + + /* Found a variable assignment or undefine. */ + vmod->assign_v = 1; + return (char *)p; +} + + +/* Read file FILENAME as a makefile and add its contents to the data base. + + SET_DEFAULT is true if we are allowed to set the default goal. */ + +static void +eval (struct ebuffer *ebuf, int set_default) +{ + char *collapsed = 0; + unsigned int collapsed_length = 0; + unsigned int commands_len = 200; + char *commands; + unsigned int commands_idx = 0; + unsigned int cmds_started, tgts_started; + int ignoring = 0, in_ignored_define = 0; + int no_targets = 0; /* Set when reading a rule without targets. */ + struct nameseq *filenames = 0; + char *depstr = 0; + long nlines = 0; + int two_colon = 0; + const char *pattern = 0; + const char *pattern_percent; + struct floc *fstart; + struct floc fi; + +#define record_waiting_files() \ + do \ + { \ + if (filenames != 0) \ + { \ + fi.lineno = tgts_started; \ + record_files (filenames, pattern, pattern_percent, depstr, \ + cmds_started, commands, commands_idx, two_colon, \ + &fi); \ + filenames = 0; \ + } \ + commands_idx = 0; \ + no_targets = 0; \ + pattern = 0; \ + } while (0) + + pattern_percent = 0; + cmds_started = tgts_started = 1; + + fstart = &ebuf->floc; + fi.filenm = ebuf->floc.filenm; + + /* Loop over lines in the file. + The strategy is to accumulate target names in FILENAMES, dependencies + in DEPS and commands in COMMANDS. These are used to define a rule + when the start of the next rule (or eof) is encountered. + + When you see a "continue" in the loop below, that means we are moving on + to the next line _without_ ending any rule that we happen to be working + with at the moment. If you see a "goto rule_complete", then the + statement we just parsed also finishes the previous rule. */ + + commands = xmalloc (200); + + while (1) + { + unsigned int linelen; + char *line; + unsigned int wlen; + char *p; + char *p2; + struct vmodifiers vmod; + + /* At the top of this loop, we are starting a brand new line. */ + /* Grab the next line to be evaluated */ + ebuf->floc.lineno += nlines; + nlines = readline (ebuf); + + /* If there is nothing left to eval, we're done. */ + if (nlines < 0) + break; + + /* If this line is empty, skip it. */ + line = ebuf->buffer; + if (line[0] == '\0') + continue; + + linelen = strlen (line); + + /* Check for a shell command line first. + If it is not one, we can stop treating tab specially. */ + if (line[0] == cmd_prefix) + { + if (no_targets) + /* Ignore the commands in a rule with no targets. */ + continue; + + /* If there is no preceding rule line, don't treat this line + as a command, even though it begins with a recipe prefix. + SunOS 4 make appears to behave this way. */ + + if (filenames != 0) + { + if (ignoring) + /* Yep, this is a shell command, and we don't care. */ + continue; + + /* Append this command line to the line being accumulated. + Strip command prefix chars that appear after newlines. */ + if (commands_idx == 0) + cmds_started = ebuf->floc.lineno; + + if (linelen + commands_idx > commands_len) + { + commands_len = (linelen + commands_idx) * 2; + commands = xrealloc (commands, commands_len); + } + p = &commands[commands_idx]; + p2 = line + 1; + while (--linelen) + { + ++commands_idx; + *(p++) = *p2; + if (p2[0] == '\n' && p2[1] == cmd_prefix) + { + ++p2; + --linelen; + } + ++p2; + } + *p = '\n'; + ++commands_idx; + + continue; + } + } + + /* This line is not a shell command line. Don't worry about whitespace. + Get more space if we need it; we don't need to preserve the current + contents of the buffer. */ + + if (collapsed_length < linelen+1) + { + collapsed_length = linelen+1; + if (collapsed) + free (collapsed); + /* Don't need xrealloc: we don't need to preserve the content. */ + collapsed = xmalloc (collapsed_length); + } + strcpy (collapsed, line); + /* Collapse continuation lines. */ + collapse_continuations (collapsed); + remove_comments (collapsed); + + /* Get rid if starting space (including formfeed, vtab, etc.) */ + p = collapsed; + while (isspace ((unsigned char)*p)) + ++p; + + /* See if this is a variable assignment. We need to do this early, to + allow variables with names like 'ifdef', 'export', 'private', etc. */ + p = parse_var_assignment(p, &vmod); + if (vmod.assign_v) + { + struct variable *v; + enum variable_origin origin = vmod.override_v ? o_override : o_file; + + /* If we're ignoring then we're done now. */ + if (ignoring) + { + if (vmod.define_v) + in_ignored_define = 1; + continue; + } + + if (vmod.undefine_v) + { + do_undefine (p, origin, ebuf); + + /* This line has been dealt with. */ + goto rule_complete; + } + else if (vmod.define_v) + v = do_define (p, origin, ebuf); + else + v = try_variable_definition (fstart, p, origin, 0); + + assert (v != NULL); + + if (vmod.export_v) + v->export = v_export; + if (vmod.private_v) + v->private_var = 1; + + /* This line has been dealt with. */ + goto rule_complete; + } + + /* If this line is completely empty, ignore it. */ + if (*p == '\0') + continue; + + p2 = end_of_token (p); + wlen = p2 - p; + p2 = next_token (p2); + + /* If we're in an ignored define, skip this line (but maybe get out). */ + if (in_ignored_define) + { + /* See if this is an endef line (plus optional comment). */ + if (word1eq ("endef") && (*p2 == '\0' || *p2 == '#')) + in_ignored_define = 0; + + continue; + } + + /* Check for conditional state changes. */ + { + int i = conditional_line (p, wlen, fstart); + if (i != -2) + { + if (i == -1) + fatal (fstart, _("invalid syntax in conditional")); + + ignoring = i; + continue; + } + } + + /* Nothing to see here... move along. */ + if (ignoring) + continue; + + /* Manage the "export" keyword used outside of variable assignment + as well as "unexport". */ + if (word1eq ("export") || word1eq ("unexport")) + { + int exporting = *p == 'u' ? 0 : 1; + + /* (un)export by itself causes everything to be (un)exported. */ + if (*p2 == '\0') + export_all_variables = exporting; + else + { + unsigned int l; + const char *cp; + char *ap; + + /* Expand the line so we can use indirect and constructed + variable names in an (un)export command. */ + cp = ap = allocated_variable_expand (p2); + + for (p = find_next_token (&cp, &l); p != 0; + p = find_next_token (&cp, &l)) + { + struct variable *v = lookup_variable (p, l); + if (v == 0) + v = define_variable_loc (p, l, "", o_file, 0, fstart); + v->export = exporting ? v_export : v_noexport; + } + + free (ap); + } + goto rule_complete; + } + + /* Handle the special syntax for vpath. */ + if (word1eq ("vpath")) + { + const char *cp; + char *vpat; + unsigned int l; + cp = variable_expand (p2); + p = find_next_token (&cp, &l); + if (p != 0) + { + vpat = xstrndup (p, l); + p = find_next_token (&cp, &l); + /* No searchpath means remove all previous + selective VPATH's with the same pattern. */ + } + else + /* No pattern means remove all previous selective VPATH's. */ + vpat = 0; + construct_vpath_list (vpat, p); + if (vpat != 0) + free (vpat); + + goto rule_complete; + } + + /* Handle include and variants. */ + if (word1eq ("include") || word1eq ("-include") || word1eq ("sinclude")) + { + /* We have found an `include' line specifying a nested + makefile to be read at this point. */ + struct conditionals *save; + struct conditionals new_conditionals; + struct nameseq *files; + /* "-include" (vs "include") says no error if the file does not + exist. "sinclude" is an alias for this from SGI. */ + int noerror = (p[0] != 'i'); + + p = allocated_variable_expand (p2); + + /* If no filenames, it's a no-op. */ + if (*p == '\0') + { + free (p); + continue; + } + + /* Parse the list of file names. Don't expand archive references! */ + p2 = p; + files = PARSE_FILE_SEQ (&p2, struct nameseq, '\0', NULL, + PARSEFS_NOAR); + free (p); + + /* Save the state of conditionals and start + the included makefile with a clean slate. */ + save = install_conditionals (&new_conditionals); + + /* Record the rules that are waiting so they will determine + the default goal before those in the included makefile. */ + record_waiting_files (); + + /* Read each included makefile. */ + while (files != 0) + { + struct nameseq *next = files->next; + const char *name = files->name; + int r; + + free_ns (files); + files = next; + + r = eval_makefile (name, + (RM_INCLUDED | RM_NO_TILDE + | (noerror ? RM_DONTCARE : 0) + | (set_default ? 0 : RM_NO_DEFAULT_GOAL))); + if (!r && !noerror) + error (fstart, "%s: %s", name, strerror (errno)); + } + + /* Restore conditional state. */ + restore_conditionals (save); + + goto rule_complete; + } + + /* This line starts with a tab but was not caught above because there + was no preceding target, and the line might have been usable as a + variable definition. But now we know it is definitely lossage. */ + if (line[0] == cmd_prefix) + fatal(fstart, _("recipe commences before first target")); + + /* This line describes some target files. This is complicated by + the existence of target-specific variables, because we can't + expand the entire line until we know if we have one or not. So + we expand the line word by word until we find the first `:', + then check to see if it's a target-specific variable. + + In this algorithm, `lb_next' will point to the beginning of the + unexpanded parts of the input buffer, while `p2' points to the + parts of the expanded buffer we haven't searched yet. */ + + { + enum make_word_type wtype; + char *cmdleft, *semip, *lb_next; + unsigned int plen = 0; + char *colonp; + const char *end, *beg; /* Helpers for whitespace stripping. */ + + /* Record the previous rule. */ + + record_waiting_files (); + tgts_started = fstart->lineno; + + /* Search the line for an unquoted ; that is not after an + unquoted #. */ + cmdleft = find_char_unquote (line, ';', '#', 0, 1); + if (cmdleft != 0 && *cmdleft == '#') + { + /* We found a comment before a semicolon. */ + *cmdleft = '\0'; + cmdleft = 0; + } + else if (cmdleft != 0) + /* Found one. Cut the line short there before expanding it. */ + *(cmdleft++) = '\0'; + semip = cmdleft; + + collapse_continuations (line); + + /* We can't expand the entire line, since if it's a per-target + variable we don't want to expand it. So, walk from the + beginning, expanding as we go, and looking for "interesting" + chars. The first word is always expandable. */ + wtype = get_next_mword(line, NULL, &lb_next, &wlen); + switch (wtype) + { + case w_eol: + if (cmdleft != 0) + fatal(fstart, _("missing rule before recipe")); + /* This line contained something but turned out to be nothing + but whitespace (a comment?). */ + continue; + + case w_colon: + case w_dcolon: + /* We accept and ignore rules without targets for + compatibility with SunOS 4 make. */ + no_targets = 1; + continue; + + default: + break; + } + + p2 = variable_expand_string(NULL, lb_next, wlen); + + while (1) + { + lb_next += wlen; + if (cmdleft == 0) + { + /* Look for a semicolon in the expanded line. */ + cmdleft = find_char_unquote (p2, ';', 0, 0, 0); + + if (cmdleft != 0) + { + unsigned long p2_off = p2 - variable_buffer; + unsigned long cmd_off = cmdleft - variable_buffer; + char *pend = p2 + strlen(p2); + + /* Append any remnants of lb, then cut the line short + at the semicolon. */ + *cmdleft = '\0'; + + /* One school of thought says that you shouldn't expand + here, but merely copy, since now you're beyond a ";" + and into a command script. However, the old parser + expanded the whole line, so we continue that for + backwards-compatiblity. Also, it wouldn't be + entirely consistent, since we do an unconditional + expand below once we know we don't have a + target-specific variable. */ + (void)variable_expand_string(pend, lb_next, (long)-1); + lb_next += strlen(lb_next); + p2 = variable_buffer + p2_off; + cmdleft = variable_buffer + cmd_off + 1; + } + } + + colonp = find_char_unquote(p2, ':', 0, 0, 0); +#ifdef HAVE_DOS_PATHS + /* The drive spec brain-damage strikes again... */ + /* Note that the only separators of targets in this context + are whitespace and a left paren. If others are possible, + they should be added to the string in the call to index. */ + while (colonp && (colonp[1] == '/' || colonp[1] == '\\') && + colonp > p2 && isalpha ((unsigned char)colonp[-1]) && + (colonp == p2 + 1 || strchr (" \t(", colonp[-2]) != 0)) + colonp = find_char_unquote(colonp + 1, ':', 0, 0, 0); +#endif + if (colonp != 0) + break; + + wtype = get_next_mword(lb_next, NULL, &lb_next, &wlen); + if (wtype == w_eol) + break; + + p2 += strlen(p2); + *(p2++) = ' '; + p2 = variable_expand_string(p2, lb_next, wlen); + /* We don't need to worry about cmdleft here, because if it was + found in the variable_buffer the entire buffer has already + been expanded... we'll never get here. */ + } + + p2 = next_token (variable_buffer); + + /* If the word we're looking at is EOL, see if there's _anything_ + on the line. If not, a variable expanded to nothing, so ignore + it. If so, we can't parse this line so punt. */ + if (wtype == w_eol) + { + if (*p2 != '\0') + /* There's no need to be ivory-tower about this: check for + one of the most common bugs found in makefiles... */ + fatal (fstart, _("missing separator%s"), + (cmd_prefix == '\t' && !strneq(line, " ", 8)) + ? "" : _(" (did you mean TAB instead of 8 spaces?)")); + continue; + } + + /* Make the colon the end-of-string so we know where to stop + looking for targets. */ + *colonp = '\0'; + filenames = PARSE_FILE_SEQ (&p2, struct nameseq, '\0', NULL, 0); + *p2 = ':'; + + if (!filenames) + { + /* We accept and ignore rules without targets for + compatibility with SunOS 4 make. */ + no_targets = 1; + continue; + } + /* This should never be possible; we handled it above. */ + assert (*p2 != '\0'); + ++p2; + + /* Is this a one-colon or two-colon entry? */ + two_colon = *p2 == ':'; + if (two_colon) + p2++; + + /* Test to see if it's a target-specific variable. Copy the rest + of the buffer over, possibly temporarily (we'll expand it later + if it's not a target-specific variable). PLEN saves the length + of the unparsed section of p2, for later. */ + if (*lb_next != '\0') + { + unsigned int l = p2 - variable_buffer; + plen = strlen (p2); + variable_buffer_output (p2+plen, lb_next, strlen (lb_next)+1); + p2 = variable_buffer + l; + } + + p2 = parse_var_assignment (p2, &vmod); + if (vmod.assign_v) + { + /* If there was a semicolon found, add it back, plus anything + after it. */ + if (semip) + { + unsigned int l = p - variable_buffer; + *(--semip) = ';'; + collapse_continuations (semip); + variable_buffer_output (p2 + strlen (p2), + semip, strlen (semip)+1); + p = variable_buffer + l; + } + record_target_var (filenames, p2, + vmod.override_v ? o_override : o_file, + &vmod, fstart); + filenames = 0; + continue; + } + + /* This is a normal target, _not_ a target-specific variable. + Unquote any = in the dependency list. */ + find_char_unquote (lb_next, '=', 0, 0, 0); + + /* We have some targets, so don't ignore the following commands. */ + no_targets = 0; + + /* Expand the dependencies, etc. */ + if (*lb_next != '\0') + { + unsigned int l = p2 - variable_buffer; + (void) variable_expand_string (p2 + plen, lb_next, (long)-1); + p2 = variable_buffer + l; + + /* Look for a semicolon in the expanded line. */ + if (cmdleft == 0) + { + cmdleft = find_char_unquote (p2, ';', 0, 0, 0); + if (cmdleft != 0) + *(cmdleft++) = '\0'; + } + } + + /* Is this a static pattern rule: `target: %targ: %dep; ...'? */ + p = strchr (p2, ':'); + while (p != 0 && p[-1] == '\\') + { + char *q = &p[-1]; + int backslash = 0; + while (*q-- == '\\') + backslash = !backslash; + if (backslash) + p = strchr (p + 1, ':'); + else + break; + } +#ifdef _AMIGA + /* Here, the situation is quite complicated. Let's have a look + at a couple of targets: + + install: dev:make + + dev:make: make + + dev:make:: xyz + + The rule is that it's only a target, if there are TWO :'s + OR a space around the :. + */ + if (p && !(isspace ((unsigned char)p[1]) || !p[1] + || isspace ((unsigned char)p[-1]))) + p = 0; +#endif +#ifdef HAVE_DOS_PATHS + { + int check_again; + do { + check_again = 0; + /* For DOS-style paths, skip a "C:\..." or a "C:/..." */ + if (p != 0 && (p[1] == '\\' || p[1] == '/') && + isalpha ((unsigned char)p[-1]) && + (p == p2 + 1 || strchr (" \t:(", p[-2]) != 0)) { + p = strchr (p + 1, ':'); + check_again = 1; + } + } while (check_again); + } +#endif + if (p != 0) + { + struct nameseq *target; + target = PARSE_FILE_SEQ (&p2, struct nameseq, ':', NULL, + PARSEFS_NOGLOB); + ++p2; + if (target == 0) + fatal (fstart, _("missing target pattern")); + else if (target->next != 0) + fatal (fstart, _("multiple target patterns")); + pattern_percent = find_percent_cached (&target->name); + pattern = target->name; + if (pattern_percent == 0) + fatal (fstart, _("target pattern contains no `%%'")); + free_ns (target); + } + else + pattern = 0; + + /* Strip leading and trailing whitespaces. */ + beg = p2; + end = beg + strlen (beg) - 1; + strip_whitespace (&beg, &end); + + /* Put all the prerequisites here; they'll be parsed later. */ + if (beg <= end && *beg != '\0') + depstr = xstrndup (beg, end - beg + 1); + else + depstr = 0; + + commands_idx = 0; + if (cmdleft != 0) + { + /* Semicolon means rest of line is a command. */ + unsigned int l = strlen (cmdleft); + + cmds_started = fstart->lineno; + + /* Add this command line to the buffer. */ + if (l + 2 > commands_len) + { + commands_len = (l + 2) * 2; + commands = xrealloc (commands, commands_len); + } + memcpy (commands, cmdleft, l); + commands_idx += l; + commands[commands_idx++] = '\n'; + } + + /* Determine if this target should be made default. We used to do + this in record_files() but because of the delayed target recording + and because preprocessor directives are legal in target's commands + it is too late. Consider this fragment for example: + + foo: + + ifeq ($(.DEFAULT_GOAL),foo) + ... + endif + + Because the target is not recorded until after ifeq directive is + evaluated the .DEFAULT_GOAL does not contain foo yet as one + would expect. Because of this we have to move the logic here. */ + + if (set_default && default_goal_var->value[0] == '\0') + { + const char *name; + struct dep *d; + struct nameseq *t = filenames; + + for (; t != 0; t = t->next) + { + int reject = 0; + name = t->name; + + /* We have nothing to do if this is an implicit rule. */ + if (strchr (name, '%') != 0) + break; + + /* See if this target's name does not start with a `.', + unless it contains a slash. */ + if (*name == '.' && strchr (name, '/') == 0 +#ifdef HAVE_DOS_PATHS + && strchr (name, '\\') == 0 +#endif + ) + continue; + + + /* If this file is a suffix, don't let it be + the default goal file. */ + for (d = suffix_file->deps; d != 0; d = d->next) + { + register struct dep *d2; + if (*dep_name (d) != '.' && streq (name, dep_name (d))) + { + reject = 1; + break; + } + for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next) + { + unsigned int l = strlen (dep_name (d2)); + if (!strneq (name, dep_name (d2), l)) + continue; + if (streq (name + l, dep_name (d))) + { + reject = 1; + break; + } + } + + if (reject) + break; + } + + if (!reject) + { + define_variable_global (".DEFAULT_GOAL", 13, t->name, + o_file, 0, NILF); + break; + } + } + } + + continue; + } + + /* We get here except in the case that we just read a rule line. + Record now the last rule we read, so following spurious + commands are properly diagnosed. */ + rule_complete: + record_waiting_files (); + } + +#undef word1eq + + if (conditionals->if_cmds) + fatal (fstart, _("missing `endif'")); + + /* At eof, record the last rule. */ + record_waiting_files (); + + if (collapsed) + free (collapsed); + free (commands); +} + + +/* Remove comments from LINE. + This is done by copying the text at LINE onto itself. */ + +static void +remove_comments (char *line) +{ + char *comment; + + comment = find_char_unquote (line, '#', 0, 0, 0); + + if (comment != 0) + /* Cut off the line at the #. */ + *comment = '\0'; +} + +/* Execute a `undefine' directive. + The undefine line has already been read, and NAME is the name of + the variable to be undefined. */ + +static void +do_undefine (char *name, enum variable_origin origin, struct ebuffer *ebuf) +{ + char *p, *var; + + /* Expand the variable name and find the beginning (NAME) and end. */ + var = allocated_variable_expand (name); + name = next_token (var); + if (*name == '\0') + fatal (&ebuf->floc, _("empty variable name")); + p = name + strlen (name) - 1; + while (p > name && isblank ((unsigned char)*p)) + --p; + p[1] = '\0'; + + undefine_variable_global (name, p - name + 1, origin); + free (var); +} + +/* Execute a `define' directive. + The first line has already been read, and NAME is the name of + the variable to be defined. The following lines remain to be read. */ + +static struct variable * +do_define (char *name, enum variable_origin origin, struct ebuffer *ebuf) +{ + struct variable *v; + enum variable_flavor flavor; + struct floc defstart; + int nlevels = 1; + unsigned int length = 100; + char *definition = xmalloc (length); + unsigned int idx = 0; + char *p, *var; + + defstart = ebuf->floc; + + p = parse_variable_definition (name, &flavor); + if (p == NULL) + /* No assignment token, so assume recursive. */ + flavor = f_recursive; + else + { + if (*(next_token (p)) != '\0') + error (&defstart, _("extraneous text after `define' directive")); + + /* Chop the string before the assignment token to get the name. */ + p[flavor == f_recursive ? -1 : -2] = '\0'; + } + + /* Expand the variable name and find the beginning (NAME) and end. */ + var = allocated_variable_expand (name); + name = next_token (var); + if (*name == '\0') + fatal (&defstart, _("empty variable name")); + p = name + strlen (name) - 1; + while (p > name && isblank ((unsigned char)*p)) + --p; + p[1] = '\0'; + + /* Now read the value of the variable. */ + while (1) + { + unsigned int len; + char *line; + long nlines = readline (ebuf); + + /* If there is nothing left to be eval'd, there's no 'endef'!! */ + if (nlines < 0) + fatal (&defstart, _("missing `endef', unterminated `define'")); + + ebuf->floc.lineno += nlines; + line = ebuf->buffer; + + collapse_continuations (line); + + /* If the line doesn't begin with a tab, test to see if it introduces + another define, or ends one. Stop if we find an 'endef' */ + if (line[0] != cmd_prefix) + { + p = next_token (line); + len = strlen (p); + + /* If this is another 'define', increment the level count. */ + if ((len == 6 || (len > 6 && isblank ((unsigned char)p[6]))) + && strneq (p, "define", 6)) + ++nlevels; + + /* If this is an 'endef', decrement the count. If it's now 0, + we've found the last one. */ + else if ((len == 5 || (len > 5 && isblank ((unsigned char)p[5]))) + && strneq (p, "endef", 5)) + { + p += 5; + remove_comments (p); + if (*(next_token (p)) != '\0') + error (&ebuf->floc, + _("extraneous text after `endef' directive")); + + if (--nlevels == 0) + break; + } + } + + /* Add this line to the variable definition. */ + len = strlen (line); + if (idx + len + 1 > length) + { + length = (idx + len) * 2; + definition = xrealloc (definition, length + 1); + } + + memcpy (&definition[idx], line, len); + idx += len; + /* Separate lines with a newline. */ + definition[idx++] = '\n'; + } + + /* We've got what we need; define the variable. */ + if (idx == 0) + definition[0] = '\0'; + else + definition[idx - 1] = '\0'; + + v = do_variable_definition (&defstart, name, definition, origin, flavor, 0); + free (definition); + free (var); + return (v); +} + +/* Interpret conditional commands "ifdef", "ifndef", "ifeq", + "ifneq", "else" and "endif". + LINE is the input line, with the command as its first word. + + FILENAME and LINENO are the filename and line number in the + current makefile. They are used for error messages. + + Value is -2 if the line is not a conditional at all, + -1 if the line is an invalid conditional, + 0 if following text should be interpreted, + 1 if following text should be ignored. */ + +static int +conditional_line (char *line, int len, const struct floc *flocp) +{ + char *cmdname; + enum { c_ifdef, c_ifndef, c_ifeq, c_ifneq, c_else, c_endif } cmdtype; + unsigned int i; + unsigned int o; + + /* Compare a word, both length and contents. */ +#define word1eq(s) (len == sizeof(s)-1 && strneq (s, line, sizeof(s)-1)) +#define chkword(s, t) if (word1eq (s)) { cmdtype = (t); cmdname = (s); } + + /* Make sure this line is a conditional. */ + chkword ("ifdef", c_ifdef) + else chkword ("ifndef", c_ifndef) + else chkword ("ifeq", c_ifeq) + else chkword ("ifneq", c_ifneq) + else chkword ("else", c_else) + else chkword ("endif", c_endif) + else + return -2; + + /* Found one: skip past it and any whitespace after it. */ + line = next_token (line + len); + +#define EXTRANEOUS() error (flocp, _("Extraneous text after `%s' directive"), cmdname) + + /* An 'endif' cannot contain extra text, and reduces the if-depth by 1 */ + if (cmdtype == c_endif) + { + if (*line != '\0') + EXTRANEOUS (); + + if (!conditionals->if_cmds) + fatal (flocp, _("extraneous `%s'"), cmdname); + + --conditionals->if_cmds; + + goto DONE; + } + + /* An 'else' statement can either be simple, or it can have another + conditional after it. */ + if (cmdtype == c_else) + { + const char *p; + + if (!conditionals->if_cmds) + fatal (flocp, _("extraneous `%s'"), cmdname); + + o = conditionals->if_cmds - 1; + + if (conditionals->seen_else[o]) + fatal (flocp, _("only one `else' per conditional")); + + /* Change the state of ignorance. */ + switch (conditionals->ignoring[o]) + { + case 0: + /* We've just been interpreting. Never do it again. */ + conditionals->ignoring[o] = 2; + break; + case 1: + /* We've never interpreted yet. Maybe this time! */ + conditionals->ignoring[o] = 0; + break; + } + + /* It's a simple 'else'. */ + if (*line == '\0') + { + conditionals->seen_else[o] = 1; + goto DONE; + } + + /* The 'else' has extra text. That text must be another conditional + and cannot be an 'else' or 'endif'. */ + + /* Find the length of the next word. */ + for (p = line+1; *p != '\0' && !isspace ((unsigned char)*p); ++p) + ; + len = p - line; + + /* If it's 'else' or 'endif' or an illegal conditional, fail. */ + if (word1eq("else") || word1eq("endif") + || conditional_line (line, len, flocp) < 0) + EXTRANEOUS (); + else + { + /* conditional_line() created a new level of conditional. + Raise it back to this level. */ + if (conditionals->ignoring[o] < 2) + conditionals->ignoring[o] = conditionals->ignoring[o+1]; + --conditionals->if_cmds; + } + + goto DONE; + } + + if (conditionals->allocated == 0) + { + conditionals->allocated = 5; + conditionals->ignoring = xmalloc (conditionals->allocated); + conditionals->seen_else = xmalloc (conditionals->allocated); + } + + o = conditionals->if_cmds++; + if (conditionals->if_cmds > conditionals->allocated) + { + conditionals->allocated += 5; + conditionals->ignoring = xrealloc (conditionals->ignoring, + conditionals->allocated); + conditionals->seen_else = xrealloc (conditionals->seen_else, + conditionals->allocated); + } + + /* Record that we have seen an `if...' but no `else' so far. */ + conditionals->seen_else[o] = 0; + + /* Search through the stack to see if we're already ignoring. */ + for (i = 0; i < o; ++i) + if (conditionals->ignoring[i]) + { + /* We are already ignoring, so just push a level to match the next + "else" or "endif", and keep ignoring. We don't want to expand + variables in the condition. */ + conditionals->ignoring[o] = 1; + return 1; + } + + if (cmdtype == c_ifdef || cmdtype == c_ifndef) + { + char *var; + struct variable *v; + char *p; + + /* Expand the thing we're looking up, so we can use indirect and + constructed variable names. */ + var = allocated_variable_expand (line); + + /* Make sure there's only one variable name to test. */ + p = end_of_token (var); + i = p - var; + p = next_token (p); + if (*p != '\0') + return -1; + + var[i] = '\0'; + v = lookup_variable (var, i); + + conditionals->ignoring[o] = + ((v != 0 && *v->value != '\0') == (cmdtype == c_ifndef)); + + free (var); + } + else + { + /* "ifeq" or "ifneq". */ + char *s1, *s2; + unsigned int l; + char termin = *line == '(' ? ',' : *line; + + if (termin != ',' && termin != '"' && termin != '\'') + return -1; + + s1 = ++line; + /* Find the end of the first string. */ + if (termin == ',') + { + int count = 0; + for (; *line != '\0'; ++line) + if (*line == '(') + ++count; + else if (*line == ')') + --count; + else if (*line == ',' && count <= 0) + break; + } + else + while (*line != '\0' && *line != termin) + ++line; + + if (*line == '\0') + return -1; + + if (termin == ',') + { + /* Strip blanks after the first string. */ + char *p = line++; + while (isblank ((unsigned char)p[-1])) + --p; + *p = '\0'; + } + else + *line++ = '\0'; + + s2 = variable_expand (s1); + /* We must allocate a new copy of the expanded string because + variable_expand re-uses the same buffer. */ + l = strlen (s2); + s1 = alloca (l + 1); + memcpy (s1, s2, l + 1); + + if (termin != ',') + /* Find the start of the second string. */ + line = next_token (line); + + termin = termin == ',' ? ')' : *line; + if (termin != ')' && termin != '"' && termin != '\'') + return -1; + + /* Find the end of the second string. */ + if (termin == ')') + { + int count = 0; + s2 = next_token (line); + for (line = s2; *line != '\0'; ++line) + { + if (*line == '(') + ++count; + else if (*line == ')') + { + if (count <= 0) + break; + else + --count; + } + } + } + else + { + ++line; + s2 = line; + while (*line != '\0' && *line != termin) + ++line; + } + + if (*line == '\0') + return -1; + + *line = '\0'; + line = next_token (++line); + if (*line != '\0') + EXTRANEOUS (); + + s2 = variable_expand (s2); + conditionals->ignoring[o] = (streq (s1, s2) == (cmdtype == c_ifneq)); + } + + DONE: + /* Search through the stack to see if we're ignoring. */ + for (i = 0; i < conditionals->if_cmds; ++i) + if (conditionals->ignoring[i]) + return 1; + return 0; +} + + +/* Record target-specific variable values for files FILENAMES. + TWO_COLON is nonzero if a double colon was used. + + The links of FILENAMES are freed, and so are any names in it + that are not incorporated into other data structures. + + If the target is a pattern, add the variable to the pattern-specific + variable value list. */ + +static void +record_target_var (struct nameseq *filenames, char *defn, + enum variable_origin origin, struct vmodifiers *vmod, + const struct floc *flocp) +{ + struct nameseq *nextf; + struct variable_set_list *global; + + global = current_variable_set_list; + + /* If the variable is an append version, store that but treat it as a + normal recursive variable. */ + + for (; filenames != 0; filenames = nextf) + { + struct variable *v; + const char *name = filenames->name; + const char *fname; + const char *percent; + struct pattern_var *p; + + nextf = filenames->next; + free_ns (filenames); + + /* If it's a pattern target, then add it to the pattern-specific + variable list. */ + percent = find_percent_cached (&name); + if (percent) + { + /* Get a reference for this pattern-specific variable struct. */ + p = create_pattern_var (name, percent); + p->variable.fileinfo = *flocp; + /* I don't think this can fail since we already determined it was a + variable definition. */ + v = assign_variable_definition (&p->variable, defn); + assert (v != 0); + + v->origin = origin; + if (v->flavor == f_simple) + v->value = allocated_variable_expand (v->value); + else + v->value = xstrdup (v->value); + + fname = p->target; + } + else + { + struct file *f; + + /* Get a file reference for this file, and initialize it. + We don't want to just call enter_file() because that allocates a + new entry if the file is a double-colon, which we don't want in + this situation. */ + f = lookup_file (name); + if (!f) + f = enter_file (strcache_add (name)); + else if (f->double_colon) + f = f->double_colon; + + initialize_file_variables (f, 1); + fname = f->name; + + current_variable_set_list = f->variables; + v = try_variable_definition (flocp, defn, origin, 1); + if (!v) + fatal (flocp, _("Malformed target-specific variable definition")); + current_variable_set_list = global; + } + + /* Set up the variable to be *-specific. */ + v->per_target = 1; + v->private_var = vmod->private_v; + v->export = vmod->export_v ? v_export : v_default; + + /* If it's not an override, check to see if there was a command-line + setting. If so, reset the value. */ + if (v->origin != o_override) + { + struct variable *gv; + int len = strlen(v->name); + + gv = lookup_variable (v->name, len); + if (gv && (gv->origin == o_env_override || gv->origin == o_command)) + { + if (v->value != 0) + free (v->value); + v->value = xstrdup (gv->value); + v->origin = gv->origin; + v->recursive = gv->recursive; + v->append = 0; + } + } + } +} + +/* Record a description line for files FILENAMES, + with dependencies DEPS, commands to execute described + by COMMANDS and COMMANDS_IDX, coming from FILENAME:COMMANDS_STARTED. + TWO_COLON is nonzero if a double colon was used. + If not nil, PATTERN is the `%' pattern to make this + a static pattern rule, and PATTERN_PERCENT is a pointer + to the `%' within it. + + The links of FILENAMES are freed, and so are any names in it + that are not incorporated into other data structures. */ + +static void +record_files (struct nameseq *filenames, const char *pattern, + const char *pattern_percent, char *depstr, + unsigned int cmds_started, char *commands, + unsigned int commands_idx, int two_colon, + const struct floc *flocp) +{ + struct commands *cmds; + struct dep *deps; + const char *implicit_percent; + const char *name; + + /* If we've already snapped deps, that means we're in an eval being + resolved after the makefiles have been read in. We can't add more rules + at this time, since they won't get snapped and we'll get core dumps. + See Savannah bug # 12124. */ + if (snapped_deps) + fatal (flocp, _("prerequisites cannot be defined in recipes")); + + /* Determine if this is a pattern rule or not. */ + name = filenames->name; + implicit_percent = find_percent_cached (&name); + + /* If there's a recipe, set up a struct for it. */ + if (commands_idx > 0) + { + cmds = xmalloc (sizeof (struct commands)); + cmds->fileinfo.filenm = flocp->filenm; + cmds->fileinfo.lineno = cmds_started; + cmds->commands = xstrndup (commands, commands_idx); + cmds->command_lines = 0; + } + else + cmds = 0; + + /* If there's a prereq string then parse it--unless it's eligible for 2nd + expansion: if so, snap_deps() will do it. */ + if (depstr == 0) + deps = 0; + else if (second_expansion && strchr (depstr, '$')) + { + deps = alloc_dep (); + deps->name = depstr; + deps->need_2nd_expansion = 1; + deps->staticpattern = pattern != 0; + } + else + { + deps = split_prereqs (depstr); + free (depstr); + + /* We'll enter static pattern prereqs later when we have the stem. We + don't want to enter pattern rules at all so that we don't think that + they ought to exist (make manual "Implicit Rule Search Algorithm", + item 5c). */ + if (! pattern && ! implicit_percent) + deps = enter_prereqs (deps, NULL); + } + + /* For implicit rules, _all_ the targets must have a pattern. That means we + can test the first one to see if we're working with an implicit rule; if + so we handle it specially. */ + + if (implicit_percent) + { + struct nameseq *nextf; + const char **targets, **target_pats; + unsigned int c; + + if (pattern != 0) + fatal (flocp, _("mixed implicit and static pattern rules")); + + /* Count the targets to create an array of target names. + We already have the first one. */ + nextf = filenames->next; + free_ns (filenames); + filenames = nextf; + + for (c = 1; nextf; ++c, nextf = nextf->next) + ; + targets = xmalloc (c * sizeof (const char *)); + target_pats = xmalloc (c * sizeof (const char *)); + + targets[0] = name; + target_pats[0] = implicit_percent; + + c = 1; + while (filenames) + { + name = filenames->name; + implicit_percent = find_percent_cached (&name); + + if (implicit_percent == 0) + fatal (flocp, _("mixed implicit and normal rules")); + + targets[c] = name; + target_pats[c] = implicit_percent; + ++c; + + nextf = filenames->next; + free_ns (filenames); + filenames = nextf; + } + + create_pattern_rule (targets, target_pats, c, two_colon, deps, cmds, 1); + + return; + } + + + /* Walk through each target and create it in the database. + We already set up the first target, above. */ + while (1) + { + struct nameseq *nextf = filenames->next; + struct file *f; + struct dep *this = 0; + + free_ns (filenames); + + /* Check for special targets. Do it here instead of, say, snap_deps() + so that we can immediately use the value. */ + if (streq (name, ".POSIX")) + { + posix_pedantic = 1; + define_variable_cname (".SHELLFLAGS", "-ec", o_default, 0); + } + else if (streq (name, ".SECONDEXPANSION")) + second_expansion = 1; +#if !defined(WINDOWS32) && !defined (__MSDOS__) && !defined (__EMX__) + else if (streq (name, ".ONESHELL")) + one_shell = 1; +#endif + + /* If this is a static pattern rule: + `targets: target%pattern: prereq%pattern; recipe', + make sure the pattern matches this target name. */ + if (pattern && !pattern_matches (pattern, pattern_percent, name)) + error (flocp, _("target `%s' doesn't match the target pattern"), name); + else if (deps) + /* If there are multiple targets, copy the chain DEPS for all but the + last one. It is not safe for the same deps to go in more than one + place in the database. */ + this = nextf != 0 ? copy_dep_chain (deps) : deps; + + /* Find or create an entry in the file database for this target. */ + if (!two_colon) + { + /* Single-colon. Combine this rule with the file's existing record, + if any. */ + f = enter_file (strcache_add (name)); + if (f->double_colon) + fatal (flocp, + _("target file `%s' has both : and :: entries"), f->name); + + /* If CMDS == F->CMDS, this target was listed in this rule + more than once. Just give a warning since this is harmless. */ + if (cmds != 0 && cmds == f->cmds) + error (flocp, + _("target `%s' given more than once in the same rule."), + f->name); + + /* Check for two single-colon entries both with commands. + Check is_target so that we don't lose on files such as .c.o + whose commands were preinitialized. */ + else if (cmds != 0 && f->cmds != 0 && f->is_target) + { + error (&cmds->fileinfo, + _("warning: overriding recipe for target `%s'"), + f->name); + error (&f->cmds->fileinfo, + _("warning: ignoring old recipe for target `%s'"), + f->name); + } + + /* Defining .DEFAULT with no deps or cmds clears it. */ + if (f == default_file && this == 0 && cmds == 0) + f->cmds = 0; + if (cmds != 0) + f->cmds = cmds; + + /* Defining .SUFFIXES with no dependencies clears out the list of + suffixes. */ + if (f == suffix_file && this == 0) + { + free_dep_chain (f->deps); + f->deps = 0; + } + } + else + { + /* Double-colon. Make a new record even if there already is one. */ + f = lookup_file (name); + + /* Check for both : and :: rules. Check is_target so we don't lose + on default suffix rules or makefiles. */ + if (f != 0 && f->is_target && !f->double_colon) + fatal (flocp, + _("target file `%s' has both : and :: entries"), f->name); + + f = enter_file (strcache_add (name)); + /* If there was an existing entry and it was a double-colon entry, + enter_file will have returned a new one, making it the prev + pointer of the old one, and setting its double_colon pointer to + the first one. */ + if (f->double_colon == 0) + /* This is the first entry for this name, so we must set its + double_colon pointer to itself. */ + f->double_colon = f; + + f->cmds = cmds; + } + + f->is_target = 1; + + /* If this is a static pattern rule, set the stem to the part of its + name that matched the `%' in the pattern, so you can use $* in the + commands. If we didn't do it before, enter the prereqs now. */ + if (pattern) + { + static const char *percent = "%"; + char *buffer = variable_expand (""); + char *o = patsubst_expand_pat (buffer, name, pattern, percent, + pattern_percent+1, percent+1); + f->stem = strcache_add_len (buffer, o - buffer); + if (this) + { + if (! this->need_2nd_expansion) + this = enter_prereqs (this, f->stem); + else + this->stem = f->stem; + } + } + + /* Add the dependencies to this file entry. */ + if (this != 0) + { + /* Add the file's old deps and the new ones in THIS together. */ + if (f->deps == 0) + f->deps = this; + else if (cmds != 0) + { + struct dep *d = this; + + /* If this rule has commands, put these deps first. */ + while (d->next != 0) + d = d->next; + + d->next = f->deps; + f->deps = this; + } + else + { + struct dep *d = f->deps; + + /* A rule without commands: put its prereqs at the end. */ + while (d->next != 0) + d = d->next; + + d->next = this; + } + } + + name = f->name; + + /* All done! Set up for the next one. */ + if (nextf == 0) + break; + + filenames = nextf; + + /* Reduce escaped percents. If there are any unescaped it's an error */ + name = filenames->name; + if (find_percent_cached (&name)) + fatal (flocp, _("mixed implicit and normal rules")); + } +} + +/* Search STRING for an unquoted STOPCHAR or blank (if BLANK is nonzero). + Backslashes quote STOPCHAR, blanks if BLANK is nonzero, and backslash. + Quoting backslashes are removed from STRING by compacting it into + itself. Returns a pointer to the first unquoted STOPCHAR if there is + one, or nil if there are none. STOPCHARs inside variable references are + ignored if IGNOREVARS is true. + + STOPCHAR _cannot_ be '$' if IGNOREVARS is true. */ + +static char * +find_char_unquote (char *string, int stop1, int stop2, int blank, + int ignorevars) +{ + unsigned int string_len = 0; + char *p = string; + + if (ignorevars) + ignorevars = '$'; + + while (1) + { + if (stop2 && blank) + while (*p != '\0' && *p != ignorevars && *p != stop1 && *p != stop2 + && ! isblank ((unsigned char) *p)) + ++p; + else if (stop2) + while (*p != '\0' && *p != ignorevars && *p != stop1 && *p != stop2) + ++p; + else if (blank) + while (*p != '\0' && *p != ignorevars && *p != stop1 + && ! isblank ((unsigned char) *p)) + ++p; + else + while (*p != '\0' && *p != ignorevars && *p != stop1) + ++p; + + if (*p == '\0') + break; + + /* If we stopped due to a variable reference, skip over its contents. */ + if (*p == ignorevars) + { + char openparen = p[1]; + + p += 2; + + /* Skip the contents of a non-quoted, multi-char variable ref. */ + if (openparen == '(' || openparen == '{') + { + unsigned int pcount = 1; + char closeparen = (openparen == '(' ? ')' : '}'); + + while (*p) + { + if (*p == openparen) + ++pcount; + else if (*p == closeparen) + if (--pcount == 0) + { + ++p; + break; + } + ++p; + } + } + + /* Skipped the variable reference: look for STOPCHARS again. */ + continue; + } + + if (p > string && p[-1] == '\\') + { + /* Search for more backslashes. */ + int i = -2; + while (&p[i] >= string && p[i] == '\\') + --i; + ++i; + /* Only compute the length if really needed. */ + if (string_len == 0) + string_len = strlen (string); + /* The number of backslashes is now -I. + Copy P over itself to swallow half of them. */ + memmove (&p[i], &p[i/2], (string_len - (p - string)) - (i/2) + 1); + p += i/2; + if (i % 2 == 0) + /* All the backslashes quoted each other; the STOPCHAR was + unquoted. */ + return p; + + /* The STOPCHAR was quoted by a backslash. Look for another. */ + } + else + /* No backslash in sight. */ + return p; + } + + /* Never hit a STOPCHAR or blank (with BLANK nonzero). */ + return 0; +} + +/* Search PATTERN for an unquoted % and handle quoting. */ + +char * +find_percent (char *pattern) +{ + return find_char_unquote (pattern, '%', 0, 0, 0); +} + +/* Search STRING for an unquoted % and handle quoting. Returns a pointer to + the % or NULL if no % was found. + This version is used with strings in the string cache: if there's a need to + modify the string a new version will be added to the string cache and + *STRING will be set to that. */ + +const char * +find_percent_cached (const char **string) +{ + const char *p = *string; + char *new = 0; + int slen = 0; + + /* If the first char is a % return now. This lets us avoid extra tests + inside the loop. */ + if (*p == '%') + return p; + + while (1) + { + while (*p != '\0' && *p != '%') + ++p; + + if (*p == '\0') + break; + + /* See if this % is escaped with a backslash; if not we're done. */ + if (p[-1] != '\\') + break; + + { + /* Search for more backslashes. */ + char *pv; + int i = -2; + + while (&p[i] >= *string && p[i] == '\\') + --i; + ++i; + + /* At this point we know we'll need to allocate a new string. + Make a copy if we haven't yet done so. */ + if (! new) + { + slen = strlen (*string); + new = alloca (slen + 1); + memcpy (new, *string, slen + 1); + p = new + (p - *string); + *string = new; + } + + /* At this point *string, p, and new all point into the same string. + Get a non-const version of p so we can modify new. */ + pv = new + (p - *string); + + /* The number of backslashes is now -I. + Copy P over itself to swallow half of them. */ + memmove (&pv[i], &pv[i/2], (slen - (pv - new)) - (i/2) + 1); + p += i/2; + + /* If the backslashes quoted each other; the % was unquoted. */ + if (i % 2 == 0) + break; + } + } + + /* If we had to change STRING, add it to the strcache. */ + if (new) + { + *string = strcache_add (*string); + p = *string + (p - new); + } + + /* If we didn't find a %, return NULL. Otherwise return a ptr to it. */ + return (*p == '\0') ? NULL : p; +} + +/* Find the next line of text in an eval buffer, combining continuation lines + into one line. + Return the number of actual lines read (> 1 if continuation lines). + Returns -1 if there's nothing left in the buffer. + + After this function, ebuf->buffer points to the first character of the + line we just found. + */ + +/* Read a line of text from a STRING. + Since we aren't really reading from a file, don't bother with linenumbers. + */ + +static unsigned long +readstring (struct ebuffer *ebuf) +{ + char *eol; + + /* If there is nothing left in this buffer, return 0. */ + if (ebuf->bufnext >= ebuf->bufstart + ebuf->size) + return -1; + + /* Set up a new starting point for the buffer, and find the end of the + next logical line (taking into account backslash/newline pairs). */ + + eol = ebuf->buffer = ebuf->bufnext; + + while (1) + { + int backslash = 0; + const char *bol = eol; + const char *p; + + /* Find the next newline. At EOS, stop. */ + p = eol = strchr (eol , '\n'); + if (!eol) + { + ebuf->bufnext = ebuf->bufstart + ebuf->size + 1; + return 0; + } + + /* Found a newline; if it's escaped continue; else we're done. */ + while (p > bol && *(--p) == '\\') + backslash = !backslash; + if (!backslash) + break; + ++eol; + } + + /* Overwrite the newline char. */ + *eol = '\0'; + ebuf->bufnext = eol+1; + + return 0; +} + +static long +readline (struct ebuffer *ebuf) +{ + char *p; + char *end; + char *start; + long nlines = 0; + + /* The behaviors between string and stream buffers are different enough to + warrant different functions. Do the Right Thing. */ + + if (!ebuf->fp) + return readstring (ebuf); + + /* When reading from a file, we always start over at the beginning of the + buffer for each new line. */ + + p = start = ebuf->bufstart; + end = p + ebuf->size; + *p = '\0'; + + while (fgets (p, end - p, ebuf->fp) != 0) + { + char *p2; + unsigned long len; + int backslash; + + len = strlen (p); + if (len == 0) + { + /* This only happens when the first thing on the line is a '\0'. + It is a pretty hopeless case, but (wonder of wonders) Athena + lossage strikes again! (xmkmf puts NULs in its makefiles.) + There is nothing really to be done; we synthesize a newline so + the following line doesn't appear to be part of this line. */ + error (&ebuf->floc, + _("warning: NUL character seen; rest of line ignored")); + p[0] = '\n'; + len = 1; + } + + /* Jump past the text we just read. */ + p += len; + + /* If the last char isn't a newline, the whole line didn't fit into the + buffer. Get some more buffer and try again. */ + if (p[-1] != '\n') + goto more_buffer; + + /* We got a newline, so add one to the count of lines. */ + ++nlines; + +#if !defined(WINDOWS32) && !defined(__MSDOS__) && !defined(__EMX__) + /* Check to see if the line was really ended with CRLF; if so ignore + the CR. */ + if ((p - start) > 1 && p[-2] == '\r') + { + --p; + p[-1] = '\n'; + } +#endif + + backslash = 0; + for (p2 = p - 2; p2 >= start; --p2) + { + if (*p2 != '\\') + break; + backslash = !backslash; + } + + if (!backslash) + { + p[-1] = '\0'; + break; + } + + /* It was a backslash/newline combo. If we have more space, read + another line. */ + if (end - p >= 80) + continue; + + /* We need more space at the end of our buffer, so realloc it. + Make sure to preserve the current offset of p. */ + more_buffer: + { + unsigned long off = p - start; + ebuf->size *= 2; + start = ebuf->buffer = ebuf->bufstart = xrealloc (start, ebuf->size); + p = start + off; + end = start + ebuf->size; + *p = '\0'; + } + } + + if (ferror (ebuf->fp)) + pfatal_with_name (ebuf->floc.filenm); + + /* If we found some lines, return how many. + If we didn't, but we did find _something_, that indicates we read the last + line of a file with no final newline; return 1. + If we read nothing, we're at EOF; return -1. */ + + return nlines ? nlines : p == ebuf->bufstart ? -1 : 1; +} + +/* Parse the next "makefile word" from the input buffer, and return info + about it. + + A "makefile word" is one of: + + w_bogus Should never happen + w_eol End of input + w_static A static word; cannot be expanded + w_variable A word containing one or more variables/functions + w_colon A colon + w_dcolon A double-colon + w_semicolon A semicolon + w_varassign A variable assignment operator (=, :=, +=, or ?=) + + Note that this function is only used when reading certain parts of the + makefile. Don't use it where special rules hold sway (RHS of a variable, + in a command list, etc.) */ + +static enum make_word_type +get_next_mword (char *buffer, char *delim, char **startp, unsigned int *length) +{ + enum make_word_type wtype = w_bogus; + char *p = buffer, *beg; + char c; + + /* Skip any leading whitespace. */ + while (isblank ((unsigned char)*p)) + ++p; + + beg = p; + c = *(p++); + switch (c) + { + case '\0': + wtype = w_eol; + break; + + case ';': + wtype = w_semicolon; + break; + + case '=': + wtype = w_varassign; + break; + + case ':': + wtype = w_colon; + switch (*p) + { + case ':': + ++p; + wtype = w_dcolon; + break; + + case '=': + ++p; + wtype = w_varassign; + break; + } + break; + + case '+': + case '?': + if (*p == '=') + { + ++p; + wtype = w_varassign; + break; + } + + default: + if (delim && strchr (delim, c)) + wtype = w_static; + break; + } + + /* Did we find something? If so, return now. */ + if (wtype != w_bogus) + goto done; + + /* This is some non-operator word. A word consists of the longest + string of characters that doesn't contain whitespace, one of [:=#], + or [?+]=, or one of the chars in the DELIM string. */ + + /* We start out assuming a static word; if we see a variable we'll + adjust our assumptions then. */ + wtype = w_static; + + /* We already found the first value of "c", above. */ + while (1) + { + char closeparen; + int count; + + switch (c) + { + case '\0': + case ' ': + case '\t': + case '=': + goto done_word; + + case ':': +#ifdef HAVE_DOS_PATHS + /* A word CAN include a colon in its drive spec. The drive + spec is allowed either at the beginning of a word, or as part + of the archive member name, like in "libfoo.a(d:/foo/bar.o)". */ + if (!(p - beg >= 2 + && (*p == '/' || *p == '\\') && isalpha ((unsigned char)p[-2]) + && (p - beg == 2 || p[-3] == '('))) +#endif + goto done_word; + + case '$': + c = *(p++); + if (c == '$') + break; + + /* This is a variable reference, so note that it's expandable. + Then read it to the matching close paren. */ + wtype = w_variable; + + if (c == '(') + closeparen = ')'; + else if (c == '{') + closeparen = '}'; + else + /* This is a single-letter variable reference. */ + break; + + for (count=0; *p != '\0'; ++p) + { + if (*p == c) + ++count; + else if (*p == closeparen && --count < 0) + { + ++p; + break; + } + } + break; + + case '?': + case '+': + if (*p == '=') + goto done_word; + break; + + case '\\': + switch (*p) + { + case ':': + case ';': + case '=': + case '\\': + ++p; + break; + } + break; + + default: + if (delim && strchr (delim, c)) + goto done_word; + break; + } + + c = *(p++); + } + done_word: + --p; + + done: + if (startp) + *startp = beg; + if (length) + *length = p - beg; + return wtype; +} + +/* Construct the list of include directories + from the arguments and the default list. */ + +void +construct_include_path (const char **arg_dirs) +{ +#ifdef VAXC /* just don't ask ... */ + stat_t stbuf; +#else + struct stat stbuf; +#endif + const char **dirs; + const char **cpp; + unsigned int idx; + + /* Compute the number of pointers we need in the table. */ + idx = sizeof (default_include_directories) / sizeof (const char *); + if (arg_dirs) + for (cpp = arg_dirs; *cpp != 0; ++cpp) + ++idx; + +#ifdef __MSDOS__ + /* Add one for $DJDIR. */ + ++idx; +#endif + + dirs = xmalloc (idx * sizeof (const char *)); + + idx = 0; + max_incl_len = 0; + + /* First consider any dirs specified with -I switches. + Ignore any that don't exist. Remember the maximum string length. */ + + if (arg_dirs) + while (*arg_dirs != 0) + { + const char *dir = *(arg_dirs++); + char *expanded = 0; + int e; + + if (dir[0] == '~') + { + expanded = tilde_expand (dir); + if (expanded != 0) + dir = expanded; + } + + EINTRLOOP (e, stat (dir, &stbuf)); + if (e == 0 && S_ISDIR (stbuf.st_mode)) + { + unsigned int len = strlen (dir); + /* If dir name is written with trailing slashes, discard them. */ + while (len > 1 && dir[len - 1] == '/') + --len; + if (len > max_incl_len) + max_incl_len = len; + dirs[idx++] = strcache_add_len (dir, len); + } + + if (expanded) + free (expanded); + } + + /* Now add the standard default dirs at the end. */ + +#ifdef __MSDOS__ + { + /* The environment variable $DJDIR holds the root of the DJGPP directory + tree; add ${DJDIR}/include. */ + struct variable *djdir = lookup_variable ("DJDIR", 5); + + if (djdir) + { + unsigned int len = strlen (djdir->value) + 8; + char *defdir = alloca (len + 1); + + strcat (strcpy (defdir, djdir->value), "/include"); + dirs[idx++] = strcache_add (defdir); + + if (len > max_incl_len) + max_incl_len = len; + } + } +#endif + + for (cpp = default_include_directories; *cpp != 0; ++cpp) + { + int e; + + EINTRLOOP (e, stat (*cpp, &stbuf)); + if (e == 0 && S_ISDIR (stbuf.st_mode)) + { + unsigned int len = strlen (*cpp); + /* If dir name is written with trailing slashes, discard them. */ + while (len > 1 && (*cpp)[len - 1] == '/') + --len; + if (len > max_incl_len) + max_incl_len = len; + dirs[idx++] = strcache_add_len (*cpp, len); + } + } + + dirs[idx] = 0; + + /* Now add each dir to the .INCLUDE_DIRS variable. */ + + for (cpp = dirs; *cpp != 0; ++cpp) + do_variable_definition (NILF, ".INCLUDE_DIRS", *cpp, + o_default, f_append, 0); + + include_directories = dirs; +} + +/* Expand ~ or ~USER at the beginning of NAME. + Return a newly malloc'd string or 0. */ + +char * +tilde_expand (const char *name) +{ +#ifndef VMS + if (name[1] == '/' || name[1] == '\0') + { + extern char *getenv (); + char *home_dir; + int is_variable; + + { + /* Turn off --warn-undefined-variables while we expand HOME. */ + int save = warn_undefined_variables_flag; + warn_undefined_variables_flag = 0; + + home_dir = allocated_variable_expand ("$(HOME)"); + + warn_undefined_variables_flag = save; + } + + is_variable = home_dir[0] != '\0'; + if (!is_variable) + { + free (home_dir); + home_dir = getenv ("HOME"); + } +# if !defined(_AMIGA) && !defined(WINDOWS32) + if (home_dir == 0 || home_dir[0] == '\0') + { + extern char *getlogin (); + char *logname = getlogin (); + home_dir = 0; + if (logname != 0) + { + struct passwd *p = getpwnam (logname); + if (p != 0) + home_dir = p->pw_dir; + } + } +# endif /* !AMIGA && !WINDOWS32 */ + if (home_dir != 0) + { + char *new = xstrdup (concat (2, home_dir, name + 1)); + if (is_variable) + free (home_dir); + return new; + } + } +# if !defined(_AMIGA) && !defined(WINDOWS32) + else + { + struct passwd *pwent; + char *userend = strchr (name + 1, '/'); + if (userend != 0) + *userend = '\0'; + pwent = getpwnam (name + 1); + if (pwent != 0) + { + if (userend == 0) + return xstrdup (pwent->pw_dir); + else + return xstrdup (concat (3, pwent->pw_dir, "/", userend + 1)); + } + else if (userend != 0) + *userend = '/'; + } +# endif /* !AMIGA && !WINDOWS32 */ +#endif /* !VMS */ + return 0; +} + +/* Parse a string into a sequence of filenames represented as a chain of + struct nameseq's and return that chain. Optionally expand the strings via + glob(). + + The string is passed as STRINGP, the address of a string pointer. + The string pointer is updated to point at the first character + not parsed, which either is a null char or equals STOPCHAR. + + SIZE is how big to construct chain elements. + This is useful if we want them actually to be other structures + that have room for additional info. + + PREFIX, if non-null, is added to the beginning of each filename. + + FLAGS allows one or more of the following bitflags to be set: + PARSEFS_NOSTRIP - Do no strip './'s off the beginning + PARSEFS_NOAR - Do not check filenames for archive references + PARSEFS_NOGLOB - Do not expand globbing characters + PARSEFS_EXISTS - Only return globbed files that actually exist + (cannot also set NOGLOB) + PARSEFS_NOCACHE - Do not add filenames to the strcache (caller frees) + */ + +void * +parse_file_seq (char **stringp, unsigned int size, int stopchar, + const char *prefix, int flags) +{ + extern void dir_setup_glob (glob_t *glob); + + /* tmp points to tmpbuf after the prefix, if any. + tp is the end of the buffer. */ + static char *tmpbuf = NULL; + static int tmpbuf_len = 0; + + int cachep = (! (flags & PARSEFS_NOCACHE)); + + struct nameseq *new = 0; + struct nameseq **newp = &new; +#define NEWELT(_n) do { \ + const char *__n = (_n); \ + *newp = xcalloc (size); \ + (*newp)->name = (cachep ? strcache_add (__n) : xstrdup (__n)); \ + newp = &(*newp)->next; \ + } while(0) + + char *p; + glob_t gl; + char *tp; + +#ifdef VMS +# define VMS_COMMA ',' +#else +# define VMS_COMMA 0 +#endif + + if (size < sizeof (struct nameseq)) + size = sizeof (struct nameseq); + + if (! (flags & PARSEFS_NOGLOB)) + dir_setup_glob (&gl); + + /* Get enough temporary space to construct the largest possible target. */ + { + int l = strlen (*stringp) + 1; + if (l > tmpbuf_len) + { + tmpbuf = xrealloc (tmpbuf, l); + tmpbuf_len = l; + } + } + tp = tmpbuf; + + /* Parse STRING. P will always point to the end of the parsed content. */ + p = *stringp; + while (1) + { + const char *name; + const char **nlist = 0; + char *tildep = 0; +#ifndef NO_ARCHIVES + char *arname = 0; + char *memname = 0; +#endif + char *s; + int nlen; + int i; + + /* Skip whitespace; at the end of the string or STOPCHAR we're done. */ + p = next_token (p); + if (*p == '\0' || *p == stopchar) + break; + + /* There are names left, so find the end of the next name. + Throughout this iteration S points to the start. */ + s = p; + p = find_char_unquote (p, stopchar, VMS_COMMA, 1, 0); +#ifdef VMS + /* convert comma separated list to space separated */ + if (p && *p == ',') + *p =' '; +#endif +#ifdef _AMIGA + if (stopchar == ':' && p && *p == ':' + && !(isspace ((unsigned char)p[1]) || !p[1] + || isspace ((unsigned char)p[-1]))) + p = find_char_unquote (p+1, stopchar, VMS_COMMA, 1, 0); +#endif +#ifdef HAVE_DOS_PATHS + /* For DOS paths, skip a "C:\..." or a "C:/..." until we find the + first colon which isn't followed by a slash or a backslash. + Note that tokens separated by spaces should be treated as separate + tokens since make doesn't allow path names with spaces */ + if (stopchar == ':') + while (p != 0 && !isspace ((unsigned char)*p) && + (p[1] == '\\' || p[1] == '/') && isalpha ((unsigned char)p[-1])) + p = find_char_unquote (p + 1, stopchar, VMS_COMMA, 1, 0); +#endif + if (p == 0) + p = s + strlen (s); + + /* Strip leading "this directory" references. */ + if (! (flags & PARSEFS_NOSTRIP)) +#ifdef VMS + /* Skip leading `[]'s. */ + while (p - s > 2 && s[0] == '[' && s[1] == ']') +#else + /* Skip leading `./'s. */ + while (p - s > 2 && s[0] == '.' && s[1] == '/') +#endif + { + /* Skip "./" and all following slashes. */ + s += 2; + while (*s == '/') + ++s; + } + + /* Extract the filename just found, and skip it. + Set NAME to the string, and NLEN to its length. */ + + if (s == p) + { + /* The name was stripped to empty ("./"). */ +#if defined(VMS) + continue; +#elif defined(_AMIGA) + /* PDS-- This cannot be right!! */ + tp[0] = '\0'; + nlen = 0; +#else + tp[0] = '.'; + tp[1] = '/'; + tp[2] = '\0'; + nlen = 2; +#endif + } + else + { +#ifdef VMS +/* VMS filenames can have a ':' in them but they have to be '\'ed but we need + * to remove this '\' before we can use the filename. + * xstrdup called because S may be read-only string constant. + */ + char *n = tp; + while (s < p) + { + if (s[0] == '\\' && s[1] == ':') + ++s; + *(n++) = *(s++); + } + n[0] = '\0'; + nlen = strlen (tp); +#else + nlen = p - s; + memcpy (tp, s, nlen); + tp[nlen] = '\0'; +#endif + } + + /* At this point, TP points to the element and NLEN is its length. */ + +#ifndef NO_ARCHIVES + /* If this is the start of an archive group that isn't complete, set up + to add the archive prefix for future files. A file list like: + "libf.a(x.o y.o z.o)" needs to be expanded as: + "libf.a(x.o) libf.a(y.o) libf.a(z.o)" + + TP == TMP means we're not already in an archive group. Ignore + something starting with `(', as that cannot actually be an + archive-member reference (and treating it as such results in an empty + file name, which causes much lossage). Also if it ends in ")" then + it's a complete reference so we don't need to treat it specially. + + Finally, note that archive groups must end with ')' as the last + character, so ensure there's some word ending like that before + considering this an archive group. */ + if (! (flags & PARSEFS_NOAR) + && tp == tmpbuf && tp[0] != '(' && tp[nlen-1] != ')') + { + char *n = strchr (tp, '('); + if (n) + { + /* This looks like the first element in an open archive group. + A valid group MUST have ')' as the last character. */ + const char *e = p + nlen; + do + { + e = next_token (e); + /* Find the end of this word. We don't want to unquote and + we don't care about quoting since we're looking for the + last char in the word. */ + while (*e != '\0' && *e != stopchar && *e != VMS_COMMA + && ! isblank ((unsigned char) *e)) + ++e; + if (e[-1] == ')') + { + /* Found the end, so this is the first element in an + open archive group. It looks like "lib(mem". + Reset TP past the open paren. */ + nlen -= (n + 1) - tp; + tp = n + 1; + + /* If we have just "lib(", part of something like + "lib( a b)", go to the next item. */ + if (! nlen) + continue; + + /* We can stop looking now. */ + break; + } + } + while (*e != '\0'); + } + } + + /* If we are inside an archive group, make sure it has an end. */ + if (tp > tmpbuf) + { + if (tp[nlen-1] == ')') + { + /* This is the natural end; reset TP. */ + tp = tmpbuf; + + /* This is just ")", something like "lib(a b )": skip it. */ + if (nlen == 1) + continue; + } + else + { + /* Not the end, so add a "fake" end. */ + tp[nlen++] = ')'; + tp[nlen] = '\0'; + } + } +#endif + + /* If we're not globbing we're done: add it to the end of the chain. + Go to the next item in the string. */ + if (flags & PARSEFS_NOGLOB) + { + NEWELT (concat (2, prefix, tp)); + continue; + } + + /* If we get here we know we're doing glob expansion. + TP is a string in tmpbuf. NLEN is no longer used. + We may need to do more work: after this NAME will be set. */ + name = tp; + + /* Expand tilde if applicable. */ + if (tp[0] == '~') + { + tildep = tilde_expand (tp); + if (tildep != 0) + name = tildep; + } + +#ifndef NO_ARCHIVES + /* If NAME is an archive member reference replace it with the archive + file name, and save the member name in MEMNAME. We will glob on the + archive name and then reattach MEMNAME later. */ + if (! (flags & PARSEFS_NOAR) && ar_name (name)) + { + ar_parse_name (name, &arname, &memname); + name = arname; + } +#endif /* !NO_ARCHIVES */ + + switch (glob (name, GLOB_NOSORT|GLOB_ALTDIRFUNC, NULL, &gl)) + { + case GLOB_NOSPACE: + fatal (NILF, _("virtual memory exhausted")); + + case 0: + /* Success. */ + i = gl.gl_pathc; + nlist = (const char **)gl.gl_pathv; + break; + + case GLOB_NOMATCH: + /* If we want only existing items, skip this one. */ + if (flags & PARSEFS_EXISTS) + { + i = 0; + break; + } + /* FALLTHROUGH */ + + default: + /* By default keep this name. */ + i = 1; + nlist = &name; + break; + } + + /* For each matched element, add it to the list. */ + while (i-- > 0) +#ifndef NO_ARCHIVES + if (memname != 0) + { + /* Try to glob on MEMNAME within the archive. */ + struct nameseq *found = ar_glob (nlist[i], memname, size); + if (! found) + /* No matches. Use MEMNAME as-is. */ + NEWELT (concat (5, prefix, nlist[i], "(", memname, ")")); + else + { + /* We got a chain of items. Attach them. */ + (*newp)->next = found; + + /* Find and set the new end. Massage names if necessary. */ + while (1) + { + if (! cachep) + found->name = xstrdup (concat (2, prefix, name)); + else if (prefix) + found->name = strcache_add (concat (2, prefix, name)); + + if (found->next == 0) + break; + + found = found->next; + } + newp = &found->next; + } + } + else +#endif /* !NO_ARCHIVES */ + NEWELT (concat (2, prefix, nlist[i])); + + globfree (&gl); + +#ifndef NO_ARCHIVES + if (arname) + free (arname); +#endif + + if (tildep) + free (tildep); + } + + *stringp = p; + return new; +} diff --git a/readme.vms b/readme.vms new file mode 100644 index 0000000..ec3d624 --- /dev/null +++ b/readme.vms @@ -0,0 +1,392 @@ +This is the VMS version of GNU Make, updated by Hartmut Becker + +Changes are based on GNU make 3.82. + +This version was built and tested on OpenVMS V7.3 (VAX), V7.3-2 (Alpha) and +V8.3-1H1 (I64). + +Build instructions +Make a 1st version + $ @makefile.com ! ignore any compiler and/or linker warning + $ rena make.exe 1st-make.exe +Use the 1st version to generate a 2nd version + $ mc sys$disk:[]1st-make clean + $ mc sys$disk:[]1st-make +Verify your 2nd version + $ rena make.exe 2nd-make.exe + $ mc sys$disk:[]2nd-make clean + $ mc sys$disk:[]2nd-make + +Changes (3.81.90) + +Michael Gehre (at VISTEC-SEMI dot COM) supplied a fix for a problem with +timestamps of object modules in OLBs. The timestamps were not correctly +adjusted to GMT based time, if the local VMS time was using a daylight saving +algorithm and if daylight saving was switched off. + +John Eisenbraun (at HP dot COM) supplied fixes and and an enhancement to append +output redirection in action lines. + +Rework of ctrl+c and ctrl+y handling. + +Fix a problem with cached strings, which showed on case-insensitive file +systems. + +Build fixes for const-ified code in VMS specific sources. + +Build notes: +- Try to avoid HP C V7.2-001, which has an incompatible change +how __STDC__ is defined. This results at least in compile time warnings. + +- On V8.3-1H1, if you press Ctrl+C you may see a traceback, starting with +%SYSTEM-F-CONTROLC, operation completed under CTRL/C +%TRACE-F-TRACEBACK, symbolic stack dump follows +image module routine line rel PC abs PC + +DECC$SHR C$SIGNAL gsignal 27991 0000000000001180 +FFFFFFFF84AB2DA0 +DECC$SHR C$SIGNAL raise 28048 0000000000001280 +FFFFFFFF84AB2EA0 +DECC$SHR C$SIGPENDING decc$$deliver_signals + 12475 0000000000000890 +FFFFFFFF84C13690 +... +This looks like an incompatibility to the Alpha and VAX behavior, so it looks +like a problem in I64 VMS version(s). + +- There is no clean build on VAX. In the environment I tested, I had to use GNU +make's alloca which produced a couple of compile time warnings. It seems too +much effort to work on a clean build on VAX. + +A note on appending the redirected output. With this change, a simple mechanism +is implemented to make ">>" work in action lines. In VMS there is no simple +feature like ">>" to have DCL command or program output redirected and appended +to a file. GNU make for VMS already implements the redirection of output. If +such a redirection is detected, an ">" on the action line, GNU make creates a +DCL command procedure to execute the action and to redirect its output. Based +on that, now ">>" is also recognized and a similar but different command +procedure is created to implement the append. The main idea here is to create a +temporary file which collects the output and which is appended to the wanted +output file. Then the temporary file is deleted. This is all done in the +command procedure to keep changes in make small and simple. This obviously has +some limitations but it seems good enough compared with the current ">" +implementation. (And in my opinion, redirection is not really what GNU make has +to do.) With this approach, it may happen that the temporary file is not yet +appended and is left in SYS$SCRATCH. The temporary file names look like +"CMDxxxxx.". Any time the created command procedure can not complete, this +happens. Pressing Ctrl+Y to abort make is one case. In case of Ctrl+Y the +associated command procedure is left in SYS$SCRATCH as well. Its name is +CMDxxxxx.COM. + +Change in the Ctrl+Y handling + +Ctrl+Y was: The CtrlY handler called $forcex for the current child. + +Ctrl+Y changed: The CtrlY handler uses $delprc to delete all children. This way +also actions with DCL commands will be stopped. As before Ctrl+Y then sends +SIGQUIT to itself, which is handled in common code. + +Change in deleteing temporary command files + +Temporary command files were deleted in the main line, after returning from the +vms child termination handler. If Ctrl+C was pressed, the handler is called but +did not return to main line. + +Now, temporary command files are deleted in the vms child termination +handler. That deletes the them even if a Ctrl+C was pressed. + +The behavior of pressing Ctrl+C is not changed. It still has only an effect, +after the current action is terminated. If that doesn't happen or takes too +long, Ctrl+Y should be used instead. + +Changes (3.80) + +. In default.c define variable ARCH as IA64 for VMS on Itanium systems. + +. In makefile.vms avoid name collision for glob and globfree. + +In newer version of the VMS CRTL there are glob and globfree implemented. +Compiling and linking may result in + + %ILINK-W-MULDEFLNKG, symbol DECC$GLOBFREE has subsequent linkage definition + in module DECC$SHR file SYS$COMMON:[SYSLIB]DECC$SHR.EXE;1 + %ILINK-W-MULDEF, symbol DECC$GLOBFREE multiply defined + in module DECC$SHR file SYS$COMMON:[SYSLIB]DECC$SHR.EXE;1 + +linker messages (and similar for DECC$GLOB). The messages just say, that +globfree is a known CRTL whose name was mapped by the compiler to +DECC$GLOBFREE. This is done in glob.c as well, so this name is defined +twice. One possible solution is to use the VMS versions of glob and +globfree. However, then the build environment needs to figure out if +there is a new CRTL supporting these or not. This adds complexity. Even +more, these functions return VMS file specifications, which is not +expected by the other make sources. There is a switch at run time (a VMS +logical DECC$GLOB_UNIX_STYLE), which can be set to get Unix style +names. This may conflict with other software. The recommended solution +for this is to set this switch just prior to calling main: in an +initialization routine. This adds more complexity and more VMS specific +code. It is easier to tell the compiler NOT to map the routine names +with a simple change in makefile.vms. + +Some notes on case sensitive names in rules and on the disk. In the VMS +template for CONFIG.H case sensitive rules can be enabled with defining +WANT_CASE_SENSITIVE_TARGETS. For recent version of VMS there is a case +sensitive file system: ODS5. To make use of that, additionally un-defining +the HAVE_CASE_INSENSITIVE_FS is required. As these are C macros, different +versions of make need to be built to have any case sensitivity for VMS +working. Unfortunately, for ODS5 disks that's not all. + +- Usually DCL upcases command line tokens (except strings) and usually the + file system is case blind (similar to how Windows systems work) + $ set proc/parse=extended/case=sensitive + preserves lower and UPPER on the command line and (for this process and all + sub-processes) enables case sensitivity in the file system + +- Usually the CRTL tries to reverse what DCL did with command line tokens, it + lowercases all tokens (except strings) + $ define DECC$ARGV_PARSE_STYLE enable + passes (the now preserved) lower and UPPER from the command line to main() + +- Usually the CRTL upcases the arguments to open() and friends + $ define DECC$EFS_CASE_PRESERVE enable + preserves the names as is. + +It is important to know that not all VMS tools are ready for case sensitivity. +With this setup some tools may not work as expected. The setup should not +blindly be applied for all users in default login procedures. + +Example? The poor coding gives a compiler message, showing that there are +different files: + +$ dir + +Directory ODS5DISK[HB] + +A.c;1 B.c;1 c.c;1 X.c;1 +x.c;1 + +Total of 5 files. +$ ods5make x.obj +cc /obj=x.obj x.c + +foo(){lowercase_x();} +......^ +%CC-I-IMPLICITFUNC, In this statement, the identifier "lowercase_x" is implicitly declared as a function. +at line number 1 in file ODS5DISK[HB]x.c;1 +$ mc SYS$SYSDEVICE:[HARTMUT.MAKE_3_80P]ods5make X.obj +cc /obj=X.obj X.c + +foo() {UPPERCASE_X();} +.......^ +%CC-I-IMPLICITFUNC, In this statement, the identifier "UPPERCASE_X" is implicitly declared as a function. +at line number 1 in file ODS5DISK[HB]X.c;1 +$ dir + +Directory ODS5DISK[HB] + +A.c;1 B.c;1 c.c;1 X.c;1 +x.c;1 X.obj;1 x.obj;1 + +Total of 7 files. +$ + +This is the VMS port of GNU Make done by Hartmut.Becker@compaq.com. + +It is based on the specific version 3.77k and on 3.78.1. 3.77k was done +by Klaus Kämpf , the code was based on the VMS port of +GNU Make 3.60 by Mike Moretti. + +It was ported on OpenVMS/Alpha V7.1, DECC V5.7-006. It was re-build and +tested on OpenVMS/Alpha V7.2, OpenVMS/VAX 7.1 and 5.5-2. Different +versions of DECC were used. VAXC was tried: it fails; but it doesn't +seem worth to get it working. There are still some PTRMISMATCH warnings +during the compile. Although perl is working on VMS the test scripts +don't work. The function $shell is still missing. + +There is a known bug in some of the VMS CRTLs. It is in the shipped +versions of VMS V7.2 and V7.2-1 and in the currently (October 1999) +available ECOs for VMS V7.1 and newer versions. It is fixed in versions +shipped with newer VMS versions and all ECO kits after October 1999. It +only shows up during the daylight saving time period (DST): stat() +returns a modification time 1 hour ahead. This results in GNU make +warning messages. For a just created source you will see: + + $ gmake x.exe + gmake.exe;1: *** Warning: File `x.c' has modification time in the future (940582863 > 940579269) + cc /obj=x.obj x.c + link x.obj /exe=x.exe + gmake.exe;1: *** Warning: Clock skew detected. Your build may be incomplete. + + +New in 3.78.1: + +Fix a problem with automatically remaking makefiles. GNU make uses an +execve to restart itself after a successful remake of the makefile. On +UNIX systems execve replaces the running program with a new one and +resets all signal handling to the default. On VMS execve creates a child +process, signal and exit handlers of the parent are still active, and, +unfortunately, corrupt the exit code from the child. Fix in job.c: +ignore SIGCHLD. + +Added some switches to reflect latest features of DECC. Modifications in +makefile.vms. + +Set some definitions to reflect latest features of DECC. Modifications in +config.h-vms (which is copied to config.h). + +Added extern strcmpi declaration to avoid 'implicitly declared' messages. +Modification in make.h. + +Default rule for C++, conditionals for gcc (GCC_IS_NATIVE) or DEC/Digital/ +Compaq c/c++ compilers. Modifications in default.c. + +Usage of opendir() and friends, suppress file version. Modifications in dir.c. + +Added VMS specific code to handle ctrl+c and ctrl+y to abort make. +Modifications in job.c. + +Added support to have case sensitive targets and dependencies but to +still use case blind file names. This is especially useful for Java +makefiles on VMS: + + .SUFFIXES : + .SUFFIXES : .class .java + .java.class : + javac "$< + HelloWorld.class : HelloWorld.java + +A new macro WANT_CASE_SENSITIVE_TARGETS in config.h-vms was introduced. +It needs to be enabled to get this feature; default is disabled. The +macro HAVE_CASE_INSENSITIVE_FS must not be touched: it is still enabled. +Modifications in file.c and config.h-vms. + +Bootstrap make to start building make is still makefile.com, but make +needs to be re-made with a make to make a correct version: ignore all +possible warnings, delete all objects, rename make.exe to a different +name and run it. + +Made some minor modifications to the bootstrap build makefile.com. + +This is the VMS port of GNU Make. + +It is based on the VMS port of GNU Make 3.60 by Mike Moretti. + +This port was done by Klaus Kämpf + +There is first-level support available from proGIS Software, Germany. +Visit their web-site at http://www.progis.de to get information +about other vms software and forthcoming updates to gnu make. + +New for 3.77: + +/bin/sh style I/O redirection is supported. You can now write lines like + mcr sys$disk:[]program.exe < input.txt > output.txt &> error.txt + +Makefile variables are looked up in the current environment. You can set +symbols or logicals in DCL and evaluate them in the Makefile via +$(). Variables defined in the Makefile +override VMS symbols/logicals ! + +Functions for file names are working now. See the GNU Make manual for +$(dir ...) and $(wildcard ...). Unix-style and VMS-style names are +supported as arguments. + +The default rules are set up for GNU C. Building an executable from a +single source file is as easy as 'make file.exe'. + +The variable $(ARCH) is predefined as ALPHA or VAX resp. Makefiles for +different VMS systems can now be written by checking $(ARCH) as in + ifeq ($(ARCH),ALPHA) + $(ECHO) "On the Alpha" + else + $(ECHO) "On the VAX" + endif + +Command lines of excessive length are correctly broken and written to a +batch file in sys$scratch for later execution. There's no limit to the +lengths of commands (and no need for .opt files :-) any more. + +Empty commands are handled correctly and don't end in a new DCL process. + + +New for 3.76: + +John W. Eaton has updated the VMS port to support libraries and VPATH. + + +To build Make, simply type @makefile. This should compile all the +necessary files and link Make. There is also a file called +makefile.vms. If you already have GNU Make built you can just use +Make with this makefile to rebuild. + +Here are some notes about GNU Make for VMS: + +The cd command is supported if it's called as $(CD). This invokes +the 'builtin_cd' command which changes the directory. +Calling 'set def' doesn't do the trick, since a sub-shell is +spawned for this command, the directory is changed *in this sub-shell* +and the sub-shell ends. + +Libraries are not supported. They were in GNU Make 3.60 but somehow I +didn't care porting the code. If there is enough interest, I'll do it at +some later time. + +The variable $^ separates files with commas instead of spaces (It's the +natural thing to do for VMS). + +See defaults.c for VMS default suffixes and my definitions for default +rules and variables. + +The shell function is not implemented yet. + +Load average routines haven't been implemented for VMS yet. + +The default include directory for including other makefiles is +SYS$SYSROOT:[SYSLIB] (I don't remember why I didn't just use +SYS$LIBRARY: instead; maybe it wouldn't work that way). + +The default makefiles make looks for are: makefile.vms, gnumakefile, +makefile., and gnumakefile. . + +The stat() function and handling of time stamps in VMS is broken, so I +replaced it with a hack in vmsfunctions.c. I will provide a full rewrite +somewhere in the future. Be warned, the time resolution inside make is +less than what vms provides. This might be a problem on the faster Alphas. + +You can use a : in a filename only if you preceed it with a backslash ('\'). +E.g.- hobbes\:[bogas.files] + +Make ignores success, informational, or warning errors (-S-, -I-, or +-W-). But it will stop on -E- and -F- errors. (unless you do something +to override this in your makefile, or whatever). + +Remote stuff isn't implemented yet. + +Multiple line DCL commands, such as "if" statements, must be put inside +command files. You can run a command file by using \@. + + +VMS changes made for 3.74.3 + +Lots of default settings are adapted for VMS. See default.c. + +Long command lines are now converted to command files. + +Comma (',') as a separator is now allowed. See makefile.vms for an example. + +------------------------------------------------------------------------------- +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/remake.c b/remake.c new file mode 100644 index 0000000..27d2550 --- /dev/null +++ b/remake.c @@ -0,0 +1,1662 @@ +/* Basic dependency engine for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "filedef.h" +#include "job.h" +#include "commands.h" +#include "dep.h" +#include "variable.h" +#include "debug.h" + +#include + +#ifdef HAVE_FCNTL_H +#include +#else +#include +#endif + +#ifdef VMS +#include +#endif +#ifdef WINDOWS32 +#include +#endif + +extern int try_implicit_rule (struct file *file, unsigned int depth); + + +/* The test for circular dependencies is based on the 'updating' bit in + `struct file'. However, double colon targets have seperate `struct + file's; make sure we always use the base of the double colon chain. */ + +#define start_updating(_f) (((_f)->double_colon ? (_f)->double_colon : (_f))\ + ->updating = 1) +#define finish_updating(_f) (((_f)->double_colon ? (_f)->double_colon : (_f))\ + ->updating = 0) +#define is_updating(_f) (((_f)->double_colon ? (_f)->double_colon : (_f))\ + ->updating) + + +/* Incremented when a command is started (under -n, when one would be). */ +unsigned int commands_started = 0; + +/* Current value for pruning the scan of the goal chain (toggle 0/1). */ +static unsigned int considered; + +static int update_file (struct file *file, unsigned int depth); +static int update_file_1 (struct file *file, unsigned int depth); +static int check_dep (struct file *file, unsigned int depth, + FILE_TIMESTAMP this_mtime, int *must_make_ptr); +static int touch_file (struct file *file); +static void remake_file (struct file *file); +static FILE_TIMESTAMP name_mtime (const char *name); +static const char *library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr); + + +/* Remake all the goals in the `struct dep' chain GOALS. Return -1 if nothing + was done, 0 if all goals were updated successfully, or 1 if a goal failed. + + If rebuilding_makefiles is nonzero, these goals are makefiles, so -t, -q, + and -n should be disabled for them unless they were also command-line + targets, and we should only make one goal at a time and return as soon as + one goal whose `changed' member is nonzero is successfully made. */ + +int +update_goal_chain (struct dep *goals) +{ + int t = touch_flag, q = question_flag, n = just_print_flag; + int status = -1; + +#define MTIME(file) (rebuilding_makefiles ? file_mtime_no_search (file) \ + : file_mtime (file)) + + /* Duplicate the chain so we can remove things from it. */ + + goals = copy_dep_chain (goals); + + { + /* Clear the `changed' flag of each goal in the chain. + We will use the flag below to notice when any commands + have actually been run for a target. When no commands + have been run, we give an "up to date" diagnostic. */ + + struct dep *g; + for (g = goals; g != 0; g = g->next) + g->changed = 0; + } + + /* All files start with the considered bit 0, so the global value is 1. */ + considered = 1; + + /* Update all the goals until they are all finished. */ + + while (goals != 0) + { + register struct dep *g, *lastgoal; + + /* Start jobs that are waiting for the load to go down. */ + + start_waiting_jobs (); + + /* Wait for a child to die. */ + + reap_children (1, 0); + + lastgoal = 0; + g = goals; + while (g != 0) + { + /* Iterate over all double-colon entries for this file. */ + struct file *file; + int stop = 0, any_not_updated = 0; + + for (file = g->file->double_colon ? g->file->double_colon : g->file; + file != NULL; + file = file->prev) + { + unsigned int ocommands_started; + int x; + + file->dontcare = g->dontcare; + + check_renamed (file); + if (rebuilding_makefiles) + { + if (file->cmd_target) + { + touch_flag = t; + question_flag = q; + just_print_flag = n; + } + else + touch_flag = question_flag = just_print_flag = 0; + } + + /* Save the old value of `commands_started' so we can compare + later. It will be incremented when any commands are + actually run. */ + ocommands_started = commands_started; + + x = update_file (file, rebuilding_makefiles ? 1 : 0); + check_renamed (file); + + /* Set the goal's `changed' flag if any commands were started + by calling update_file above. We check this flag below to + decide when to give an "up to date" diagnostic. */ + if (commands_started > ocommands_started) + g->changed = 1; + + /* If we updated a file and STATUS was not already 1, set it to + 1 if updating failed, or to 0 if updating succeeded. Leave + STATUS as it is if no updating was done. */ + + stop = 0; + if ((x != 0 || file->updated) && status < 1) + { + if (file->update_status != 0) + { + /* Updating failed, or -q triggered. The STATUS value + tells our caller which. */ + status = file->update_status; + /* If -q just triggered, stop immediately. It doesn't + matter how much more we run, since we already know + the answer to return. */ + stop = (question_flag && !keep_going_flag + && !rebuilding_makefiles); + } + else + { + FILE_TIMESTAMP mtime = MTIME (file); + check_renamed (file); + + if (file->updated && g->changed && + mtime != file->mtime_before_update) + { + /* Updating was done. If this is a makefile and + just_print_flag or question_flag is set (meaning + -n or -q was given and this file was specified + as a command-line target), don't change STATUS. + If STATUS is changed, we will get re-exec'd, and + enter an infinite loop. */ + if (!rebuilding_makefiles + || (!just_print_flag && !question_flag)) + status = 0; + if (rebuilding_makefiles && file->dontcare) + /* This is a default makefile; stop remaking. */ + stop = 1; + } + } + } + + /* Keep track if any double-colon entry is not finished. + When they are all finished, the goal is finished. */ + any_not_updated |= !file->updated; + + file->dontcare = 0; + + if (stop) + break; + } + + /* Reset FILE since it is null at the end of the loop. */ + file = g->file; + + if (stop || !any_not_updated) + { + /* If we have found nothing whatever to do for the goal, + print a message saying nothing needs doing. */ + + if (!rebuilding_makefiles + /* If the update_status is zero, we updated successfully + or not at all. G->changed will have been set above if + any commands were actually started for this goal. */ + && file->update_status == 0 && !g->changed + /* Never give a message under -s or -q. */ + && !silent_flag && !question_flag) + message (1, ((file->phony || file->cmds == 0) + ? _("Nothing to be done for `%s'.") + : _("`%s' is up to date.")), + file->name); + + /* This goal is finished. Remove it from the chain. */ + if (lastgoal == 0) + goals = g->next; + else + lastgoal->next = g->next; + + /* Free the storage. */ + free (g); + + g = lastgoal == 0 ? goals : lastgoal->next; + + if (stop) + break; + } + else + { + lastgoal = g; + g = g->next; + } + } + + /* If we reached the end of the dependency graph toggle the considered + flag for the next pass. */ + if (g == 0) + considered = !considered; + } + + if (rebuilding_makefiles) + { + touch_flag = t; + question_flag = q; + just_print_flag = n; + } + + return status; +} + +/* If FILE is not up to date, execute the commands for it. + Return 0 if successful, 1 if unsuccessful; + but with some flag settings, just call `exit' if unsuccessful. + + DEPTH is the depth in recursions of this function. + We increment it during the consideration of our dependencies, + then decrement it again after finding out whether this file + is out of date. + + If there are multiple double-colon entries for FILE, + each is considered in turn. */ + +static int +update_file (struct file *file, unsigned int depth) +{ + register int status = 0; + register struct file *f; + + f = file->double_colon ? file->double_colon : file; + + /* Prune the dependency graph: if we've already been here on _this_ + pass through the dependency graph, we don't have to go any further. + We won't reap_children until we start the next pass, so no state + change is possible below here until then. */ + if (f->considered == considered) + { + /* Check for the case where a target has been tried and failed but + the diagnostics hasn't been issued. If we need the diagnostics + then we will have to continue. */ + if (!(f->updated && f->update_status > 0 && !f->dontcare && f->no_diag)) + { + DBF (DB_VERBOSE, _("Pruning file `%s'.\n")); + return f->command_state == cs_finished ? f->update_status : 0; + } + } + + /* This loop runs until we start commands for a double colon rule, or until + the chain is exhausted. */ + for (; f != 0; f = f->prev) + { + f->considered = considered; + + status |= update_file_1 (f, depth); + check_renamed (f); + + /* Clean up any alloca() used during the update. */ + alloca (0); + + /* If we got an error, don't bother with double_colon etc. */ + if (status != 0 && !keep_going_flag) + return status; + + if (f->command_state == cs_running + || f->command_state == cs_deps_running) + { + /* Don't run the other :: rules for this + file until this rule is finished. */ + status = 0; + break; + } + } + + /* Process the remaining rules in the double colon chain so they're marked + considered. Start their prerequisites, too. */ + if (file->double_colon) + for (; f != 0 ; f = f->prev) + { + struct dep *d; + + f->considered = considered; + + for (d = f->deps; d != 0; d = d->next) + status |= update_file (d->file, depth + 1); + } + + return status; +} + +/* Show a message stating the target failed to build. */ + +static void +complain (struct file *file) +{ + const char *msg_noparent + = _("%sNo rule to make target `%s'%s"); + const char *msg_parent + = _("%sNo rule to make target `%s', needed by `%s'%s"); + + /* If this file has no_diag set then it means we tried to update it + before in the dontcare mode and failed. The target that actually + failed is not necessarily this file but could be one of its direct + or indirect dependencies. So traverse this file's dependencies and + find the one that actually caused the failure. */ + + struct dep *d; + + for (d = file->deps; d != 0; d = d->next) + { + if (d->file->updated && d->file->update_status > 0 && file->no_diag) + { + complain (d->file); + break; + } + } + + if (d == 0) + { + /* Didn't find any dependencies to complain about. */ + if (!keep_going_flag) + { + if (file->parent == 0) + fatal (NILF, msg_noparent, "", file->name, ""); + + fatal (NILF, msg_parent, "", file->name, file->parent->name, ""); + } + + if (file->parent == 0) + error (NILF, msg_noparent, "*** ", file->name, "."); + else + error (NILF, msg_parent, "*** ", file->name, file->parent->name, "."); + + file->no_diag = 0; + } +} + +/* Consider a single `struct file' and update it as appropriate. */ + +static int +update_file_1 (struct file *file, unsigned int depth) +{ + FILE_TIMESTAMP this_mtime; + int noexist, must_make, deps_changed; + int dep_status = 0; + struct file *ofile; + struct dep *d, *ad; + struct dep amake; + int running = 0; + + DBF (DB_VERBOSE, _("Considering target file `%s'.\n")); + + if (file->updated) + { + if (file->update_status > 0) + { + DBF (DB_VERBOSE, + _("Recently tried and failed to update file `%s'.\n")); + + /* If the file we tried to make is marked no_diag then no message + was printed about it when it failed during the makefile rebuild. + If we're trying to build it again in the normal rebuild, print a + message now. */ + if (file->no_diag && !file->dontcare) + complain (file); + + return file->update_status; + } + + DBF (DB_VERBOSE, _("File `%s' was considered already.\n")); + return 0; + } + + switch (file->command_state) + { + case cs_not_started: + case cs_deps_running: + break; + case cs_running: + DBF (DB_VERBOSE, _("Still updating file `%s'.\n")); + return 0; + case cs_finished: + DBF (DB_VERBOSE, _("Finished updating file `%s'.\n")); + return file->update_status; + default: + abort (); + } + + /* Determine whether the diagnostics will be issued should this update + fail. */ + file->no_diag = file->dontcare; + + ++depth; + + /* Notice recursive update of the same file. */ + start_updating (file); + + /* We might change file if we find a different one via vpath; + remember this one to turn off updating. */ + ofile = file; + + /* Looking at the file's modtime beforehand allows the possibility + that its name may be changed by a VPATH search, and thus it may + not need an implicit rule. If this were not done, the file + might get implicit commands that apply to its initial name, only + to have that name replaced with another found by VPATH search. */ + + this_mtime = file_mtime (file); + check_renamed (file); + noexist = this_mtime == NONEXISTENT_MTIME; + if (noexist) + DBF (DB_BASIC, _("File `%s' does not exist.\n")); + else if (ORDINARY_MTIME_MIN <= this_mtime && this_mtime <= ORDINARY_MTIME_MAX + && file->low_resolution_time) + { + /* Avoid spurious rebuilds due to low resolution time stamps. */ + int ns = FILE_TIMESTAMP_NS (this_mtime); + if (ns != 0) + error (NILF, _("*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp"), + file->name); + this_mtime += FILE_TIMESTAMPS_PER_S - 1 - ns; + } + + must_make = noexist; + + /* If file was specified as a target with no commands, + come up with some default commands. */ + + if (!file->phony && file->cmds == 0 && !file->tried_implicit) + { + if (try_implicit_rule (file, depth)) + DBF (DB_IMPLICIT, _("Found an implicit rule for `%s'.\n")); + else + DBF (DB_IMPLICIT, _("No implicit rule found for `%s'.\n")); + file->tried_implicit = 1; + } + if (file->cmds == 0 && !file->is_target + && default_file != 0 && default_file->cmds != 0) + { + DBF (DB_IMPLICIT, _("Using default recipe for `%s'.\n")); + file->cmds = default_file->cmds; + } + + /* Update all non-intermediate files we depend on, if necessary, and see + whether any of them is more recent than this file. We need to walk our + deps, AND the deps of any also_make targets to ensure everything happens + in the correct order. */ + + amake.file = file; + amake.next = file->also_make; + ad = &amake; + while (ad) + { + struct dep *lastd = 0; + + /* Find the deps we're scanning */ + d = ad->file->deps; + ad = ad->next; + + while (d) + { + FILE_TIMESTAMP mtime; + int maybe_make; + int dontcare = 0; + + check_renamed (d->file); + + mtime = file_mtime (d->file); + check_renamed (d->file); + + if (is_updating (d->file)) + { + error (NILF, _("Circular %s <- %s dependency dropped."), + file->name, d->file->name); + /* We cannot free D here because our the caller will still have + a reference to it when we were called recursively via + check_dep below. */ + if (lastd == 0) + file->deps = d->next; + else + lastd->next = d->next; + d = d->next; + continue; + } + + d->file->parent = file; + maybe_make = must_make; + + /* Inherit dontcare flag from our parent. */ + if (rebuilding_makefiles) + { + dontcare = d->file->dontcare; + d->file->dontcare = file->dontcare; + } + + dep_status |= check_dep (d->file, depth, this_mtime, &maybe_make); + + /* Restore original dontcare flag. */ + if (rebuilding_makefiles) + d->file->dontcare = dontcare; + + if (! d->ignore_mtime) + must_make = maybe_make; + + check_renamed (d->file); + + { + register struct file *f = d->file; + if (f->double_colon) + f = f->double_colon; + do + { + running |= (f->command_state == cs_running + || f->command_state == cs_deps_running); + f = f->prev; + } + while (f != 0); + } + + if (dep_status != 0 && !keep_going_flag) + break; + + if (!running) + /* The prereq is considered changed if the timestamp has changed while + it was built, OR it doesn't exist. */ + d->changed = ((file_mtime (d->file) != mtime) + || (mtime == NONEXISTENT_MTIME)); + + lastd = d; + d = d->next; + } + } + + /* Now we know whether this target needs updating. + If it does, update all the intermediate files we depend on. */ + + if (must_make || always_make_flag) + { + for (d = file->deps; d != 0; d = d->next) + if (d->file->intermediate) + { + int dontcare = 0; + + FILE_TIMESTAMP mtime = file_mtime (d->file); + check_renamed (d->file); + d->file->parent = file; + + /* Inherit dontcare flag from our parent. */ + if (rebuilding_makefiles) + { + dontcare = d->file->dontcare; + d->file->dontcare = file->dontcare; + } + + + dep_status |= update_file (d->file, depth); + + /* Restore original dontcare flag. */ + if (rebuilding_makefiles) + d->file->dontcare = dontcare; + + check_renamed (d->file); + + { + register struct file *f = d->file; + if (f->double_colon) + f = f->double_colon; + do + { + running |= (f->command_state == cs_running + || f->command_state == cs_deps_running); + f = f->prev; + } + while (f != 0); + } + + if (dep_status != 0 && !keep_going_flag) + break; + + if (!running) + d->changed = ((file->phony && file->cmds != 0) + || file_mtime (d->file) != mtime); + } + } + + finish_updating (file); + finish_updating (ofile); + + DBF (DB_VERBOSE, _("Finished prerequisites of target file `%s'.\n")); + + if (running) + { + set_command_state (file, cs_deps_running); + --depth; + DBF (DB_VERBOSE, _("The prerequisites of `%s' are being made.\n")); + return 0; + } + + /* If any dependency failed, give up now. */ + + if (dep_status != 0) + { + file->update_status = dep_status; + notice_finished_file (file); + + --depth; + + DBF (DB_VERBOSE, _("Giving up on target file `%s'.\n")); + + if (depth == 0 && keep_going_flag + && !just_print_flag && !question_flag) + error (NILF, + _("Target `%s' not remade because of errors."), file->name); + + return dep_status; + } + + if (file->command_state == cs_deps_running) + /* The commands for some deps were running on the last iteration, but + they have finished now. Reset the command_state to not_started to + simplify later bookkeeping. It is important that we do this only + when the prior state was cs_deps_running, because that prior state + was definitely propagated to FILE's also_make's by set_command_state + (called above), but in another state an also_make may have + independently changed to finished state, and we would confuse that + file's bookkeeping (updated, but not_started is bogus state). */ + set_command_state (file, cs_not_started); + + /* Now record which prerequisites are more + recent than this file, so we can define $?. */ + + deps_changed = 0; + for (d = file->deps; d != 0; d = d->next) + { + FILE_TIMESTAMP d_mtime = file_mtime (d->file); + check_renamed (d->file); + + if (! d->ignore_mtime) + { +#if 1 + /* %%% In version 4, remove this code completely to + implement not remaking deps if their deps are newer + than their parents. */ + if (d_mtime == NONEXISTENT_MTIME && !d->file->intermediate) + /* We must remake if this dep does not + exist and is not intermediate. */ + must_make = 1; +#endif + + /* Set DEPS_CHANGED if this dep actually changed. */ + deps_changed |= d->changed; + } + + /* Set D->changed if either this dep actually changed, + or its dependent, FILE, is older or does not exist. */ + d->changed |= noexist || d_mtime > this_mtime; + + if (!noexist && ISDB (DB_BASIC|DB_VERBOSE)) + { + const char *fmt = 0; + + if (d->ignore_mtime) + { + if (ISDB (DB_VERBOSE)) + fmt = _("Prerequisite `%s' is order-only for target `%s'.\n"); + } + else if (d_mtime == NONEXISTENT_MTIME) + { + if (ISDB (DB_BASIC)) + fmt = _("Prerequisite `%s' of target `%s' does not exist.\n"); + } + else if (d->changed) + { + if (ISDB (DB_BASIC)) + fmt = _("Prerequisite `%s' is newer than target `%s'.\n"); + } + else if (ISDB (DB_VERBOSE)) + fmt = _("Prerequisite `%s' is older than target `%s'.\n"); + + if (fmt) + { + print_spaces (depth); + printf (fmt, dep_name (d), file->name); + fflush (stdout); + } + } + } + + /* Here depth returns to the value it had when we were called. */ + depth--; + + if (file->double_colon && file->deps == 0) + { + must_make = 1; + DBF (DB_BASIC, + _("Target `%s' is double-colon and has no prerequisites.\n")); + } + else if (!noexist && file->is_target && !deps_changed && file->cmds == 0 + && !always_make_flag) + { + must_make = 0; + DBF (DB_VERBOSE, + _("No recipe for `%s' and no prerequisites actually changed.\n")); + } + else if (!must_make && file->cmds != 0 && always_make_flag) + { + must_make = 1; + DBF (DB_VERBOSE, _("Making `%s' due to always-make flag.\n")); + } + + if (!must_make) + { + if (ISDB (DB_VERBOSE)) + { + print_spaces (depth); + printf (_("No need to remake target `%s'"), file->name); + if (!streq (file->name, file->hname)) + printf (_("; using VPATH name `%s'"), file->hname); + puts ("."); + fflush (stdout); + } + + notice_finished_file (file); + + /* Since we don't need to remake the file, convert it to use the + VPATH filename if we found one. hfile will be either the + local name if no VPATH or the VPATH name if one was found. */ + + while (file) + { + file->name = file->hname; + file = file->prev; + } + + return 0; + } + + DBF (DB_BASIC, _("Must remake target `%s'.\n")); + + /* It needs to be remade. If it's VPATH and not reset via GPATH, toss the + VPATH. */ + if (!streq(file->name, file->hname)) + { + DB (DB_BASIC, (_(" Ignoring VPATH name `%s'.\n"), file->hname)); + file->ignore_vpath = 1; + } + + /* Now, take appropriate actions to remake the file. */ + remake_file (file); + + if (file->command_state != cs_finished) + { + DBF (DB_VERBOSE, _("Recipe of `%s' is being run.\n")); + return 0; + } + + switch (file->update_status) + { + case 2: + DBF (DB_BASIC, _("Failed to remake target file `%s'.\n")); + break; + case 0: + DBF (DB_BASIC, _("Successfully remade target file `%s'.\n")); + break; + case 1: + DBF (DB_BASIC, _("Target file `%s' needs remade under -q.\n")); + break; + default: + assert (file->update_status >= 0 && file->update_status <= 2); + break; + } + + file->updated = 1; + return file->update_status; +} + +/* Set FILE's `updated' flag and re-check its mtime and the mtime's of all + files listed in its `also_make' member. Under -t, this function also + touches FILE. + + On return, FILE->update_status will no longer be -1 if it was. */ + +void +notice_finished_file (struct file *file) +{ + struct dep *d; + int ran = file->command_state == cs_running; + int touched = 0; + + file->command_state = cs_finished; + file->updated = 1; + + if (touch_flag + /* The update status will be: + -1 if this target was not remade; + 0 if 0 or more commands (+ or ${MAKE}) were run and won; + 1 if some commands were run and lost. + We touch the target if it has commands which either were not run + or won when they ran (i.e. status is 0). */ + && file->update_status == 0) + { + if (file->cmds != 0 && file->cmds->any_recurse) + { + /* If all the command lines were recursive, + we don't want to do the touching. */ + unsigned int i; + for (i = 0; i < file->cmds->ncommand_lines; ++i) + if (!(file->cmds->lines_flags[i] & COMMANDS_RECURSE)) + goto have_nonrecursing; + } + else + { + have_nonrecursing: + if (file->phony) + file->update_status = 0; + /* According to POSIX, -t doesn't affect targets with no cmds. */ + else if (file->cmds != 0) + { + /* Should set file's modification date and do nothing else. */ + file->update_status = touch_file (file); + + /* Pretend we ran a real touch command, to suppress the + "`foo' is up to date" message. */ + commands_started++; + + /* Request for the timestamp to be updated (and distributed + to the double-colon entries). Simply setting ran=1 would + almost have done the trick, but messes up with the also_make + updating logic below. */ + touched = 1; + } + } + } + + if (file->mtime_before_update == UNKNOWN_MTIME) + file->mtime_before_update = file->last_mtime; + + if ((ran && !file->phony) || touched) + { + int i = 0; + + /* If -n, -t, or -q and all the commands are recursive, we ran them so + really check the target's mtime again. Otherwise, assume the target + would have been updated. */ + + if ((question_flag || just_print_flag || touch_flag) && file->cmds) + { + for (i = file->cmds->ncommand_lines; i > 0; --i) + if (! (file->cmds->lines_flags[i-1] & COMMANDS_RECURSE)) + break; + } + + /* If there were no commands at all, it's always new. */ + + else if (file->is_target && file->cmds == 0) + i = 1; + + file->last_mtime = i == 0 ? UNKNOWN_MTIME : NEW_MTIME; + } + + if (file->double_colon) + { + /* If this is a double colon rule and it is the last one to be + updated, propagate the change of modification time to all the + double-colon entries for this file. + + We do it on the last update because it is important to handle + individual entries as separate rules with separate timestamps + while they are treated as targets and then as one rule with the + unified timestamp when they are considered as a prerequisite + of some target. */ + + struct file *f; + FILE_TIMESTAMP max_mtime = file->last_mtime; + + /* Check that all rules were updated and at the same time find + the max timestamp. We assume UNKNOWN_MTIME is newer then + any other value. */ + for (f = file->double_colon; f != 0 && f->updated; f = f->prev) + if (max_mtime != UNKNOWN_MTIME + && (f->last_mtime == UNKNOWN_MTIME || f->last_mtime > max_mtime)) + max_mtime = f->last_mtime; + + if (f == 0) + for (f = file->double_colon; f != 0; f = f->prev) + f->last_mtime = max_mtime; + } + + if (ran && file->update_status != -1) + /* We actually tried to update FILE, which has + updated its also_make's as well (if it worked). + If it didn't work, it wouldn't work again for them. + So mark them as updated with the same status. */ + for (d = file->also_make; d != 0; d = d->next) + { + d->file->command_state = cs_finished; + d->file->updated = 1; + d->file->update_status = file->update_status; + + if (ran && !d->file->phony) + /* Fetch the new modification time. + We do this instead of just invalidating the cached time + so that a vpath_search can happen. Otherwise, it would + never be done because the target is already updated. */ + f_mtime (d->file, 0); + } + else if (file->update_status == -1) + /* Nothing was done for FILE, but it needed nothing done. + So mark it now as "succeeded". */ + file->update_status = 0; +} + +/* Check whether another file (whose mtime is THIS_MTIME) needs updating on + account of a dependency which is file FILE. If it does, store 1 in + *MUST_MAKE_PTR. In the process, update any non-intermediate files that + FILE depends on (including FILE itself). Return nonzero if any updating + failed. */ + +static int +check_dep (struct file *file, unsigned int depth, + FILE_TIMESTAMP this_mtime, int *must_make_ptr) +{ + struct file *ofile; + struct dep *d; + int dep_status = 0; + + ++depth; + start_updating (file); + + /* We might change file if we find a different one via vpath; + remember this one to turn off updating. */ + ofile = file; + + if (file->phony || !file->intermediate) + { + /* If this is a non-intermediate file, update it and record whether it + is newer than THIS_MTIME. */ + FILE_TIMESTAMP mtime; + dep_status = update_file (file, depth); + check_renamed (file); + mtime = file_mtime (file); + check_renamed (file); + if (mtime == NONEXISTENT_MTIME || mtime > this_mtime) + *must_make_ptr = 1; + } + else + { + /* FILE is an intermediate file. */ + FILE_TIMESTAMP mtime; + + if (!file->phony && file->cmds == 0 && !file->tried_implicit) + { + if (try_implicit_rule (file, depth)) + DBF (DB_IMPLICIT, _("Found an implicit rule for `%s'.\n")); + else + DBF (DB_IMPLICIT, _("No implicit rule found for `%s'.\n")); + file->tried_implicit = 1; + } + if (file->cmds == 0 && !file->is_target + && default_file != 0 && default_file->cmds != 0) + { + DBF (DB_IMPLICIT, _("Using default commands for `%s'.\n")); + file->cmds = default_file->cmds; + } + + check_renamed (file); + mtime = file_mtime (file); + check_renamed (file); + if (mtime != NONEXISTENT_MTIME && mtime > this_mtime) + /* If the intermediate file actually exists and is newer, then we + should remake from it. */ + *must_make_ptr = 1; + else + { + /* Otherwise, update all non-intermediate files we depend on, if + necessary, and see whether any of them is more recent than the + file on whose behalf we are checking. */ + struct dep *ld; + int deps_running = 0; + + /* If this target is not running, set it's state so that we check it + fresh. It could be it was checked as part of an order-only + prerequisite and so wasn't rebuilt then, but should be now. */ + if (file->command_state != cs_running) + set_command_state (file, cs_not_started); + + ld = 0; + d = file->deps; + while (d != 0) + { + int maybe_make; + + if (is_updating (d->file)) + { + error (NILF, _("Circular %s <- %s dependency dropped."), + file->name, d->file->name); + if (ld == 0) + { + file->deps = d->next; + free_dep (d); + d = file->deps; + } + else + { + ld->next = d->next; + free_dep (d); + d = ld->next; + } + continue; + } + + d->file->parent = file; + maybe_make = *must_make_ptr; + dep_status |= check_dep (d->file, depth, this_mtime, + &maybe_make); + if (! d->ignore_mtime) + *must_make_ptr = maybe_make; + check_renamed (d->file); + if (dep_status != 0 && !keep_going_flag) + break; + + if (d->file->command_state == cs_running + || d->file->command_state == cs_deps_running) + deps_running = 1; + + ld = d; + d = d->next; + } + + if (deps_running) + /* Record that some of FILE's deps are still being made. + This tells the upper levels to wait on processing it until the + commands are finished. */ + set_command_state (file, cs_deps_running); + } + } + + finish_updating (file); + finish_updating (ofile); + + return dep_status; +} + +/* Touch FILE. Return zero if successful, one if not. */ + +#define TOUCH_ERROR(call) return (perror_with_name (call, file->name), 1) + +static int +touch_file (struct file *file) +{ + if (!silent_flag) + message (0, "touch %s", file->name); + +#ifndef NO_ARCHIVES + if (ar_name (file->name)) + return ar_touch (file->name); + else +#endif + { + int fd = open (file->name, O_RDWR | O_CREAT, 0666); + + if (fd < 0) + TOUCH_ERROR ("touch: open: "); + else + { + struct stat statbuf; + char buf = 'x'; + int e; + + EINTRLOOP (e, fstat (fd, &statbuf)); + if (e < 0) + TOUCH_ERROR ("touch: fstat: "); + /* Rewrite character 0 same as it already is. */ + if (read (fd, &buf, 1) < 0) + TOUCH_ERROR ("touch: read: "); + if (lseek (fd, 0L, 0) < 0L) + TOUCH_ERROR ("touch: lseek: "); + if (write (fd, &buf, 1) < 0) + TOUCH_ERROR ("touch: write: "); + /* If file length was 0, we just + changed it, so change it back. */ + if (statbuf.st_size == 0) + { + (void) close (fd); + fd = open (file->name, O_RDWR | O_TRUNC, 0666); + if (fd < 0) + TOUCH_ERROR ("touch: open: "); + } + (void) close (fd); + } + } + + return 0; +} + +/* Having checked and updated the dependencies of FILE, + do whatever is appropriate to remake FILE itself. + Return the status from executing FILE's commands. */ + +static void +remake_file (struct file *file) +{ + if (file->cmds == 0) + { + if (file->phony) + /* Phony target. Pretend it succeeded. */ + file->update_status = 0; + else if (file->is_target) + /* This is a nonexistent target file we cannot make. + Pretend it was successfully remade. */ + file->update_status = 0; + else + { + /* This is a dependency file we cannot remake. Fail. */ + if (!rebuilding_makefiles || !file->dontcare) + complain (file); + file->update_status = 2; + } + } + else + { + chop_commands (file->cmds); + + /* The normal case: start some commands. */ + if (!touch_flag || file->cmds->any_recurse) + { + execute_file_commands (file); + return; + } + + /* This tells notice_finished_file it is ok to touch the file. */ + file->update_status = 0; + } + + /* This does the touching under -t. */ + notice_finished_file (file); +} + +/* Return the mtime of a file, given a `struct file'. + Caches the time in the struct file to avoid excess stat calls. + + If the file is not found, and SEARCH is nonzero, VPATH searching and + replacement is done. If that fails, a library (-lLIBNAME) is tried and + the library's actual name (/lib/libLIBNAME.a, etc.) is substituted into + FILE. */ + +FILE_TIMESTAMP +f_mtime (struct file *file, int search) +{ + FILE_TIMESTAMP mtime; + + /* File's mtime is not known; must get it from the system. */ + +#ifndef NO_ARCHIVES + if (ar_name (file->name)) + { + /* This file is an archive-member reference. */ + + char *arname, *memname; + struct file *arfile; + time_t member_date; + + /* Find the archive's name. */ + ar_parse_name (file->name, &arname, &memname); + + /* Find the modification time of the archive itself. + Also allow for its name to be changed via VPATH search. */ + arfile = lookup_file (arname); + if (arfile == 0) + arfile = enter_file (strcache_add (arname)); + mtime = f_mtime (arfile, search); + check_renamed (arfile); + if (search && strcmp (arfile->hname, arname)) + { + /* The archive's name has changed. + Change the archive-member reference accordingly. */ + + char *name; + unsigned int arlen, memlen; + + arlen = strlen (arfile->hname); + memlen = strlen (memname); + + name = xmalloc (arlen + 1 + memlen + 2); + memcpy (name, arfile->hname, arlen); + name[arlen] = '('; + memcpy (name + arlen + 1, memname, memlen); + name[arlen + 1 + memlen] = ')'; + name[arlen + 1 + memlen + 1] = '\0'; + + /* If the archive was found with GPATH, make the change permanent; + otherwise defer it until later. */ + if (arfile->name == arfile->hname) + rename_file (file, name); + else + rehash_file (file, name); + check_renamed (file); + } + + free (arname); + + file->low_resolution_time = 1; + + if (mtime == NONEXISTENT_MTIME) + /* The archive doesn't exist, so its members don't exist either. */ + return NONEXISTENT_MTIME; + + member_date = ar_member_date (file->hname); + mtime = (member_date == (time_t) -1 + ? NONEXISTENT_MTIME + : file_timestamp_cons (file->hname, member_date, 0)); + } + else +#endif + { + mtime = name_mtime (file->name); + + if (mtime == NONEXISTENT_MTIME && search && !file->ignore_vpath) + { + /* If name_mtime failed, search VPATH. */ + const char *name = vpath_search (file->name, &mtime, NULL, NULL); + if (name + /* Last resort, is it a library (-lxxx)? */ + || (file->name[0] == '-' && file->name[1] == 'l' + && (name = library_search (file->name, &mtime)) != 0)) + { + if (mtime != UNKNOWN_MTIME) + /* vpath_search and library_search store UNKNOWN_MTIME + if they didn't need to do a stat call for their work. */ + file->last_mtime = mtime; + + /* If we found it in VPATH, see if it's in GPATH too; if so, + change the name right now; if not, defer until after the + dependencies are updated. */ + if (gpath_search (name, strlen(name) - strlen(file->name) - 1)) + { + rename_file (file, name); + check_renamed (file); + return file_mtime (file); + } + + rehash_file (file, name); + check_renamed (file); + /* If the result of a vpath search is -o or -W, preserve it. + Otherwise, find the mtime of the resulting file. */ + if (mtime != OLD_MTIME && mtime != NEW_MTIME) + mtime = name_mtime (name); + } + } + } + + /* Files can have bogus timestamps that nothing newly made will be + "newer" than. Updating their dependents could just result in loops. + So notify the user of the anomaly with a warning. + + We only need to do this once, for now. */ + + if (!clock_skew_detected + && mtime != NONEXISTENT_MTIME && mtime != NEW_MTIME + && !file->updated) + { + static FILE_TIMESTAMP adjusted_now; + + FILE_TIMESTAMP adjusted_mtime = mtime; + +#if defined(WINDOWS32) || defined(__MSDOS__) + /* Experimentation has shown that FAT filesystems can set file times + up to 3 seconds into the future! Play it safe. */ + +#define FAT_ADJ_OFFSET (FILE_TIMESTAMP) 3 + + FILE_TIMESTAMP adjustment = FAT_ADJ_OFFSET << FILE_TIMESTAMP_LO_BITS; + if (ORDINARY_MTIME_MIN + adjustment <= adjusted_mtime) + adjusted_mtime -= adjustment; +#elif defined(__EMX__) + /* FAT filesystems round time to the nearest even second! + Allow for any file (NTFS or FAT) to perhaps suffer from this + brain damage. */ + FILE_TIMESTAMP adjustment = (((FILE_TIMESTAMP_S (adjusted_mtime) & 1) == 0 + && FILE_TIMESTAMP_NS (adjusted_mtime) == 0) + ? (FILE_TIMESTAMP) 1 << FILE_TIMESTAMP_LO_BITS + : 0); +#endif + + /* If the file's time appears to be in the future, update our + concept of the present and try once more. */ + if (adjusted_now < adjusted_mtime) + { + int resolution; + FILE_TIMESTAMP now = file_timestamp_now (&resolution); + adjusted_now = now + (resolution - 1); + if (adjusted_now < adjusted_mtime) + { +#ifdef NO_FLOAT + error (NILF, _("Warning: File `%s' has modification time in the future"), + file->name); +#else + double from_now = + (FILE_TIMESTAMP_S (mtime) - FILE_TIMESTAMP_S (now) + + ((FILE_TIMESTAMP_NS (mtime) - FILE_TIMESTAMP_NS (now)) + / 1e9)); + char from_now_string[100]; + + if (from_now >= 99 && from_now <= ULONG_MAX) + sprintf (from_now_string, "%lu", (unsigned long) from_now); + else + sprintf (from_now_string, "%.2g", from_now); + error (NILF, _("Warning: File `%s' has modification time %s s in the future"), + file->name, from_now_string); +#endif + clock_skew_detected = 1; + } + } + } + + /* Store the mtime into all the entries for this file. */ + if (file->double_colon) + file = file->double_colon; + + do + { + /* If this file is not implicit but it is intermediate then it was + made so by the .INTERMEDIATE target. If this file has never + been built by us but was found now, it existed before make + started. So, turn off the intermediate bit so make doesn't + delete it, since it didn't create it. */ + if (mtime != NONEXISTENT_MTIME && file->command_state == cs_not_started + && file->command_state == cs_not_started + && !file->tried_implicit && file->intermediate) + file->intermediate = 0; + + file->last_mtime = mtime; + file = file->prev; + } + while (file != 0); + + return mtime; +} + + +/* Return the mtime of the file or archive-member reference NAME. */ + +/* First, we check with stat(). If the file does not exist, then we return + NONEXISTENT_MTIME. If it does, and the symlink check flag is set, then + examine each indirection of the symlink and find the newest mtime. + This causes one duplicate stat() when -L is being used, but the code is + much cleaner. */ + +static FILE_TIMESTAMP +name_mtime (const char *name) +{ + FILE_TIMESTAMP mtime; + struct stat st; + int e; + + EINTRLOOP (e, stat (name, &st)); + if (e == 0) + mtime = FILE_TIMESTAMP_STAT_MODTIME (name, st); + else if (errno == ENOENT || errno == ENOTDIR) + mtime = NONEXISTENT_MTIME; + else + { + perror_with_name ("stat: ", name); + return NONEXISTENT_MTIME; + } + + /* If we get here we either found it, or it doesn't exist. + If it doesn't exist see if we can use a symlink mtime instead. */ + +#ifdef MAKE_SYMLINKS +#ifndef S_ISLNK +# define S_ISLNK(_m) (((_m)&S_IFMT)==S_IFLNK) +#endif + if (check_symlink_flag) + { + PATH_VAR (lpath); + + /* Check each symbolic link segment (if any). Find the latest mtime + amongst all of them (and the target file of course). + Note that we have already successfully dereferenced all the links + above. So, if we run into any error trying to lstat(), or + readlink(), or whatever, something bizarre-o happened. Just give up + and use whatever mtime we've already computed at that point. */ + strcpy (lpath, name); + while (1) + { + FILE_TIMESTAMP ltime; + PATH_VAR (lbuf); + long llen; + char *p; + + EINTRLOOP (e, lstat (lpath, &st)); + if (e) + { + /* Just take what we have so far. */ + if (errno != ENOENT && errno != ENOTDIR) + perror_with_name ("lstat: ", lpath); + break; + } + + /* If this is not a symlink, we're done (we started with the real + file's mtime so we don't need to test it again). */ + if (!S_ISLNK (st.st_mode)) + break; + + /* If this mtime is newer than what we had, keep the new one. */ + ltime = FILE_TIMESTAMP_STAT_MODTIME (lpath, st); + if (ltime > mtime) + mtime = ltime; + + /* Set up to check the file pointed to by this link. */ + EINTRLOOP (llen, readlink (lpath, lbuf, GET_PATH_MAX)); + if (llen < 0) + { + /* Eh? Just take what we have. */ + perror_with_name ("readlink: ", lpath); + break; + } + lbuf[llen] = '\0'; + + /* If the target is fully-qualified or the source is just a + filename, then the new path is the target. Otherwise it's the + source directory plus the target. */ + if (lbuf[0] == '/' || (p = strrchr (lpath, '/')) == NULL) + strcpy (lpath, lbuf); + else if ((p - lpath) + llen + 2 > GET_PATH_MAX) + /* Eh? Path too long! Again, just go with what we have. */ + break; + else + /* Create the next step in the symlink chain. */ + strcpy (p+1, lbuf); + } + } +#endif + + return mtime; +} + + +/* Search for a library file specified as -lLIBNAME, searching for a + suitable library file in the system library directories and the VPATH + directories. */ + +static const char * +library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr) +{ + static char *dirs[] = + { +#ifndef _AMIGA + "/lib", + "/usr/lib", +#endif +#if defined(WINDOWS32) && !defined(LIBDIR) +/* + * This is completely up to the user at product install time. Just define + * a placeholder. + */ +#define LIBDIR "." +#endif + LIBDIR, /* Defined by configuration. */ + 0 + }; + + const char *file = 0; + char *libpatterns; + FILE_TIMESTAMP mtime; + + /* Loop variables for the libpatterns value. */ + char *p; + const char *p2; + unsigned int len; + unsigned int liblen; + + /* Information about the earliest (in the vpath sequence) match. */ + unsigned int best_vpath, best_path; + unsigned int std_dirs = 0; + + char **dp; + + libpatterns = xstrdup (variable_expand ("$(.LIBPATTERNS)")); + + /* Skip the '-l'. */ + lib += 2; + liblen = strlen (lib); + + /* Loop through all the patterns in .LIBPATTERNS, and search on each one. + To implement the linker-compatible behavior we have to search through + all entries in .LIBPATTERNS and choose the "earliest" one. */ + p2 = libpatterns; + while ((p = find_next_token (&p2, &len)) != 0) + { + static char *buf = NULL; + static unsigned int buflen = 0; + static int libdir_maxlen = -1; + char *libbuf = variable_expand (""); + + /* Expand the pattern using LIB as a replacement. */ + { + char c = p[len]; + char *p3, *p4; + + p[len] = '\0'; + p3 = find_percent (p); + if (!p3) + { + /* Give a warning if there is no pattern. */ + error (NILF, _(".LIBPATTERNS element `%s' is not a pattern"), p); + p[len] = c; + continue; + } + p4 = variable_buffer_output (libbuf, p, p3-p); + p4 = variable_buffer_output (p4, lib, liblen); + p4 = variable_buffer_output (p4, p3+1, len - (p3-p)); + p[len] = c; + } + + /* Look first for `libNAME.a' in the current directory. */ + mtime = name_mtime (libbuf); + if (mtime != NONEXISTENT_MTIME) + { + if (mtime_ptr != 0) + *mtime_ptr = mtime; + file = strcache_add (libbuf); + /* This by definition will have the best index, so stop now. */ + break; + } + + /* Now try VPATH search on that. */ + + { + unsigned int vpath_index, path_index; + const char* f = vpath_search (libbuf, mtime_ptr ? &mtime : NULL, + &vpath_index, &path_index); + if (f) + { + /* If we have a better match, record it. */ + if (file == 0 || + vpath_index < best_vpath || + (vpath_index == best_vpath && path_index < best_path)) + { + file = f; + best_vpath = vpath_index; + best_path = path_index; + + if (mtime_ptr != 0) + *mtime_ptr = mtime; + } + } + } + + /* Now try the standard set of directories. */ + + if (!buflen) + { + for (dp = dirs; *dp != 0; ++dp) + { + int l = strlen (*dp); + if (l > libdir_maxlen) + libdir_maxlen = l; + std_dirs++; + } + buflen = strlen (libbuf); + buf = xmalloc(libdir_maxlen + buflen + 2); + } + else if (buflen < strlen (libbuf)) + { + buflen = strlen (libbuf); + buf = xrealloc (buf, libdir_maxlen + buflen + 2); + } + + { + /* Use the last std_dirs index for standard directories. This + was it will always be greater than the VPATH index. */ + unsigned int vpath_index = ~((unsigned int)0) - std_dirs; + + for (dp = dirs; *dp != 0; ++dp) + { + sprintf (buf, "%s/%s", *dp, libbuf); + mtime = name_mtime (buf); + if (mtime != NONEXISTENT_MTIME) + { + if (file == 0 || vpath_index < best_vpath) + { + file = strcache_add (buf); + best_vpath = vpath_index; + + if (mtime_ptr != 0) + *mtime_ptr = mtime; + } + } + + vpath_index++; + } + } + + } + + free (libpatterns); + return file; +} diff --git a/remote-cstms.c b/remote-cstms.c new file mode 100644 index 0000000..a0c5cb7 --- /dev/null +++ b/remote-cstms.c @@ -0,0 +1,301 @@ +/* GNU Make remote job exportation interface to the Customs daemon. + THIS CODE IS NOT SUPPORTED BY THE GNU PROJECT. + Please do not send bug reports or questions about it to + the Make maintainers. + +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "job.h" +#include "filedef.h" +#include "commands.h" +#include "job.h" +#include "debug.h" + +#include +#include + +#include "customs.h" + +char *remote_description = "Customs"; + +/* File name of the Customs `export' client command. + A full path name can be used to avoid some path-searching overhead. */ +#define EXPORT_COMMAND "/usr/local/bin/export" + +/* ExportPermit gotten by start_remote_job_p, and used by start_remote_job. */ +static ExportPermit permit; + +/* Normalized path name of the current directory. */ +static char *normalized_cwd; + +/* Call once at startup even if no commands are run. */ + +void +remote_setup (void) +{ +} + +/* Called before exit. */ + +void +remote_cleanup (void) +{ +} + +/* Return nonzero if the next job should be done remotely. */ + +int +start_remote_job_p (int first_p) +{ + static int inited = 0; + int status; + int njobs; + + if (!inited) + { + /* Allow the user to turn off job exportation (useful while he is + debugging Customs, for example). */ + if (getenv ("GNU_MAKE_NO_CUSTOMS") != 0) + { + inited = -1; + return 0; + } + + /* For secure Customs, make is installed setuid root and + Customs requires a privileged source port be used. */ + make_access (); + + if (ISDB (DB_JOBS)) + Rpc_Debug(1); + + /* Ping the daemon once to see if it is there. */ + inited = Customs_Ping () == RPC_SUCCESS ? 1 : -1; + + /* Return to normal user access. */ + user_access (); + + if (starting_directory == 0) + /* main couldn't figure it out. */ + inited = -1; + else + { + /* Normalize the current directory path name to something + that should work on all machines exported to. */ + + normalized_cwd = xmalloc (GET_PATH_MAX); + strcpy (normalized_cwd, starting_directory); + if (Customs_NormPath (normalized_cwd, GET_PATH_MAX) < 0) + /* Path normalization failure means using Customs + won't work, but it's not really an error. */ + inited = -1; + } + } + + if (inited < 0) + return 0; + + njobs = job_slots_used; + if (!first_p) + njobs -= 1; /* correction for being called from reap_children() */ + + /* the first job should run locally, or, if the -l flag is given, we use + that as clue as to how many local jobs should be scheduled locally */ + if (max_load_average < 0 && njobs == 0 || njobs < max_load_average) + return 0; + + status = Customs_Host (EXPORT_SAME, &permit); + if (status != RPC_SUCCESS) + { + DB (DB_JOBS, (_("Customs won't export: %s\n"), + Rpc_ErrorMessage (status))); + return 0; + } + + return !CUSTOMS_FAIL (&permit.addr); +} + +/* Start a remote job running the command in ARGV, with environment from + ENVP. It gets standard input from STDIN_FD. On failure, return + nonzero. On success, return zero, and set *USED_STDIN to nonzero if it + will actually use STDIN_FD, zero if not, set *ID_PTR to a unique + identification, and set *IS_REMOTE to nonzero if the job is remote, zero + if it is local (meaning *ID_PTR is a process ID). */ + +int +start_remote_job (char **argv, char **envp, int stdin_fd, + int *is_remote, int *id_ptr, int *used_stdin) +{ + char waybill[MAX_DATA_SIZE], msg[128]; + struct hostent *host; + struct timeval timeout; + struct sockaddr_in sin; + int len; + int retsock, retport, sock; + Rpc_Stat status; + int pid; + + /* Create the return socket. */ + retsock = Rpc_UdpCreate (True, 0); + if (retsock < 0) + { + error (NILF, "exporting: Couldn't create return socket."); + return 1; + } + + /* Get the return socket's port number. */ + len = sizeof (sin); + if (getsockname (retsock, (struct sockaddr *) &sin, &len) < 0) + { + (void) close (retsock); + perror_with_name ("exporting: ", "getsockname"); + return 1; + } + retport = sin.sin_port; + + /* Create the TCP socket for talking to the remote child. */ + sock = Rpc_TcpCreate (False, 0); + + /* Create a WayBill to give to the server. */ + len = Customs_MakeWayBill (&permit, normalized_cwd, argv[0], argv, + envp, retport, waybill); + + /* Modify the waybill as if the remote child had done `child_access ()'. */ + { + WayBill *wb = (WayBill *) waybill; + wb->ruid = wb->euid; + wb->rgid = wb->egid; + } + + /* Send the request to the server, timing out in 20 seconds. */ + timeout.tv_usec = 0; + timeout.tv_sec = 20; + sin.sin_family = AF_INET; + sin.sin_port = htons (Customs_Port ()); + sin.sin_addr = permit.addr; + status = Rpc_Call (sock, &sin, (Rpc_Proc) CUSTOMS_IMPORT, + len, (Rpc_Opaque) waybill, + sizeof(msg), (Rpc_Opaque) msg, + 1, &timeout); + + host = gethostbyaddr((char *)&permit.addr, sizeof(permit.addr), AF_INET); + + if (status != RPC_SUCCESS) + { + (void) close (retsock); + (void) close (sock); + error (NILF, "exporting to %s: %s", + host ? host->h_name : inet_ntoa (permit.addr), + Rpc_ErrorMessage (status)); + return 1; + } + else if (msg[0] != 'O' || msg[1] != 'k' || msg[2] != '\0') + { + (void) close (retsock); + (void) close (sock); + error (NILF, "exporting to %s: %s", + host ? host->h_name : inet_ntoa (permit.addr), + msg); + return 1; + } + else + { + error (NILF, "*** exported to %s (id %u)", + host ? host->h_name : inet_ntoa (permit.addr), + permit.id); + } + + fflush (stdout); + fflush (stderr); + + pid = vfork (); + if (pid < 0) + { + /* The fork failed! */ + perror_with_name ("vfork", ""); + return 1; + } + else if (pid == 0) + { + /* Child side. Run `export' to handle the connection. */ + static char sock_buf[20], retsock_buf[20], id_buf[20]; + static char *new_argv[6] = + { EXPORT_COMMAND, "-id", sock_buf, retsock_buf, id_buf, 0 }; + + /* Set up the arguments. */ + (void) sprintf (sock_buf, "%d", sock); + (void) sprintf (retsock_buf, "%d", retsock); + (void) sprintf (id_buf, "%x", permit.id); + + /* Get the right stdin. */ + if (stdin_fd != 0) + (void) dup2 (stdin_fd, 0); + + /* Unblock signals in the child. */ + unblock_sigs (); + + /* Run the command. */ + exec_command (new_argv, envp); + } + + /* Parent side. Return the `export' process's ID. */ + (void) close (retsock); + (void) close (sock); + *is_remote = 0; + *id_ptr = pid; + *used_stdin = 1; + return 0; +} + +/* Get the status of a dead remote child. Block waiting for one to die + if BLOCK is nonzero. Set *EXIT_CODE_PTR to the exit status, *SIGNAL_PTR + to the termination signal or zero if it exited normally, and *COREDUMP_PTR + nonzero if it dumped core. Return the ID of the child that died, + 0 if we would have to block and !BLOCK, or < 0 if there were none. */ + +int +remote_status (int *exit_code_ptr, int *signal_ptr, int *coredump_ptr, + int block) +{ + return -1; +} + +/* Block asynchronous notification of remote child death. + If this notification is done by raising the child termination + signal, do not block that signal. */ +void +block_remote_children (void) +{ + return; +} + +/* Restore asynchronous notification of remote child death. + If this is done by raising the child termination signal, + do not unblock that signal. */ +void +unblock_remote_children (void) +{ + return; +} + +/* Send signal SIG to child ID. Return 0 if successful, -1 if not. */ +int +remote_kill (int id, int sig) +{ + return -1; +} diff --git a/remote-stub.c b/remote-stub.c new file mode 100644 index 0000000..e58b72c --- /dev/null +++ b/remote-stub.c @@ -0,0 +1,101 @@ +/* Template for the remote job exportation interface to GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "filedef.h" +#include "job.h" +#include "commands.h" + + +char *remote_description = 0; + +/* Call once at startup even if no commands are run. */ + +void +remote_setup (void) +{ +} + +/* Called before exit. */ + +void +remote_cleanup (void) +{ +} + +/* Return nonzero if the next job should be done remotely. */ + +int +start_remote_job_p (int first_p UNUSED) +{ + return 0; +} + +/* Start a remote job running the command in ARGV, + with environment from ENVP. It gets standard input from STDIN_FD. On + failure, return nonzero. On success, return zero, and set *USED_STDIN + to nonzero if it will actually use STDIN_FD, zero if not, set *ID_PTR to + a unique identification, and set *IS_REMOTE to zero if the job is local, + nonzero if it is remote (meaning *ID_PTR is a process ID). */ + +int +start_remote_job (char **argv UNUSED, char **envp UNUSED, int stdin_fd UNUSED, + int *is_remote UNUSED, int *id_ptr UNUSED, + int *used_stdin UNUSED) +{ + return -1; +} + +/* Get the status of a dead remote child. Block waiting for one to die + if BLOCK is nonzero. Set *EXIT_CODE_PTR to the exit status, *SIGNAL_PTR + to the termination signal or zero if it exited normally, and *COREDUMP_PTR + nonzero if it dumped core. Return the ID of the child that died, + 0 if we would have to block and !BLOCK, or < 0 if there were none. */ + +int +remote_status (int *exit_code_ptr UNUSED, int *signal_ptr UNUSED, + int *coredump_ptr UNUSED, int block UNUSED) +{ + errno = ECHILD; + return -1; +} + +/* Block asynchronous notification of remote child death. + If this notification is done by raising the child termination + signal, do not block that signal. */ +void +block_remote_children (void) +{ + return; +} + +/* Restore asynchronous notification of remote child death. + If this is done by raising the child termination signal, + do not unblock that signal. */ +void +unblock_remote_children (void) +{ + return; +} + +/* Send signal SIG to child ID. Return 0 if successful, -1 if not. */ +int +remote_kill (int id UNUSED, int sig UNUSED) +{ + return -1; +} diff --git a/rule.c b/rule.c new file mode 100644 index 0000000..a966cc9 --- /dev/null +++ b/rule.c @@ -0,0 +1,537 @@ +/* Pattern and suffix rule internals for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +#include + +#include "dep.h" +#include "filedef.h" +#include "job.h" +#include "commands.h" +#include "variable.h" +#include "rule.h" + +static void freerule (struct rule *rule, struct rule *lastrule); + +/* Chain of all pattern rules. */ + +struct rule *pattern_rules; + +/* Pointer to last rule in the chain, so we can add onto the end. */ + +struct rule *last_pattern_rule; + +/* Number of rules in the chain. */ + +unsigned int num_pattern_rules; + +/* Maximum number of target patterns of any pattern rule. */ + +unsigned int max_pattern_targets; + +/* Maximum number of dependencies of any pattern rule. */ + +unsigned int max_pattern_deps; + +/* Maximum length of the name of a dependencies of any pattern rule. */ + +unsigned int max_pattern_dep_length; + +/* Pointer to structure for the file .SUFFIXES + whose dependencies are the suffixes to be searched. */ + +struct file *suffix_file; + +/* Maximum length of a suffix. */ + +unsigned int maxsuffix; + +/* Compute the maximum dependency length and maximum number of + dependencies of all implicit rules. Also sets the subdir + flag for a rule when appropriate, possibly removing the rule + completely when appropriate. */ + +void +count_implicit_rule_limits (void) +{ + char *name; + int namelen; + struct rule *rule, *lastrule; + + num_pattern_rules = max_pattern_targets = max_pattern_deps = 0; + max_pattern_dep_length = 0; + + name = 0; + namelen = 0; + rule = pattern_rules; + lastrule = 0; + while (rule != 0) + { + unsigned int ndeps = 0; + struct dep *dep; + struct rule *next = rule->next; + + ++num_pattern_rules; + + if (rule->num > max_pattern_targets) + max_pattern_targets = rule->num; + + for (dep = rule->deps; dep != 0; dep = dep->next) + { + const char *dname = dep_name (dep); + unsigned int len = strlen (dname); + +#ifdef VMS + const char *p = strrchr (dname, ']'); + const char *p2; + if (p == 0) + p = strrchr (dname, ':'); + p2 = p != 0 ? strchr (dname, '%') : 0; +#else + const char *p = strrchr (dname, '/'); + const char *p2 = p != 0 ? strchr (dname, '%') : 0; +#endif + ndeps++; + + if (len > max_pattern_dep_length) + max_pattern_dep_length = len; + + if (p != 0 && p2 > p) + { + /* There is a slash before the % in the dep name. + Extract the directory name. */ + if (p == dname) + ++p; + if (p - dname > namelen) + { + namelen = p - dname; + name = xrealloc (name, namelen + 1); + } + memcpy (name, dname, p - dname); + name[p - dname] = '\0'; + + /* In the deps of an implicit rule the `changed' flag + actually indicates that the dependency is in a + nonexistent subdirectory. */ + + dep->changed = !dir_file_exists_p (name, ""); + } + else + /* This dependency does not reside in a subdirectory. */ + dep->changed = 0; + } + + if (ndeps > max_pattern_deps) + max_pattern_deps = ndeps; + + lastrule = rule; + rule = next; + } + + if (name != 0) + free (name); +} + +/* Create a pattern rule from a suffix rule. + TARGET is the target suffix; SOURCE is the source suffix. + CMDS are the commands. + If TARGET is nil, it means the target pattern should be `(%.o)'. + If SOURCE is nil, it means there should be no deps. */ + +static void +convert_suffix_rule (const char *target, const char *source, + struct commands *cmds) +{ + const char **names, **percents; + struct dep *deps; + + names = xmalloc (sizeof (const char *)); + percents = xmalloc (sizeof (const char *)); + + if (target == 0) + { + /* Special case: TARGET being nil means we are defining a `.X.a' suffix + rule; the target pattern is always `(%.o)'. */ +#ifdef VMS + *names = strcache_add_len ("(%.obj)", 7); +#else + *names = strcache_add_len ("(%.o)", 5); +#endif + *percents = *names + 1; + } + else + { + /* Construct the target name. */ + unsigned int len = strlen (target); + char *p = alloca (1 + len + 1); + p[0] = '%'; + memcpy (p + 1, target, len + 1); + *names = strcache_add_len (p, len + 1); + *percents = *names; + } + + if (source == 0) + deps = 0; + else + { + /* Construct the dependency name. */ + unsigned int len = strlen (source); + char *p = alloca (1 + len + 1); + p[0] = '%'; + memcpy (p + 1, source, len + 1); + deps = alloc_dep (); + deps->name = strcache_add_len (p, len + 1); + } + + create_pattern_rule (names, percents, 1, 0, deps, cmds, 0); +} + +/* Convert old-style suffix rules to pattern rules. + All rules for the suffixes on the .SUFFIXES list are converted and added to + the chain of pattern rules. */ + +void +convert_to_pattern (void) +{ + struct dep *d, *d2; + char *rulename; + + /* We will compute every potential suffix rule (.x.y) from the list of + suffixes in the .SUFFIXES target's dependencies and see if it exists. + First find the longest of the suffixes. */ + + maxsuffix = 0; + for (d = suffix_file->deps; d != 0; d = d->next) + { + unsigned int l = strlen (dep_name (d)); + if (l > maxsuffix) + maxsuffix = l; + } + + /* Space to construct the suffix rule target name. */ + rulename = alloca ((maxsuffix * 2) + 1); + + for (d = suffix_file->deps; d != 0; d = d->next) + { + unsigned int slen; + + /* Make a rule that is just the suffix, with no deps or commands. + This rule exists solely to disqualify match-anything rules. */ + convert_suffix_rule (dep_name (d), 0, 0); + + if (d->file->cmds != 0) + /* Record a pattern for this suffix's null-suffix rule. */ + convert_suffix_rule ("", dep_name (d), d->file->cmds); + + /* Add every other suffix to this one and see if it exists as a + two-suffix rule. */ + slen = strlen (dep_name (d)); + memcpy (rulename, dep_name (d), slen); + + for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next) + { + struct file *f; + unsigned int s2len; + + s2len = strlen (dep_name (d2)); + + /* Can't build something from itself. */ + if (slen == s2len && streq (dep_name (d), dep_name (d2))) + continue; + + memcpy (rulename + slen, dep_name (d2), s2len + 1); + f = lookup_file (rulename); + if (f == 0 || f->cmds == 0) + continue; + + if (s2len == 2 && rulename[slen] == '.' && rulename[slen + 1] == 'a') + /* A suffix rule `.X.a:' generates the pattern rule `(%.o): %.X'. + It also generates a normal `%.a: %.X' rule below. */ + convert_suffix_rule (NULL, /* Indicates `(%.o)'. */ + dep_name (d), + f->cmds); + + /* The suffix rule `.X.Y:' is converted + to the pattern rule `%.Y: %.X'. */ + convert_suffix_rule (dep_name (d2), dep_name (d), f->cmds); + } + } +} + + +/* Install the pattern rule RULE (whose fields have been filled in) at the end + of the list (so that any rules previously defined will take precedence). + If this rule duplicates a previous one (identical target and dependencies), + the old one is replaced if OVERRIDE is nonzero, otherwise this new one is + thrown out. When an old rule is replaced, the new one is put at the end of + the list. Return nonzero if RULE is used; zero if not. */ + +static int +new_pattern_rule (struct rule *rule, int override) +{ + struct rule *r, *lastrule; + unsigned int i, j; + + rule->in_use = 0; + rule->terminal = 0; + + rule->next = 0; + + /* Search for an identical rule. */ + lastrule = 0; + for (r = pattern_rules; r != 0; lastrule = r, r = r->next) + for (i = 0; i < rule->num; ++i) + { + for (j = 0; j < r->num; ++j) + if (!streq (rule->targets[i], r->targets[j])) + break; + /* If all the targets matched... */ + if (j == r->num) + { + struct dep *d, *d2; + for (d = rule->deps, d2 = r->deps; + d != 0 && d2 != 0; d = d->next, d2 = d2->next) + if (!streq (dep_name (d), dep_name (d2))) + break; + if (d == 0 && d2 == 0) + { + /* All the dependencies matched. */ + if (override) + { + /* Remove the old rule. */ + freerule (r, lastrule); + /* Install the new one. */ + if (pattern_rules == 0) + pattern_rules = rule; + else + last_pattern_rule->next = rule; + last_pattern_rule = rule; + + /* We got one. Stop looking. */ + goto matched; + } + else + { + /* The old rule stays intact. Destroy the new one. */ + freerule (rule, (struct rule *) 0); + return 0; + } + } + } + } + + matched:; + + if (r == 0) + { + /* There was no rule to replace. */ + if (pattern_rules == 0) + pattern_rules = rule; + else + last_pattern_rule->next = rule; + last_pattern_rule = rule; + } + + return 1; +} + + +/* Install an implicit pattern rule based on the three text strings + in the structure P points to. These strings come from one of + the arrays of default implicit pattern rules. + TERMINAL specifies what the `terminal' field of the rule should be. */ + +void +install_pattern_rule (struct pspec *p, int terminal) +{ + struct rule *r; + char *ptr; + + r = xmalloc (sizeof (struct rule)); + + r->num = 1; + r->targets = xmalloc (sizeof (const char *)); + r->suffixes = xmalloc (sizeof (const char *)); + r->lens = xmalloc (sizeof (unsigned int)); + + r->lens[0] = strlen (p->target); + r->targets[0] = p->target; + r->suffixes[0] = find_percent_cached (&r->targets[0]); + assert (r->suffixes[0] != NULL); + ++r->suffixes[0]; + + ptr = p->dep; + r->deps = PARSE_FILE_SEQ (&ptr, struct dep, '\0', NULL, 0); + + if (new_pattern_rule (r, 0)) + { + r->terminal = terminal; + r->cmds = xmalloc (sizeof (struct commands)); + r->cmds->fileinfo.filenm = 0; + r->cmds->fileinfo.lineno = 0; + /* These will all be string literals, but we malloc space for them + anyway because somebody might want to free them later. */ + r->cmds->commands = xstrdup (p->commands); + r->cmds->command_lines = 0; + } +} + + +/* Free all the storage used in RULE and take it out of the + pattern_rules chain. LASTRULE is the rule whose next pointer + points to RULE. */ + +static void +freerule (struct rule *rule, struct rule *lastrule) +{ + struct rule *next = rule->next; + + free_dep_chain (rule->deps); + + /* MSVC erroneously warns without a cast here. */ + free ((void *)rule->targets); + free ((void *)rule->suffixes); + free (rule->lens); + + /* We can't free the storage for the commands because there + are ways that they could be in more than one place: + * If the commands came from a suffix rule, they could also be in + the `struct file's for other suffix rules or plain targets given + on the same makefile line. + * If two suffixes that together make a two-suffix rule were each + given twice in the .SUFFIXES list, and in the proper order, two + identical pattern rules would be created and the second one would + be discarded here, but both would contain the same `struct commands' + pointer from the `struct file' for the suffix rule. */ + + free (rule); + + if (pattern_rules == rule) + if (lastrule != 0) + abort (); + else + pattern_rules = next; + else if (lastrule != 0) + lastrule->next = next; + if (last_pattern_rule == rule) + last_pattern_rule = lastrule; +} + +/* Create a new pattern rule with the targets in the nil-terminated array + TARGETS. TARGET_PERCENTS is an array of pointers to the % in each element + of TARGETS. N is the number of items in the array (not counting the nil + element). The new rule has dependencies DEPS and commands from COMMANDS. + It is a terminal rule if TERMINAL is nonzero. This rule overrides + identical rules with different commands if OVERRIDE is nonzero. + + The storage for TARGETS and its elements and TARGET_PERCENTS is used and + must not be freed until the rule is destroyed. */ + +void +create_pattern_rule (const char **targets, const char **target_percents, + unsigned int n, int terminal, struct dep *deps, + struct commands *commands, int override) +{ + unsigned int i; + struct rule *r = xmalloc (sizeof (struct rule)); + + r->num = n; + r->cmds = commands; + r->deps = deps; + r->targets = targets; + r->suffixes = target_percents; + r->lens = xmalloc (n * sizeof (unsigned int)); + + for (i = 0; i < n; ++i) + { + r->lens[i] = strlen (targets[i]); + assert (r->suffixes[i] != NULL); + ++r->suffixes[i]; + } + + if (new_pattern_rule (r, override)) + r->terminal = terminal; +} + +/* Print the data base of rules. */ + +static void /* Useful to call from gdb. */ +print_rule (struct rule *r) +{ + unsigned int i; + + for (i = 0; i < r->num; ++i) + { + fputs (r->targets[i], stdout); + putchar ((i + 1 == r->num) ? ':' : ' '); + } + if (r->terminal) + putchar (':'); + + print_prereqs (r->deps); + + if (r->cmds != 0) + print_commands (r->cmds); +} + +void +print_rule_data_base (void) +{ + unsigned int rules, terminal; + struct rule *r; + + puts (_("\n# Implicit Rules")); + + rules = terminal = 0; + for (r = pattern_rules; r != 0; r = r->next) + { + ++rules; + + putchar ('\n'); + print_rule (r); + + if (r->terminal) + ++terminal; + } + + if (rules == 0) + puts (_("\n# No implicit rules.")); + else + { + printf (_("\n# %u implicit rules, %u"), rules, terminal); +#ifndef NO_FLOAT + printf (" (%.1f%%)", (double) terminal / (double) rules * 100.0); +#else + { + int f = (terminal * 1000 + 5) / rules; + printf (" (%d.%d%%)", f/10, f%10); + } +#endif + puts (_(" terminal.")); + } + + if (num_pattern_rules != rules) + { + /* This can happen if a fatal error was detected while reading the + makefiles and thus count_implicit_rule_limits wasn't called yet. */ + if (num_pattern_rules != 0) + fatal (NILF, _("BUG: num_pattern_rules is wrong! %u != %u"), + num_pattern_rules, rules); + } +} diff --git a/rule.h b/rule.h new file mode 100644 index 0000000..b119d21 --- /dev/null +++ b/rule.h @@ -0,0 +1,59 @@ +/* Definitions for using pattern rules in GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + + +/* Structure used for pattern (implicit) rules. */ + +struct rule + { + struct rule *next; + const char **targets; /* Targets of the rule. */ + unsigned int *lens; /* Lengths of each target. */ + const char **suffixes; /* Suffixes (after `%') of each target. */ + struct dep *deps; /* Dependencies of the rule. */ + struct commands *cmds; /* Commands to execute. */ + unsigned short num; /* Number of targets. */ + char terminal; /* If terminal (double-colon). */ + char in_use; /* If in use by a parent pattern_search. */ + }; + +/* For calling install_pattern_rule. */ +struct pspec + { + char *target, *dep, *commands; + }; + + +extern struct rule *pattern_rules; +extern struct rule *last_pattern_rule; +extern unsigned int num_pattern_rules; + +extern unsigned int max_pattern_deps; +extern unsigned int max_pattern_targets; +extern unsigned int max_pattern_dep_length; + +extern struct file *suffix_file; +extern unsigned int maxsuffix; + + +void count_implicit_rule_limits (void); +void convert_to_pattern (void); +void install_pattern_rule (struct pspec *p, int terminal); +void create_pattern_rule (const char **targets, const char **target_percents, + unsigned int num, int terminal, struct dep *deps, + struct commands *commands, int override); diff --git a/signame.c b/signame.c new file mode 100644 index 0000000..6f3383d --- /dev/null +++ b/signame.c @@ -0,0 +1,256 @@ +/* Convert between signal names and numbers. +Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +/* If the system provides strsignal, we don't need it. */ + +#if !HAVE_STRSIGNAL + +/* If the system provides sys_siglist, we'll use that. + Otherwise create our own. + */ + +#if !HAVE_DECL_SYS_SIGLIST + +/* Some systems do not define NSIG in . */ +#ifndef NSIG +#ifdef _NSIG +#define NSIG _NSIG +#else +#define NSIG 32 +#endif +#endif + +/* There is too much variation in Sys V signal numbers and names, so + we must initialize them at runtime. */ + +static const char *undoc; + +static const char *sys_siglist[NSIG]; + +/* Table of abbreviations for signals. Note: A given number can + appear more than once with different abbreviations. */ +#define SIG_TABLE_SIZE (NSIG*2) + +typedef struct + { + int number; + const char *abbrev; + } num_abbrev; + +static num_abbrev sig_table[SIG_TABLE_SIZE]; + +/* Number of elements of sig_table used. */ +static int sig_table_nelts = 0; + +/* Enter signal number NUMBER into the tables with ABBREV and NAME. */ + +static void +init_sig (int number, const char *abbrev, const char *name) +{ + /* If this value is ever greater than NSIG it seems like it'd be a bug in + the system headers, but... better safe than sorry. We know, for + example, that this isn't always true on VMS. */ + + if (number >= 0 && number < NSIG) + sys_siglist[number] = name; + + if (sig_table_nelts < SIG_TABLE_SIZE) + { + sig_table[sig_table_nelts].number = number; + sig_table[sig_table_nelts++].abbrev = abbrev; + } +} + +static int +signame_init (void) +{ + int i; + + undoc = xstrdup (_("unknown signal")); + + /* Initialize signal names. */ + for (i = 0; i < NSIG; i++) + sys_siglist[i] = undoc; + + /* Initialize signal names. */ +#if defined (SIGHUP) + init_sig (SIGHUP, "HUP", _("Hangup")); +#endif +#if defined (SIGINT) + init_sig (SIGINT, "INT", _("Interrupt")); +#endif +#if defined (SIGQUIT) + init_sig (SIGQUIT, "QUIT", _("Quit")); +#endif +#if defined (SIGILL) + init_sig (SIGILL, "ILL", _("Illegal Instruction")); +#endif +#if defined (SIGTRAP) + init_sig (SIGTRAP, "TRAP", _("Trace/breakpoint trap")); +#endif + /* If SIGIOT == SIGABRT, we want to print it as SIGABRT because + SIGABRT is in ANSI and POSIX.1 and SIGIOT isn't. */ +#if defined (SIGABRT) + init_sig (SIGABRT, "ABRT", _("Aborted")); +#endif +#if defined (SIGIOT) + init_sig (SIGIOT, "IOT", _("IOT trap")); +#endif +#if defined (SIGEMT) + init_sig (SIGEMT, "EMT", _("EMT trap")); +#endif +#if defined (SIGFPE) + init_sig (SIGFPE, "FPE", _("Floating point exception")); +#endif +#if defined (SIGKILL) + init_sig (SIGKILL, "KILL", _("Killed")); +#endif +#if defined (SIGBUS) + init_sig (SIGBUS, "BUS", _("Bus error")); +#endif +#if defined (SIGSEGV) + init_sig (SIGSEGV, "SEGV", _("Segmentation fault")); +#endif +#if defined (SIGSYS) + init_sig (SIGSYS, "SYS", _("Bad system call")); +#endif +#if defined (SIGPIPE) + init_sig (SIGPIPE, "PIPE", _("Broken pipe")); +#endif +#if defined (SIGALRM) + init_sig (SIGALRM, "ALRM", _("Alarm clock")); +#endif +#if defined (SIGTERM) + init_sig (SIGTERM, "TERM", _("Terminated")); +#endif +#if defined (SIGUSR1) + init_sig (SIGUSR1, "USR1", _("User defined signal 1")); +#endif +#if defined (SIGUSR2) + init_sig (SIGUSR2, "USR2", _("User defined signal 2")); +#endif + /* If SIGCLD == SIGCHLD, we want to print it as SIGCHLD because that + is what is in POSIX.1. */ +#if defined (SIGCHLD) + init_sig (SIGCHLD, "CHLD", _("Child exited")); +#endif +#if defined (SIGCLD) + init_sig (SIGCLD, "CLD", _("Child exited")); +#endif +#if defined (SIGPWR) + init_sig (SIGPWR, "PWR", _("Power failure")); +#endif +#if defined (SIGTSTP) + init_sig (SIGTSTP, "TSTP", _("Stopped")); +#endif +#if defined (SIGTTIN) + init_sig (SIGTTIN, "TTIN", _("Stopped (tty input)")); +#endif +#if defined (SIGTTOU) + init_sig (SIGTTOU, "TTOU", _("Stopped (tty output)")); +#endif +#if defined (SIGSTOP) + init_sig (SIGSTOP, "STOP", _("Stopped (signal)")); +#endif +#if defined (SIGXCPU) + init_sig (SIGXCPU, "XCPU", _("CPU time limit exceeded")); +#endif +#if defined (SIGXFSZ) + init_sig (SIGXFSZ, "XFSZ", _("File size limit exceeded")); +#endif +#if defined (SIGVTALRM) + init_sig (SIGVTALRM, "VTALRM", _("Virtual timer expired")); +#endif +#if defined (SIGPROF) + init_sig (SIGPROF, "PROF", _("Profiling timer expired")); +#endif +#if defined (SIGWINCH) + /* "Window size changed" might be more accurate, but even if that + is all that it means now, perhaps in the future it will be + extended to cover other kinds of window changes. */ + init_sig (SIGWINCH, "WINCH", _("Window changed")); +#endif +#if defined (SIGCONT) + init_sig (SIGCONT, "CONT", _("Continued")); +#endif +#if defined (SIGURG) + init_sig (SIGURG, "URG", _("Urgent I/O condition")); +#endif +#if defined (SIGIO) + /* "I/O pending" has also been suggested. A disadvantage is + that signal only happens when the process has + asked for it, not everytime I/O is pending. Another disadvantage + is the confusion from giving it a different name than under Unix. */ + init_sig (SIGIO, "IO", _("I/O possible")); +#endif +#if defined (SIGWIND) + init_sig (SIGWIND, "WIND", _("SIGWIND")); +#endif +#if defined (SIGPHONE) + init_sig (SIGPHONE, "PHONE", _("SIGPHONE")); +#endif +#if defined (SIGPOLL) + init_sig (SIGPOLL, "POLL", _("I/O possible")); +#endif +#if defined (SIGLOST) + init_sig (SIGLOST, "LOST", _("Resource lost")); +#endif +#if defined (SIGDANGER) + init_sig (SIGDANGER, "DANGER", _("Danger signal")); +#endif +#if defined (SIGINFO) + init_sig (SIGINFO, "INFO", _("Information request")); +#endif +#if defined (SIGNOFP) + init_sig (SIGNOFP, "NOFP", _("Floating point co-processor not available")); +#endif + + return 1; +} + +#endif /* HAVE_DECL_SYS_SIGLIST */ + + +char * +strsignal (int sig) +{ + static char buf[] = "Signal 12345678901234567890"; + +#if ! HAVE_DECL_SYS_SIGLIST +# if HAVE_DECL__SYS_SIGLIST +# define sys_siglist _sys_siglist +# elif HAVE_DECL___SYS_SIGLIST +# define sys_siglist __sys_siglist +# else + static char sig_initted = 0; + + if (!sig_initted) + sig_initted = signame_init (); +# endif +#endif + + if (sig > 0 || sig < NSIG) + return (char *) sys_siglist[sig]; + + sprintf (buf, "Signal %d", sig); + return buf; +} + +#endif /* HAVE_STRSIGNAL */ diff --git a/strcache.c b/strcache.c new file mode 100644 index 0000000..830ec7d --- /dev/null +++ b/strcache.c @@ -0,0 +1,246 @@ +/* Constant string caching for GNU Make. +Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +#include + +#include "hash.h" + +/* The size (in bytes) of each cache buffer. + Try to pick something that will map well into the heap. */ +#define CACHE_BUFFER_SIZE (8192 - 16) + + +/* A string cached here will never be freed, so we don't need to worry about + reference counting. We just store the string, and then remember it in a + hash so it can be looked up again. */ + +struct strcache { + struct strcache *next; /* The next block of strings. */ + char *end; /* Pointer to the beginning of the free space. */ + int count; /* # of strings in this buffer (for stats). */ + int bytesfree; /* The amount of the buffer that is free. */ + char buffer[1]; /* The buffer comes after this. */ +}; + +static int bufsize = CACHE_BUFFER_SIZE; +static struct strcache *strcache = NULL; + +/* Add a new buffer to the cache. Add it at the front to reduce search time. + This can also increase the overhead, since it's less likely that older + buffers will be filled in. However, GNU make has so many smaller strings + that this doesn't seem to be much of an issue in practice. + */ +static struct strcache * +new_cache() +{ + struct strcache *new; + new = xmalloc (sizeof (*new) + bufsize); + new->end = new->buffer; + new->count = 0; + new->bytesfree = bufsize; + + new->next = strcache; + strcache = new; + + return new; +} + +static const char * +add_string(const char *str, int len) +{ + struct strcache *best = NULL; + struct strcache *sp; + const char *res; + + /* If the string we want is too large to fit into a single buffer, then + we're screwed; nothing will ever fit! Change the maximum size of the + cache to be big enough. */ + if (len > bufsize) + bufsize = len * 2; + + /* First, find a cache with enough free space. We always look through all + the blocks and choose the one with the best fit (the one that leaves the + least amount of space free). */ + for (sp = strcache; sp != NULL; sp = sp->next) + if (sp->bytesfree > len && (!best || best->bytesfree > sp->bytesfree)) + best = sp; + + /* If nothing is big enough, make a new cache. */ + if (!best) + best = new_cache(); + + assert (best->bytesfree > len); + + /* Add the string to the best cache. */ + res = best->end; + memcpy (best->end, str, len); + best->end += len; + *(best->end++) = '\0'; + best->bytesfree -= len + 1; + ++best->count; + + return res; +} + + +/* Hash table of strings in the cache. */ + +static unsigned long +str_hash_1 (const void *key) +{ + return_ISTRING_HASH_1 ((const char *) key); +} + +static unsigned long +str_hash_2 (const void *key) +{ + return_ISTRING_HASH_2 ((const char *) key); +} + +static int +str_hash_cmp (const void *x, const void *y) +{ + return_ISTRING_COMPARE ((const char *) x, (const char *) y); +} + +static struct hash_table strings; +static unsigned long total_adds = 0; + +static const char * +add_hash (const char *str, int len) +{ + /* Look up the string in the hash. If it's there, return it. */ + char *const *slot = (char *const *) hash_find_slot (&strings, str); + const char *key = *slot; + + /* Count the total number of adds we performed. */ + ++total_adds; + + if (!HASH_VACANT (key)) + return key; + + /* Not there yet so add it to a buffer, then into the hash table. */ + key = add_string (str, len); + hash_insert_at (&strings, key, slot); + return key; +} + +/* Returns true if the string is in the cache; false if not. */ +int +strcache_iscached (const char *str) +{ + struct strcache *sp; + + for (sp = strcache; sp != 0; sp = sp->next) + if (str >= sp->buffer && str < sp->end) + return 1; + + return 0; +} + +/* If the string is already in the cache, return a pointer to the cached + version. If not, add it then return a pointer to the cached version. + Note we do NOT take control of the string passed in. */ +const char * +strcache_add (const char *str) +{ + return add_hash (str, strlen (str)); +} + +const char * +strcache_add_len (const char *str, int len) +{ + /* If we're not given a nul-terminated string we have to create one, because + the hashing functions expect it. */ + if (str[len] != '\0') + { + char *key = alloca (len + 1); + memcpy (key, str, len); + key[len] = '\0'; + str = key; + } + + return add_hash (str, len); +} + +int +strcache_setbufsize(int size) +{ + if (size > bufsize) + bufsize = size; + return bufsize; +} + +void +strcache_init (void) +{ + hash_init (&strings, 8000, str_hash_1, str_hash_2, str_hash_cmp); +} + + +/* Generate some stats output. */ + +void +strcache_print_stats (const char *prefix) +{ + int numbuffs = 0, numstrs = 0; + int totsize = 0, avgsize, maxsize = 0, minsize = bufsize; + int totfree = 0, avgfree, maxfree = 0, minfree = bufsize; + int lastused = 0, lastfree = 0; + + if (strcache) + { + const struct strcache *sp; + + /* Count the first buffer separately since it's not full. */ + lastused = strcache->end - strcache->buffer; + lastfree = strcache->bytesfree; + + for (sp = strcache->next; sp != NULL; sp = sp->next) + { + int bf = sp->bytesfree; + int sz = sp->end - sp->buffer; + + ++numbuffs; + numstrs += sp->count; + + totsize += sz; + maxsize = (sz > maxsize ? sz : maxsize); + minsize = (sz < minsize ? sz : minsize); + + totfree += bf; + maxfree = (bf > maxfree ? bf : maxfree); + minfree = (bf < minfree ? bf : minfree); + } + } + + avgsize = numbuffs ? (int)(totsize / numbuffs) : 0; + avgfree = numbuffs ? (int)(totfree / numbuffs) : 0; + + printf (_("\n%s # of strings in strcache: %d / lookups = %lu / hits = %lu\n"), + prefix, numstrs, total_adds, (total_adds - numstrs)); + printf (_("%s # of strcache buffers: %d (* %d B/buffer = %d B)\n"), + prefix, (numbuffs + 1), bufsize, ((numbuffs + 1) * bufsize)); + printf (_("%s strcache used: total = %d (%d) / max = %d / min = %d / avg = %d\n"), + prefix, totsize, lastused, maxsize, minsize, avgsize); + printf (_("%s strcache free: total = %d (%d) / max = %d / min = %d / avg = %d\n"), + prefix, totfree, lastfree, maxfree, minfree, avgfree); + + fputs (_("\n# strcache hash-table stats:\n# "), stdout); + hash_print_stats (&strings, stdout); +} diff --git a/subproc.bat b/subproc.bat new file mode 100644 index 0000000..e5a0528 --- /dev/null +++ b/subproc.bat @@ -0,0 +1,24 @@ +@echo off +rem Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +rem 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +rem This file is part of GNU Make. +rem +rem GNU Make is free software; you can redistribute it and/or modify it under +rem the terms of the GNU General Public License as published by the Free +rem Software Foundation; either version 3 of the License, or (at your option) +rem any later version. +rem +rem GNU Make is distributed in the hope that it will be useful, but WITHOUT +rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +rem FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for. +rem more details. +rem +rem You should have received a copy of the GNU General Public License along +rem with this program. If not, see . + +cd w32\subproc +set MAKE=%2 +set MAKEFILE=%1 +if x%2 == x set MAKE=nmake +%MAKE% /f %MAKEFILE% +cd ..\.. diff --git a/tests/COPYING b/tests/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/tests/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. diff --git a/tests/ChangeLog b/tests/ChangeLog new file mode 100644 index 0000000..d036568 --- /dev/null +++ b/tests/ChangeLog @@ -0,0 +1,1079 @@ +2010-07-28 Paul Smith + + * scripts/targets/POSIX: Compatibility issues with Solaris (and + Tru64?); "false" returns different exit codes, and set -x shows + output with extra whitespace. Run the commands by hand first to + find out what the real shell would do, then compare what make does. + * scripts/variables/SHELL: Ditto. + +2010-07-12 Paul Smith + + * test_driver.pl: Add a new $perl_name containing the path to Perl. + * run_make_tests.pl (run_make_test): Replace the special string + #PERL# in a makefile etc. with the path the Perl executable so + makefiles can use it. + + * scripts/targets/ONESHELL: Add a new set of regression tests for + the .ONESHELL feature. + +2010-07-06 Paul Smith + + * scripts/variables/SHELL: Test the new .SHELLFLAGS variable. + + * scripts/targets/POSIX: New file. Test the .POSIX special target. + Verify that enabling .POSIX changes the shell flags to set -e. + +2010-07-01 Paul Smith + + * scripts/features/recursion: Add a space to separate command-line + args. Fixes Savannah bug #29968. + +2009-11-12 Boris Kolpackov + + * scripts/features/vpath3: Test for the new library search + behavior. + +2009-10-06 Boris Kolpackov + + * scripts/features/se_explicit: Enable the test for now fixed + Savannah bug 25780. + +2009-10-06 Boris Kolpackov + + * scripts/variables/undefine: Tests for the new undefine feature. + +2009-10-03 Paul Smith + + * scripts/features/parallelism: Test for open Savannah bug #26846. + + * scripts/variables/MAKE: Rewrite for new run_make_test() format. + + * scripts/variables/MAKEFLAGS: Created. + Add test for Savannah bug #2216 (still open). + + * scripts/features/include: Test for Savannah bug #102 (still open). + +2009-09-30 Boris Kolpackov + + * scripts/features/include: Add diagnostics issuing tests for + cases where targets have been updated and failed with the + dontcare flag. Savannah bugs #15110, #25493, #12686, #17740. + +2009-09-28 Paul Smith + + * scripts/functions/shell: Add regression test for Savannah bug + #20513 (still open). + + * scripts/features/se_explicit: Add regression tests for Savannah + bug #25780 (still open). + + * run_make_tests.pl (valid_option): Add a new flag, -all([-_]?tests)? + that runs tests we know will fail. This allows us to add + regression tests to the test suite for bugs that haven't been + fixed yet. + +2009-09-28 Boris Kolpackov + + * scripts/features/patspecific_vars: Add a test for the shortest + stem first order. + + * scripts/features/patternrules: Add a test for the shortest stem + first order. + +2009-09-24 Paul Smith + + * scripts/features/se_implicit: Add a test for order-only + secondary expansion prerequisites. + +2009-09-23 Paul Smith + + * scripts/features/patternrules: Test that we can remove pattern + rules, both single and multiple prerequisites. Savannah bug #18622. + + * scripts/features/echoing: Rework for run_make_test(). + +2009-06-14 Paul Smith + + * scripts/features/vpath: Verify we don't get bogus circular + dependency warnings if we choose a different file via vpath during + update. Savannah bug #13529. + +2009-06-13 Paul Smith + + * scripts/variables/MAKEFILES: Verify that MAKEFILES included + files (and files included by them) don't set the default goal. + Savannah bug #13401. + + * scripts/functions/wildcard: Test that wildcards with + non-existent glob matchers return empty. + +2009-06-09 Paul Smith + + * scripts/options/dash-B: Test the $? works correctly with -B. + Savannah bug #17825. + + * scripts/features/patternrules: Test that dependencies of + "also_make" targets are created properly. Savannah bug #19108. + + * test_driver.pl (compare_output): Create a "run" file for failed + tests containing the command that was run. + (get_runfile): New function. + + * run_make_tests.pl (valid_option): Enhanced support for valgrind: + allow memcheck and massif tools. + + * scripts/features/patternrules: Have to comment out a line in the + first test due to backing out a change that broke the implicit + rule search algorithm. Savannah bug #17752. + * scripts/misc/general4: Remove a test that is redundant with + patternrules. + + * scripts/features/parallelism: Add a test for re-exec with + jobserver master override. Savannah bug #18124. + +2009-06-08 Paul Smith + + * scripts/features/targetvars: Add a test for continued target + vars after a semicolon. Savannah bug #17521. + +2009-06-07 Paul Smith + + * scripts/features/se_explicit: Make sure we catch defining + prereqs during snap_deps(). Savannah bug #24622. + + * scripts/variables/automatic: Check prereq ordering when the + target with the recipe has no prereqs. Savannah bug #21198. + + * scripts/variables/LIBPATTERNS: Add a new set of test for + $(.LIBPATTERNS) (previously untested!) + +2009-06-04 Paul Smith + + * scripts/variables/SHELL: The export target-specific SHELL test + has an incorrect known-good-value. + + * scripts/misc/general4: Check for whitespace (ffeed, vtab, etc.) + + * scripts/features/se_explicit: Add tests for Savannah bug #24588. + +2009-05-31 Paul Smith + + * scripts/variables/DEFAULT_GOAL: Add tests for Savannah bug #25697. + + * scripts/features/targetvars: Add tests of overrides for Savannah + bug #26207. + * scripts/features/patspecific_vars: Ditto. + + * scripts/features/patternrules: Add a test for Savannah bug #26593. + +2009-05-30 Paul Smith + + * scripts/variables/flavors: Update with new variable flavor tests. + * scripts/variables/define: Create a new set of tests for + define/endef and move those aspects of the flavors suite here. + +2009-05-25 Paul Smith + + * scripts/features/targetvars: Ditto. + + * scripts/features/export: Test new variable parsing abilities. + +2009-02-23 Ramon Garcia + + * scripts/variables/private: Create a new suite of tests for 'private'. + +2007-11-04 Paul Smith + + * scripts/functions/eval: Update error message for command -> recipe. + + * test_driver.pl (compare_output): Allow the answer to be a regex, + if surrounded by '/'. + * scripts/misc/close_stdout: Use a regex for the answer, since + sometimes the error will have a description and sometimes it won't. + +2007-09-10 Paul Smith + + * scripts/variables/special: Add tests for .RECIPEPREFIX variable. + +2007-08-15 Paul Smith + + These test cases were contributed by + Icarus Sparry and J. David Bryan for + Savannah bugs #3330 and #15919. + + * scripts/targets/SECONDARY: Add tests for Savannah bugs 3330 and + 15919. + + * scripts/features/parallelism: Add tests for wrong answer/hang + combining INTERMEDIATE, order-only prereqs, and parallelism. + See Savannah bugs 3330 and 15919. + +2007-07-13 Paul Smith + + Install a timeout so tests can never loop infinitely. + Original idea and patch for a single-test version provided by + Icarus Sparry + + * test_driver.pl (_run_command): New function: this is called by + other functions to actually run a command. Before we run it, + install a SIGALRM handler and set up a timer to go off in the + future (default is 5s; this can be overridden by individual tests). + (run_command): Call it. + (run_command_with_output): Call it. + + * run_make_tests.pl (run_make_with_options): Override the default + timeout if the caller requests it. + (run_make_test): Pass any timeout override to run_make_with_options. + + * scripts/features/parallelism: Increase the timeout for long tests. + * scripts/options/dash-l: Ditto. + +2006-10-01 Paul Smith + + * run_make_tests.pl (set_more_defaults): Remove setting of LANG in + ENV here. This doesn't always work. + * test_driver.pl (toplevel): Set LC_ALL to 'C' in the make + environment. Fixes Savannah bug #16698. + +2006-09-30 Paul Smith + + * scripts/variables/automatic: Add back the test for bug #8154. + +2006-04-01 Paul D. Smith + + * scripts/functions/realpath: Don't run tests with multiple + initial slashes on Windows: those paths mean something different. + +2006-03-19 Paul D. Smith + + * scripts/features/parallelism: Test that the jobserver is + properly managed when we have to re-exec the master instance of + make. + +2006-03-17 Boris Kolpackov + + * scripts/features/statipattrules: Add tests for bug #16053. + +2006-03-09 Paul Smith + + * scripts/features/escape: Use "pre:" not "p:" to avoid conflicts + with DOS drive letters. Fixes Savannah bug #15947. + + * test_driver.pl (run_each_test): Set the status properly even + when a test fails to execute. Fixes Savannah bug #15942. + + * scripts/functions/foreach: Use a different environment variable + other than PATH to avoid differences with Windows platforms. + Fixes Savannah bug #15938. + +2006-03-05 Paul D. Smith + + * run_make_tests.pl (set_more_defaults): Add CYGWIN_NT as a port + type W32. Fixed Savannah bug #15937. + + * scripts/features/default_names: Don't call error() when the test + fails. Fixes Savannah bug #15941. + +2006-02-17 Paul D. Smith + + * scripts/features/targetvars: Test a complex construction which + guarantees that we have to merge variable lists of different + sizes. Tests for Savannah bug #15757. + +2006-02-15 Paul D. Smith + + * scripts/functions/error: Make sure filename/lineno information + is related to where the error is expanded, not where it's set. + * scripts/functions/warning: Ditto. + * scripts/functions/foreach: Check for different error conditions. + * scripts/functions/word: Ditto. + * scripts/variables/negative: Test some variable reference failure + conditions. + * scripts/options/warn-undefined-variables: Test the + --warn-undefined-variables flag. + +2006-02-09 Paul D. Smith + + * run_make_tests.pl (set_more_defaults): Update valgrind support + for newer versions. + * test_driver.pl (toplevel): Skip all hidden files/directories (ones + beginning with "."). + + * scripts/functions/andor: Tests for $(and ..) and $(or ...) + functions. + +2006-02-08 Boris Kolpackov + + * scripts/features/parallelism: Add a test for bug #15641. + +2006-02-06 Paul D. Smith + + * scripts/options/dash-W: Add a test for bug #15341. + +2006-01-03 Paul D. Smith + + * scripts/variables/automatic: Add a test for bug #8154. + + * README: Update to reflect the current state of the test suite. + +2005-12-12 Paul D. Smith + + * scripts/features/parallelism, scripts/functions/wildcard, + scripts/targets/FORCE, scripts/targets/PHONY, + scripts/targets/SILENT: Use the default setting for + $delete_command. Fixes bug #15085. + + * run_make_tests.pl (get_this_pwd) [VMS]: Use -no_ask with delete_file. + +2005-12-11 Paul D. Smith + + * scripts/misc/general4: Test implicit rules with '$' in the + prereq list & prereq patterns. + * scripts/features/se_implicit: Add in .SECONDEXPANSION settings. + +2005-12-09 Boris Kolpackov + + * scripts/features/patternrules: Add a test for bug #13022. + +2005-12-07 Boris Kolpackov + + * scripts/features/double_colon: Add a test for bug #14334. + +2005-11-17 Boris Kolpackov + + * scripts/functions/flavor: Add a test for the flavor function. + +2005-11-14 Boris Kolpackov + + * scripts/variables/INCLUDE_DIRS: Add a test for the .INCLUDE_DIRS + special variable. + +2005-10-24 Paul D. Smith + + * scripts/misc/general4: Test '$$' in prerequisites list. + * scripts/features/statipattrules: Rewrite to use run_make_test(). + Add various static pattern info. + * scripts/features/se_statpat: Enable .SECONDEXPANSION target. + * scripts/features/se_explicit: Add tests for handling '$$' in + prerequisite lists with and without setting .SECONDEXPANSION. + * scripts/features/order_only: Convert to run_make_test(). + * run_make_tests.pl (set_more_defaults): If we can't get the value + of $(MAKE) from make, then fatal immediately. + +2005-08-31 Paul D. Smith + + * run_make_tests.pl (get_this_pwd): Require the POSIX module (in + an eval to trap errors) and if it exists, use POSIX::getcwd to + find the working directory. If it doesn't exist, go back to the + previous methods. This tries to be more accurate on Windows + systems. + +2005-08-29 Paul D. Smith + + * scripts/functions/abspath: Add some text to the error messages + to get a better idea of what's wrong. Make warnings instead of + errors. + + * scripts/features/patspecific_vars: Don't use "test", which is + UNIX specific. Print the values and let the test script match + them. + +2005-08-25 Paul Smith + + * scripts/variables/SHELL: Use a /./ prefix instead of //: the + former works better with non-UNIX environments. Fixes Savannah + bug #14129. + +2005-08-13 Boris Kolpackov + + * scripts/functions/wildcard: Wrap calls to $(wildcard ) with + $(sort) so that the resulting order is no longer filesystem- + dependant. + +2005-08-10 Boris Kolpackov + + * scripts/features/statipattrules: Add a test for Savannah bug #13881. + +2005-08-07 Paul D. Smith + + * scripts/features/parallelism: Add a test for a bug reported by + Michael Matz (matz@suse.de) in which make exits without waiting + for all its children in some situations during parallel builds. + +2005-07-08 Paul D. Smith + + * test_driver.pl: Reset the environment to a clean value every + time before we invoke make. I'm suspicious that the environment + isn't handled the same way in Windows as it is in UNIX, and some + variables are leaking out beyond the tests they are intended for. + Create an %extraENV hash tests can set to add more env. vars. + * tests/scripts/features/export: Change to use %extraENV. + * tests/scripts/functions/eval: Ditto. + * tests/scripts/functions/origin: Ditto. + * tests/scripts/options/dash-e: Ditto. + * tests/scripts/variables/SHELL: Ditto. + +2005-06-27 Paul D. Smith + + * scripts/options/dash-W: Use 'echo >>' instead of touch to update + files. + * scripts/features/reinvoke: Rewrite to be safer on systems with + subsecond timestamps. + * scripts/features/patternrules: False exits with different error + codes on different systems (for example, Linux => 1, Solaris => 255). + + * scripts/options/dash-W: Set the timestamp to foo.x in the future, + to be sure it will be considered updated when it's remade. + +2005-06-26 Paul D. Smith + + * scripts/functions/shell: New test suite for the shell function. + +2005-06-25 Paul D. Smith + + * scripts/features/include: Test include/-include/sinclude with no + arguments. Tests fix for Savannah bug #1761. + + * scripts/misc/general3: Implement comprehensive testing of + backslash-newline behavior in command scripts: various types of + quoting, fast path / slow path, etc. + Tests fix for Savannah bug #1332. + + * scripts/options/symlinks: Test symlinks to non-existent files. + Tests fix for Savannah bug #13280. + + * scripts/misc/general3: Test semicolons in variable references. + Tests fix for Savannah bug #1454. + + * scripts/variables/MAKE_RESTARTS: New file: test the + MAKE_RESTARTS variable. + * scripts/options/dash-B: Test re-exec doesn't loop infinitely. + Tests fix for Savannah bug #7566. + * scripts/options/dash-W: New file: test the -W flag, including + re-exec infinite looping. + +2005-06-12 Paul D. Smith + + * scripts/misc/close_stdout: Add a test for Savannah bug #1328. + This test only works on systems that have /dev/full (e.g., Linux). + +2005-06-09 Paul D. Smith + + * scripts/functions/foreach: Add a test for Savannah bug #11913. + +2005-05-31 Boris Kolpackov + + * scripts/features/include: Add a test for Savannah bug #13216. + * scripts/features/patternrules: Add a test for Savannah bug #13218. + +2005-05-13 Paul D. Smith + + * scripts/features/conditionals: Add tests for the new if... else + if... endif syntax. + +2005-05-03 Paul D. Smith + + * scripts/variables/DEFAULT_GOAL: Rename DEFAULT_TARGET to + DEFAULT_GOAL. + +2005-05-02 Paul D. Smith + + * scripts/features/parallelism: Add a test for exporting recursive + variables containing $(shell ) calls. Rewrite this script to use + run_make_test() everywhere. + +2005-04-07 Paul D. Smith + + * scripts/targets/SECONDARY: Add a test for Savannah bug #12331. + +2005-03-15 Boris Kolpackov + + * scripts/variables/automatic: Add a test for Savannah bug #12320. + +2005-03-10 Boris Kolpackov + + * scripts/features/patternrules: Add a test for Savannah bug #12267. + +2005-03-09 Boris Kolpackov + + * scripts/variables/DEFAULT_TARGET: Add a test for Savannah + bug #12266. + +2005-03-04 Boris Kolpackov + + * scripts/features/patternrules: Add a test for Savannah bug #12202. + +2005-03-03 Boris Kolpackov + + * scripts/features/se_implicit: Add a test for stem + termination bug. Add a test for stem triple-expansion bug. + + * scripts/features/se_statpat: Add a test for stem + triple-expansion bug. + + * scripts/features/statipattrules: Change test #4 to reflect + new way empty prerequisite list is handled. + + +2005-03-01 Boris Kolpackov + + * scripts/features/statipattrules: Add a test for + Savannah bug #12180. + +2005-02-28 Paul D. Smith + + * scripts/options/dash-q: Add a test for Savannah bug # 7144. + + * scripts/options/symlinks: New file to test checking of symlink + timestamps. Can't use filename dash-L because it conflicts with + dash-l on case-insensitive filesystems. + + * scripts/variables/MAKEFILE_LIST, scripts/variables/MFILE_LIST: + Rename MAKEFILE_LIST test to MFILE_LIST, for systems that need 8.3 + unique filenames. + +2005-02-28 Boris Kolpackov + + * scripts/variables/DEFAULT_TARGET: Test the .DEFAULT_TARGET + special variable. + +2005-02-27 Boris Kolpackov + + * scripts/features/se_explicit: Test the second expansion in + explicit rules. + * scripts/features/se_implicit: Test the second expansion in + implicit rules. + * scripts/features/se_statpat: Test the second expansion in + static pattern rules. + * scripts/variables/automatic: Fix to work with the second + expansion. + + * scripts/misc/general4: Add a test for bug #12091. + +2005-02-27 Paul D. Smith + + * scripts/functions/eval: Check that eval of targets within + command scripts fails. See Savannah bug # 12124. + +2005-02-26 Paul D. Smith + + * test_driver.pl (compare_output): If a basic comparison of the + log and answer doesn't match, try harder: change all backslashes + to slashes and all CRLF to LF. This helps on DOS/Windows systems. + +2005-02-09 Paul D. Smith + + * scripts/features/recursion: Test command line variable settings: + only one instance of a given variable should be provided. + +2004-11-30 Boris Kolpackov + + * tests/scripts/functions/abspath: New file: test `abspath' + built-in function. + + * tests/scripts/functions/realpath: New file: test `realpath' + built-in function. + +2004-11-28 Paul D. Smith + + * scripts/options/dash-C [WINDOWS32]: Add a test for bug #10252; + this doesn't really test anything useful in UNIX but... + + * scripts/variables/SHELL: New file: test proper handling of SHELL + according to POSIX rules. Fixes bug #1276. + +2004-10-21 Boris Kolpackov + + * scripts/functions/word: Test $(firstword ) and $(lastword ). + +2004-10-05 Boris Kolpackov + + * scripts/features/patspecific_vars: Test simple/recursive + variable expansion. + +2004-09-28 Boris Kolpackov + + * scripts/features/include: Test dontcare flag inheritance + when rebuilding makefiles. + +2004-09-27 Boris Kolpackov + + * scripts/features/patspecific_vars: Test exported variables. + +2004-09-22 Paul D. Smith + + * run_make_tests.pl (run_make_test): Don't add newlines to the + makestring or answer if they are completely empty. + + * scripts/features/patternrules: Rename from implicit_prereq_eval. + + * scripts/test_template: Rework the template. + +2004-09-21 Boris Kolpackov + + * run_make_tests.pl: Change `#!/usr/local/bin/perl' to be + `#!/usr/bin/env perl'. + + * scripts/features/implicit_prereq_eval: Test implicit rule + prerequisite evaluation code. + +2004-09-21 Paul D. Smith + + * run_make_tests.pl (run_make_test): Enhance to allow the make + string to be undef: in that case it reuses the previous make + string. Allows multiple tests on the same makefile. + + * scripts/variables/flavors: Add some tests for prefix characters + interacting with define/endef variables. + +2004-09-20 Paul D. Smith + + * scripts/functions/substitution: Rewrite to use run_make_test() + interface, and add test for substitution failures reported by + Markus Mauhart . + +2004-03-22 Paul D. Smith + + * test_driver.pl (run_each_test, toplevel, compare_output): Change + to track both the testing categories _AND_ the number of + individual tests, and report both sets of numbers. + +2004-02-21 Paul D. Smith + + * scripts/functions/origin: Set our own environment variable + rather than relying on $HOME. + +2004-01-21 Paul D. Smith + + * scripts/features/conditionals: Test arguments to ifn?def which + contain whitespace (such as a function that is evaluated). Bug + #7257. + +2004-01-07 Paul D. Smith + + * scripts/features/order_only: Test order-only prerequisites in + pattern rules (patch #2349). + +2003-11-02 Paul D. Smith + + * scripts/functions/if: Test if on conditionals with trailing + whitespace--bug #5798. + + * scripts/functions/eval: Test eval in a non-file context--bug #6195. + +2003-04-19 Paul D. Smith + + * scripts/features/patspecific_vars: Test multiple patterns + matching the same target--Bug #1405. + +2003-04-09 Paul D. Smith + + * run_make_tests.pl (set_more_defaults): A new $port_type of + 'OS/2' for (surprise!) OS/2. Also choose a wait time of 2 seconds + for OS/2. + +2003-03-28 Paul D. Smith + + * scripts/targets/SECONDARY: Test the "global" .SECONDARY (with + not prerequisites)--Bug #2515. + +2003-01-30 Paul D. Smith + + * scripts/features/targetvars: Test very long target-specific + variable definition lines (longer than the default make buffer + length). Tests patch # 1022. + + * scripts/functions/eval: Test very recursive $(eval ...) calls + with simple variable expansion (bug #2238). + + * scripts/functions/word: Test error handling for word and + wordlist functions (bug #2407). + +2003-01-22 Paul D. Smith + + * scripts/functions/call: Test recursive argument masking (bug + #1744). + +2002-10-25 Paul D. Smith + + * scripts/functions/eval: Test using $(eval ...) inside + conditionals (Bug #1516). + +2002-10-14 Paul D. Smith + + * scripts/options/dash-t: Add a test for handling -t on targets + with no commands (Bug #1418). + +2002-10-13 Paul D. Smith + + * scripts/features/targetvars: Add a test for exporting + target-specific vars (Bug #1391). + +2002-10-05 Paul D. Smith + + * scripts/variables/automatic: Add tests for $$(@), $${@}, $${@D}, + and $${@F}. + +2002-09-23 Paul D. Smith + + * scripts/features/escape: Test handling of escaped comment + characters in targets and prerequisites. + +2002-09-18 Paul D. Smith + + * scripts/features/export: Test export/unexport of multiple + variables in a single command. + +2002-09-17 Paul D. Smith + + * scripts/features/targetvars: Tests for Bug #940: test + target-specific and pattern-specific variables in conjunction with + double-colon targets. + +2002-09-10 Paul D. Smith + + * test_driver.pl (compare_output): Match the new format for time + skew error messages. + + * scripts/features/export: Created. Add tests for export/unexport + capabilities, including exporting/unexporting expanded variables. + + * scripts/features/conditionals: Add a test for expanded variables + in ifdef conditionals. + +2002-09-04 Paul D. Smith + + * scripts/features/reinvoke: Change touch/sleep combos to utouch + invocations. + * scripts/features/vpathgpath: Ditto. + * scripts/features/vpathplus: Ditto. + * scripts/options/dash-n: Ditto. + * scripts/targets/INTERMEDIATE: Ditto. + * scripts/targets/SECONDARY: Ditto. + + * scripts/options/dash-t: Added a test for the -t bug fixed by + Henning Makholm. This test was also contributed by Henning. + + * scripts/misc/general4: Add a test suite for obscure algorithmic + features of make. First test: make sure creation subdirectories + as prerequisites of targets works properly. + + * scripts/misc/version: Remove this bogus test. + +2002-08-07 Paul D. Smith + + * scripts/misc/general3: Add a test for makefiles that don't end + in newlines. + + * scripts/variables/special: Create tests for the special + variables (.VARIABLES and .TARGETS). Comment out .TARGETS test + for now as it's not yet supported. + +2002-08-01 Paul D. Smith + + * scripts/options/dash-B: Add a test for the new -B option. + +2002-07-11 Paul D. Smith + + * run_make_tests.pl (valid_option): Add support for Valgrind. Use + -valgrind option to the test suite. + (set_more_defaults): Set up the file descriptor to capture + Valgrind output. We have to unset its close-on-exec flag; we + hardcode the value for F_SETFD (2) rather than load it; hopefully + this will help us avoid breaking the Windows/DOS test suite. + +2002-07-10 Paul D. Smith + + * scripts/variables/automatic: Add some tests for $$@, $$(@D), and + $$(@F). + + * test_driver.pl (utouch): Create a new function that creates a + file with a specific timestamp offset. Use of this function will + let us avoid lots of annoying sleep() invocations in the tests + just to get proper timestamping, which will make the tests run a + lot faster. So far it's only used in the automatic test suite. + +2002-07-09 Paul D. Smith + + * scripts/variables/automatic: Create a test for automatic variables. + +2002-07-08 Paul D. Smith + + * scripts/features/order_only: Test new order-only prerequisites. + +2002-07-07 Paul D. Smith + + * scripts/functions/eval: Test new function. + * scripts/functions/value: Test new function. + * scripts/variables/MAKEFILE_LIST: Test new variable. + +2002-04-28 Paul D. Smith + + * scripts/functions/call: New test: transitive closure + implementation using $(call ...) to test variable recursion. + +2002-04-21 Paul D. Smith + + * test_driver.pl (compare_dir_tree): Ignore CVS and RCS + directories in the script directories. + +2001-05-02 Paul D. Smith + + * scripts/variables/flavors: Test define/endef scripts where only + one of the command lines is quiet. + +2000-06-22 Paul D. Smith + + * scripts/options/dash-q: New file; test the -q option. Includes + a test for PR/1780. + +2000-06-21 Paul D. Smith + + * scripts/features/targetvars: Added a test for PR/1709: allowing + semicolons in target-specific variable values. + +2000-06-19 Paul D. Smith + + * scripts/functions/addsuffix: Test for an empty final argument. + Actually this bug might have happened for any function, but this + one was handy. + +2000-06-17 Eli Zaretskii + + * scripts/options/general: If parallel jobs are not supported, + expect a warning message from Make. + +2000-06-15 Eli Zaretskii + + * scripts/options/general: Don't try -jN with N != 1 if parallel + jobs are not supported. + +2000-05-24 Paul D. Smith + + * scripts/options/general: Test general option processing (PR/1716). + +2000-04-11 Paul D. Smith + + * scripts/functions/strip: Test empty value to strip (PR/1689). + +2000-04-08 Eli Zaretskii + + * scripts/features/reinvoke: Sleep before updating the target + files in the first test, to ensure its time stamp really gets + newer; otherwise Make might re-exec more than once. + +2000-04-07 Eli Zaretskii + + * scripts/features/double_colon: Don't run the parallel tests if + parallel jobs aren't supported. + +2000-04-04 Paul D. Smith + + * scripts/functions/word: wordlist doesn't swap arguments anymore. + +2000-03-27 Paul D. Smith + + * scripts/features/statipattrules: Test that static pattern rules + whose prerequisite patterns resolve to empty strings throw an + error (instead of dumping core). Fixes PR/1670. + + * scripts/features/reinvoke: Make more robust by touching "b" + first, to ensure it's not newer than "a". + Reported by Marco Franzen . + * scripts/options/dash-n: Ditto. + + * scripts/functions/call: Whoops. The fix to PR/1527 caused + recursive invocations of $(call ...) to break. I can't come up + with any way to get both working at the same time, so I backed out + the fix to 1527 and added a test case for recursive calls. This + also tests the fix for PR/1610. + + * scripts/features/double_colon: Test that circular dependencies + in double-colon rule sets are detected correctly (PR/1671). + +2000-03-26 Paul D. Smith + + * scripts/targets/INTERMEDIATE: Test that make doesn't remove + .INTERMEDIATE files when given on the command line (PR/1669). + +2000-03-08 Paul D. Smith + + * scripts/options/dash-k: Add a test for error detection by + multiple targets depending on the same prerequisite with -k. + For PR/1634. + +2000-02-07 Paul D. Smith + + * scripts/features/escape: Add a test for backslash-escaped spaces + in a target name (PR/1586). + +2000-02-04 Paul D. Smith + + * scripts/features/patspecific_vars: Add a test for pattern-specific + target variables inherited from the parent target (PR/1407). + +2000-02-02 Paul D. Smith + + * run_make_tests.pl (set_more_defaults): Hard-code the LANG to C + to make sure sorting order, etc. is predictable. + Reported by Andreas Jaeger . + + * run_make_tests.pl (set_more_defaults): Set the $wtime variable + depending on the OS. Eli Zaretskii reports + this seems to need to be *4* on DOS/Windows, not just 2. Keep it + 1 for other systems. + * scripts/features/vpathplus (touchfiles): Use the $wtime value + instead of hardcoding 2. + * scripts/targets/SECONDARY: Ditto. + * scripts/targets/INTERMEDIATE: Ditto. + +2000-01-27 Paul D. Smith + + * test_driver.pl (toplevel): Don't try to run test scripts which + are really directories. + +2000-01-23 Paul D. Smith + + * scripts/features/include: Remove a check; the fix caused more + problems than the error, so I removed it and removed the test for + it. + +2000-01-11 Paul D. Smith + + * scripts/functions/call: Add a test for PR/1517 and PR/1527: make + sure $(call ...) doesn't eval its arguments and that you can + invoke foreach from it without looping forever. + +1999-12-15 Paul D. Smith + + * scripts/targets/INTERMEDIATE: Add a test for PR/1423: make sure + .INTERMEDIATE settings on files don't disable them as implicit + intermediate possibilities. + +1999-12-01 Paul D. Smith + + * scripts/features/double_colon: Add a test for PR/1476: Try + double-colon rules as non-goal targets and during parallel builds + to make sure they're handled serially. + +1999-11-17 Paul D. Smith + + * scripts/functions/if: Add a test for PR/1429: put some text + after an if-statement to make sure it works. + + * scripts/features/targetvars: Add a test for PR/1380: handling += + in target-specific variable definitions correctly. + +1999-10-15 Paul D. Smith + + * scripts/variables/MAKEFILES: This was really broken: it didn't + test anything at all, really. Rewrote it, plus added a test for + PR/1394. + +1999-10-13 Paul D. Smith + + * scripts/options/dash-n: Add a test for PR/1379: "-n doesn't + behave properly when used with recursive targets". + +1999-10-08 Paul D. Smith + + * scripts/features/targetvars: Add a check for PR/1378: + "Target-specific vars don't inherit correctly" + +1999-09-29 Paul D. Smith + + * test_driver.pl (get_osname): Change $fancy_file_names to + $short_filenames and reverse the logic. + (run_each_test): Change test of non-existent $port_host to use + $short_filenames--problem reported by Eli Zaretskii. + +1999-09-23 Paul D. Smith + + * scripts/features/parallelism: Add a check to ensure that the + jobserver works when we re-invoke. Also cleaned up the tests a + little, reducing the number of rules we use so the test won't need + as many "sleep" commands. + +1999-09-16 Paul D. Smith + + * scripts/features/reinvoke: Remove invocations of "touch" in + makefiles. See the comments on the touch function rewrite below. + Note that UNIX touch behaves the same way if the file already + exists: it sets the time to the _local_ time. We don't want + this. This is probably a good tip for makefile writers in + general, actually... where practical. + * scripts/options/dash-l: Ditto. + * scripts/options/dash-n: Ditto. + + * test_driver.pl (run_each_test): In retrospect, I don't like the + .lN/.bN/.dN postfix required by DOS. So, for non-DOS systems I + changed it back to use .log, .base, and .diff. + + * run_make_tests.pl (set_more_defaults): Move the check for the + make pathname to here from set_defaults (that's too early since it + happens before the command line processing). + Create a new variable $port_type, calculated from $osname, to + specify what kind of system we're running on. We should integrate + the VOS stuff here, too. + (valid_option): Comment out the workdir/-work stuff so people + won't be fooled into thinking it works... someone needs to fix + this, though! + + * scripts/functions/origin: Use $port_type instead of $osname. + * scripts/functions/foreach: Ditto. + * scripts/features/default_names: Ditto. + +1999-09-15 Paul D. Smith + + * test_driver.pl (touch): Rewrite this function. Previously it + used to use utime() to hard-set the time based on the current + local clock, or, if the file didn't exist, it merely created it. + This mirrors exactly what real UNIX touch does, but it fails badly + on networked filesystems where the FS server clock is skewed from + the local clock: normally modifying a file causes it to get a mod + time based on the _server's_ clock. Hard-setting it based on the + _local_ clock causes gratuitous errors and makes the tests + unreliable except on local filesystems. The new function will + simply modify the file, allowing the filesystem to set the mod + time as it sees fit. + + * scripts/features/parallelism: The second test output could + change depending on how fast some scripts completed; use "sleep" + to force the order we want. + + * test_driver.pl (toplevel): A bug in Perl 5.000 to Perl 5.004 + means that "%ENV = ();" doesn't do the right thing. This worked + in Perl 4 and was fixed in Perl 5.004_01, but use a loop to delete + the environment rather than require specific versions. + + * run_make_tests.pl (set_more_defaults): Don't use Perl 5 s/// + modifier "s", so the tests will run with Perl 4. + (set_more_defaults): Set $pure_log to empty if there's no -logfile + option in PURIFYOPTIONS. + (setup_for_test): Don't remove any logs unless $pure_log is set. + +1999-09-15 Eli Zaretskii + + * scripts/features/reinvoke: Put the SHELL definition in the right + test makefile. + +1999-09-15 Paul D. Smith + + ChangeLog file for the test suite created. + + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/tests/NEWS b/tests/NEWS new file mode 100644 index 0000000..43971ec --- /dev/null +++ b/tests/NEWS @@ -0,0 +1,179 @@ +Changes from 0.4.9 to 3.78 (Sep 6, 1999): + + Lots of new tests. Renamed to follow the GNU make scheme. Also + added some support for using Purify with make. + + Rob Tulloh contributed some changes to get the test suite running on + NT; I tweaked them a bit (hopefully I didn't break anything!) Note + that NT doesn't grok the self-exec funkiness that Unix shells use, + so instead I broke that out into a separate shell script + "run_make_tests" that invokes perl with the (renamed) script + run_make_tests.pl. + + Eli Zaretski contributed changes to get the test suite running on + DOS with DJGPP. I also meddled in these somewhat. + + If you're on DOS or NT you should run "perl.exe run_make_tests.pl ..." + If you're on Unix, you can continue to run "./run_make_tests ..." as + before. + +Changes from 0.4.8 to 0.4.9 (May 14, 1998): + + Release by Paul D. Smith ; I'm the one to + blame for problems in this version :). + + Add some perl to test_driver.pl to strip out GNU make clock skew + warning messages from the output before comparing it to the + known-good output. + + A new test for escaped :'s in filenames (someone on VMS found this + didn't work anymore in 3.77): scripts/features/escape. + +Changes from 0.4.7 to 0.4.8 (May 14, 1998): + + Release by Paul D. Smith ; I'm the one to + blame for problems in this version :). + + New tests for features to be included in GNU make 3.77. + +Changes from 0.4.6 to 0.4.7 (August 18, 1997): + + Release by Paul D. Smith ; I'm the one to + blame for problems in this version :). + + Reworked some tests to make sure they all work with both perl4 and perl5. + + Work around a bug in perl 5.004 which doesn't clean the environment + correctly in all cases (fixed in at least 5.004_02). + + Updated functions/strip to test for newline stripping. + + Keep a $PURIFYOPTIONS env variable if present. + +Changes from 0.4.5 to 0.4.6 (April 07, 1997): + + Release by Paul D. Smith ; I'm the one to + blame for problems in this version :). + + Updated to work with GNU make 3.76 (and pretests). + + Added new tests and updated existing ones. Note that the new tests + weren't tested with perl 4, however I think they should work. + + Ignore any tests whose filenames end in "~", so that Emacs backup + files aren't run. + +Changes from 0.4.4 to 0.4.5 (April 29, 1995): + + Updated to be compatible with perl 5.001 as well as 4.036. + + Note: the test suite still won't work on 14-char filesystems + (sorry, Kaveh), but I will get to it. + + Also, some tests and stuff still haven't made it in because I + haven't had time to write the test scripts for them. But they, + too, will get in eventually. Contributions of scripts (ie, tests + that I can just drop in) are particularly welcome and will be + incorporated immediately. + +Changes from 0.4.3 to 0.4.4 (March 1995): + + Updated for changes in make 3.72.12, and to ignore CVS directories + (thanks go to Jim Meyering for the patches for this). + + Fixed uname call to not make a mess on BSD/OS 2.0 (whose uname -a + is very verbose). Let me know if this doesn't work correctly on + your system. + + Changed to display test name while it is running, not just when it + finishes. + + Note: the test suite still won't work on 14-char filesystems + (sorry, Kaveh), but I will get to it. + + Also, some tests and stuff still haven't made it in because I + haven't had time to write the test scripts for them. But they, + too, will get in eventually. + +Changes from 0.4 to 0.4.3 (October 1994): + + Fixed bugs (like dependencies on environment variables). + + Caught up with changes in make. + + The load_limit test should now silently ignore a failure due to + make not being able to read /dev/kmem. + + Reorganized tests into subdirs and renamed lots of things so that + those poor souls who still have to deal with 14-char filename + limits won't hate me any more. Thanks very much to Kaveh R. Ghazi + for helping me with the implementation and + testing of these changes, and for putting up with all my whining + about it... + + Added a $| = 1 so that systems that don't seem to automatically + flush their output for some reason will still print all the + output. I'd hate for someone to miss out on the smiley that + you're supposed to get when all the tests pass... :-) + +Changes from 0.3 to 0.4 (August 1993): + + Lost in the mists of time (and my hurry to get it out before I + left my job). + +Changes from 0.2 to 0.3 (9-30-92): + + Several tests fixed to match the fact that MAKELEVEL > 0 or -C now + imply -w. + + parallel_execution test fixed to not use double colon rules any + more since their behavior has changed. + + errors_in_commands test fixed to handle different error messages + and return codes from rm. + + Several tests fixed to handle -make_path with a relative path + and/or a name other than "make" for make. + + dash-e-option test fixed to use $PATH instead of $USER (since the + latter does not exist on some System V systems). This also + removes the dependency on getlogin (which fails under certain + weird conditions). + + test_driver_core changed so that you can give a test name like + scripts/errors_in_commands and it will be handled correctly (handy + if you have a shell with filename completion). + +Changes from 0.1 to 0.2 (5-4-92): + + README corrected to require perl 4.019, not 4.010. + + -make_path replaces -old. + + errors_in_commands test updated for change in format introduced in + make 3.62.6. + + test_driver_core now uses a better way of figuring what OS it is + running on (thanks to meyering@cs.utexas.edu (Jim Meyering) for + suggesting this, as well as discovering the hard way that the old + way (testing for /mnt) fails on his machine). + + Some new tests were added. + + +------------------------------------------------------------------------------- +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . diff --git a/tests/README b/tests/README new file mode 100644 index 0000000..3860bdb --- /dev/null +++ b/tests/README @@ -0,0 +1,103 @@ +The test suite was originally written by Steve McGee and Chris Arthur. +It is covered by the GNU General Public License (Version 2), described +in the file COPYING. It has been maintained as part of GNU make proper +since GNU make 3.78. + +This entire test suite, including all test files, are copyright and +distributed under the following terms: + + ----------------------------------------------------------------------------- + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, + 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. + This file is part of GNU Make. + + GNU Make 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. + + GNU Make 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 . + ----------------------------------------------------------------------------- + +The test suite requires Perl. These days, you should have at least Perl +5.004 (available from ftp.gnu.org, and portable to many machines). It +used to work with Perl 4.036 but official support for Perl 4.x was +abandoned a long time ago, due to lack of testbeds, as well as interest. + +The test suite assumes that the first "diff" it finds on your PATH is +GNU diff, but that only matters if a test fails. + +To run the test suite on a UNIX system, use "perl ./run_make_tests" +(or just "./run_make_tests" if you have a perl on your PATH). + +To run the test suite on Windows NT or DOS systems, use +"perl.exe ./run_make-tests.pl". + +By default, the test engine picks up the first executable called "make" +that it finds in your path. You may use the -make_path option (ie, +"perl run_make_tests -make_path /usr/local/src/make-3.78/make") if +you want to run a particular copy. This now works correctly with +relative paths and when make is called something other than "make" (like +"gmake"). + +Tests cannot end with a "~" character, as the test suite will ignore any +that do (I was tired of having it run my Emacs backup files as tests :)) + +Also, sometimes the tests may behave strangely on networked +filesystems. You can use mkshadow to create a copy of the test suite in +/tmp or similar, and try again. If the error disappears, it's an issue +with your network or file server, not GNU make (I believe). This +shouldn't happen very often anymore: I've done a lot of work on the +tests to reduce the impacts of this situation. + +The options/dash-l test will not really test anything if the copy of +make you are using can't obtain the system load. Some systems require +make to be setgid sys or kmem for this; if you don't want to install +make just to test it, make it setgid to kmem or whatever group /dev/kmem +is (ie, "chgrp kmem make;chmod g+s make" as root). In any case, the +options/dash-l test should no longer *fail* because make can't read +/dev/kmem. + +A directory named "work" will be created when the tests are run which +will contain any makefiles and "diff" files of tests that fail so that +you may look at them afterward to see the output of make and the +expected result. + +There is a -help option which will give you more information about the +other possible options for the test suite. + + +Open Issues +----------- + +The test suite has a number of problems which should be addressed. One +VERY serious one is that there is no real documentation. You just have +to see the existing tests. Use the newer tests: many of the tests +haven't been updated to use the latest/greatest test methods. See the +ChangeLog in the tests directory for pointers. + +The second serious problem is that it's not parallelizable: it scribbles +all over its installation directory and so can only test one make at a +time. The third serious problem is that it's not relocatable: the only +way it works when you build out of the source tree is to create +symlinks, which doesn't work on every system and is bogus to boot. The +fourth serious problem is that it doesn't create its own sandbox when +running tests, so that if a test forgets to clean up after itself that +can impact future tests. + + +Bugs +---- + +Any complaints/suggestions/bugs/etc. for the test suite itself (as +opposed to problems in make that the suite finds) should be handled the +same way as normal GNU make bugs/problems (see the README for GNU make). + + + Paul D. Smith + Chris Arthur diff --git a/tests/mkshadow b/tests/mkshadow new file mode 100755 index 0000000..d41b40e --- /dev/null +++ b/tests/mkshadow @@ -0,0 +1,59 @@ +#!/bin/sh +# +# Simple script to make a "shadow" test directory, using symbolic links. +# Typically you'd put the shadow in /tmp or another local disk +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +case "$1" in + "") echo 'Usage: mkshadow '; exit 1 ;; +esac + +dest="$1" + +if [ ! -d "$dest" ]; then + echo "Destination directory \`$dest' must exist!" + exit 1 +fi + +if [ ! -f run_make_tests ]; then + echo "The current directory doesn't appear to contain the test suite!" + exit 1 +fi + +suite=`pwd | sed 's%^/tmp_mnt%%'` +name=`basename "$suite"` + +files=`echo *` + +set -e + +mkdir "$dest/$name" +cd "$dest/$name" + +ln -s "$suite" .testdir + +for f in $files; do + ln -s .testdir/$f . +done + +rm -rf work + +echo "Shadow test suite created in \`$dest/$name'." +exit 0 diff --git a/tests/run_make_tests b/tests/run_make_tests new file mode 100755 index 0000000..b68b784 --- /dev/null +++ b/tests/run_make_tests @@ -0,0 +1,2 @@ +#!/bin/sh +exec perl $0.pl ${1+"$@"} diff --git a/tests/run_make_tests.pl b/tests/run_make_tests.pl new file mode 100755 index 0000000..2c8c08b --- /dev/null +++ b/tests/run_make_tests.pl @@ -0,0 +1,402 @@ +#!/usr/bin/env perl +# -*-perl-*- + +# Test driver for the Make test suite + +# Usage: run_make_tests [testname] +# [-debug] +# [-help] +# [-verbose] +# [-keep] +# [-make ] +# (and others) + +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + + +$valgrind = 0; # invoke make with valgrind +$valgrind_args = ''; +$memcheck_args = '--num-callers=15 --tool=memcheck --leak-check=full'; +$massif_args = '--num-callers=15 --tool=massif --alloc-fn=xmalloc --alloc-fn=xcalloc --alloc-fn=xrealloc --alloc-fn=xstrdup --alloc-fn=xstrndup'; +$pure_log = undef; + +$command_string = ''; + +$all_tests = 0; + +require "test_driver.pl"; + +# Some target systems might not have the POSIX module... +$has_POSIX = eval { require "POSIX.pm" }; + +#$SIG{INT} = sub { print STDERR "Caught a signal!\n"; die @_; }; + +sub valid_option +{ + local($option) = @_; + + if ($option =~ /^-make([-_]?path)?$/i) { + $make_path = shift @argv; + if (!-f $make_path) { + print "$option $make_path: Not found.\n"; + exit 0; + } + return 1; + } + + if ($option =~ /^-all([-_]?tests)?$/i) { + $all_tests = 1; + return 1; + } + + if ($option =~ /^-(valgrind|memcheck)$/i) { + $valgrind = 1; + $valgrind_args = $memcheck_args; + return 1; + } + + if ($option =~ /^-massif$/i) { + $valgrind = 1; + $valgrind_args = $massif_args; + return 1; + } + +# This doesn't work--it _should_! Someone badly needs to fix this. +# +# elsif ($option =~ /^-work([-_]?dir)?$/) +# { +# $workdir = shift @argv; +# return 1; +# } + + return 0; +} + + +# This is an "all-in-one" function. Arguments are as follows: +# +# [0] (string): The makefile to be tested. undef means use the last one. +# [1] (string): Arguments to pass to make. +# [2] (string): Answer we should get back. +# [3] (integer): Exit code we expect. A missing code means 0 (success) + +$old_makefile = undef; + +sub run_make_test +{ + local ($makestring, $options, $answer, $err_code, $timeout) = @_; + + # If the user specified a makefile string, create a new makefile to contain + # it. If the first value is not defined, use the last one (if there is + # one). + + if (! defined $makestring) { + defined $old_makefile + || die "run_make_test(undef) invoked before run_make_test('...')\n"; + $makefile = $old_makefile; + } else { + if (! defined($makefile)) { + $makefile = &get_tmpfile(); + } + + # Make sure it ends in a newline. + $makestring && $makestring !~ /\n$/s and $makestring .= "\n"; + + # Replace @MAKEFILE@ with the makefile name and @MAKE@ with the path to + # make + $makestring =~ s/#MAKEFILE#/$makefile/g; + $makestring =~ s/#MAKEPATH#/$mkpath/g; + $makestring =~ s/#MAKE#/$make_name/g; + $makestring =~ s/#PERL#/$perl_name/g; + $makestring =~ s/#PWD#/$pwd/g; + + # Populate the makefile! + open(MAKEFILE, "> $makefile") || die "Failed to open $makefile: $!\n"; + print MAKEFILE $makestring; + close(MAKEFILE) || die "Failed to write $makefile: $!\n"; + } + + # Do the same processing on $answer as we did on $makestring. + + $answer && $answer !~ /\n$/s and $answer .= "\n"; + $answer =~ s/#MAKEFILE#/$makefile/g; + $answer =~ s/#MAKEPATH#/$mkpath/g; + $answer =~ s/#MAKE#/$make_name/g; + $answer =~ s/#PERL#/$perl_name/g; + $answer =~ s/#PWD#/$pwd/g; + + run_make_with_options($makefile, $options, &get_logfile(0), + $err_code, $timeout); + &compare_output($answer, &get_logfile(1)); + + $old_makefile = $makefile; + $makefile = undef; +} + +# The old-fashioned way... +sub run_make_with_options { + local ($filename,$options,$logname,$expected_code,$timeout) = @_; + local($code); + local($command) = $make_path; + + $expected_code = 0 unless defined($expected_code); + + # Reset to reflect this one test. + $test_passed = 1; + + if ($filename) { + $command .= " -f $filename"; + } + + if ($options) { + $command .= " $options"; + } + + $command_string = "$command\n"; + + if ($valgrind) { + print VALGRIND "\n\nExecuting: $command\n"; + } + + + { + my $old_timeout = $test_timeout; + $timeout and $test_timeout = $timeout; + + # If valgrind is enabled, turn off the timeout check + $valgrind and $test_timeout = 0; + + $code = &run_command_with_output($logname,$command); + + $test_timeout = $old_timeout; + } + + # Check to see if we have Purify errors. If so, keep the logfile. + # For this to work you need to build with the Purify flag -exit-status=yes + + if ($pure_log && -f $pure_log) { + if ($code & 0x7000) { + $code &= ~0x7000; + + # If we have a purify log, save it + $tn = $pure_testname . ($num_of_logfiles ? ".$num_of_logfiles" : ""); + print("Renaming purify log file to $tn\n") if $debug; + rename($pure_log, "$tn") + || die "Can't rename $log to $tn: $!\n"; + ++$purify_errors; + } else { + unlink($pure_log); + } + } + + if ($code != $expected_code) { + print "Error running $make_path (expected $expected_code; got $code): $command\n"; + $test_passed = 0; + $runf = &get_runfile; + &create_file (&get_runfile, $command_string); + # If it's a SIGINT, stop here + if ($code & 127) { + print STDERR "\nCaught signal ".($code & 127)."!\n"; + ($code & 127) == 2 and exit($code); + } + return 0; + } + + if ($profile & $vos) { + system "add_profile $make_path"; + } + + return 1; +} + +sub print_usage +{ + &print_standard_usage ("run_make_tests", + "[-make_path make_pathname] [-memcheck] [-massif]",); +} + +sub print_help +{ + &print_standard_help ( + "-make_path", + "\tYou may specify the pathname of the copy of make to run.", + "-valgrind", + "-memcheck", + "\tRun the test suite under valgrind's memcheck tool.", + "\tChange the default valgrind args with the VALGRIND_ARGS env var.", + "-massif", + "\tRun the test suite under valgrind's massif toool.", + "\tChange the default valgrind args with the VALGRIND_ARGS env var." + ); +} + +sub get_this_pwd { + $delete_command = 'rm -f'; + if ($has_POSIX) { + $__pwd = POSIX::getcwd(); + } elsif ($vos) { + $delete_command = "delete_file -no_ask"; + $__pwd = `++(current_dir)`; + } else { + # No idea... just try using pwd as a last resort. + chop ($__pwd = `pwd`); + } + + return $__pwd; +} + +sub set_defaults +{ + # $profile = 1; + $testee = "GNU make"; + $make_path = "make"; + $tmpfilesuffix = "mk"; + $pwd = &get_this_pwd; +} + +sub set_more_defaults +{ + local($string); + local($index); + + # find the type of the port. We do this up front to have a single + # point of change if it needs to be tweaked. + # + # This is probably not specific enough. + # + if ($osname =~ /Windows/i || $osname =~ /MINGW32/i || $osname =~ /CYGWIN_NT/i) { + $port_type = 'W32'; + } + # Bleah, the osname is so variable on DOS. This kind of bites. + # Well, as far as I can tell if we check for some text at the + # beginning of the line with either no spaces or a single space, then + # a D, then either "OS", "os", or "ev" and a space. That should + # match and be pretty specific. + elsif ($osname =~ /^([^ ]*|[^ ]* [^ ]*)D(OS|os|ev) /) { + $port_type = 'DOS'; + } + # Check for OS/2 + elsif ($osname =~ m%OS/2%) { + $port_type = 'OS/2'; + } + # Everything else, right now, is UNIX. Note that we should integrate + # the VOS support into this as well and get rid of $vos; we'll do + # that next time. + else { + $port_type = 'UNIX'; + } + + # On DOS/Windows system the filesystem apparently can't track + # timestamps with second granularity (!!). Change the sleep time + # needed to force a file to be considered "old". + $wtime = $port_type eq 'UNIX' ? 1 : $port_type eq 'OS/2' ? 2 : 4; + + print "Port type: $port_type\n" if $debug; + print "Make path: $make_path\n" if $debug; + + # Find the full pathname of Make. For DOS systems this is more + # complicated, so we ask make itself. + my $mk = `sh -c 'echo "all:;\@echo \\\$(MAKE)" | $make_path -f-'`; + chop $mk; + $mk or die "FATAL ERROR: Cannot determine the value of \$(MAKE):\n +'echo \"all:;\@echo \\\$(MAKE)\" | $make_path -f-' failed!\n"; + $make_path = $mk; + print "Make\t= `$make_path'\n" if $debug; + + $string = `$make_path -v -f /dev/null 2> /dev/null`; + + $string =~ /^(GNU Make [^,\n]*)/; + $testee_version = "$1\n"; + + $string = `sh -c "$make_path -f /dev/null 2>&1"`; + if ($string =~ /(.*): \*\*\* No targets\. Stop\./) { + $make_name = $1; + } + else { + if ($make_path =~ /$pathsep([^\n$pathsep]*)$/) { + $make_name = $1; + } + else { + $make_name = $make_path; + } + } + + # prepend pwd if this is a relative path (ie, does not + # start with a slash, but contains one). Thanks for the + # clue, Roland. + + if (index ($make_path, ":") != 1 && index ($make_path, "/") > 0) + { + $mkpath = "$pwd$pathsep$make_path"; + } + else + { + $mkpath = $make_path; + } + + # Get Purify log info--if any. + + if (exists $ENV{PURIFYOPTIONS} + && $ENV{PURIFYOPTIONS} =~ /.*-logfile=([^ ]+)/) { + $pure_log = $1 || ''; + $pure_log =~ s/%v/$make_name/; + $purify_errors = 0; + } + + $string = `sh -c "$make_path -j 2 -f /dev/null 2>&1"`; + if ($string =~ /not supported/) { + $parallel_jobs = 0; + } + else { + $parallel_jobs = 1; + } + + # Set up for valgrind, if requested. + + if ($valgrind) { + my $args = $valgrind_args; + open(VALGRIND, "> valgrind.out") + || die "Cannot open valgrind.out: $!\n"; + # -q --leak-check=yes + exists $ENV{VALGRIND_ARGS} and $args = $ENV{VALGRIND_ARGS}; + $make_path = "valgrind --log-fd=".fileno(VALGRIND)." $args $make_path"; + # F_SETFD is 2 + fcntl(VALGRIND, 2, 0) or die "fcntl(setfd) failed: $!\n"; + system("echo Starting on `date` 1>&".fileno(VALGRIND)); + print "Enabled valgrind support.\n"; + } +} + +sub setup_for_test +{ + $makefile = &get_tmpfile; + if (-f $makefile) { + unlink $makefile; + } + + # Get rid of any Purify logs. + if ($pure_log) { + ($pure_testname = $testname) =~ tr,/,_,; + $pure_testname = "$pure_log.$pure_testname"; + system("rm -f $pure_testname*"); + print("Purify testfiles are: $pure_testname*\n") if $debug; + } +} + +exit !&toplevel; diff --git a/tests/scripts/features/comments b/tests/scripts/features/comments new file mode 100644 index 0000000..9257955 --- /dev/null +++ b/tests/scripts/features/comments @@ -0,0 +1,35 @@ +$description = "The following test creates a makefile to test comments\n" + ."and comment continuation to the next line using a \n" + ."backslash within makefiles."; + +$details = "To test comments within a makefile, a semi-colon was placed \n" + ."after a comment was started. This should not be reported as\n" + ."an error since it is within a comment. We then continue the \n" + ."comment to the next line using a backslash. To test whether\n" + ."the comment really continued, we place an echo command with some\n" + ."text on the line which should never execute since it should be \n" + ."within a comment\n"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<\EOF; +# Test comment vs semicolon parsing and line continuation +target: # this ; is just a comment \ + @echo This is within a comment. + @echo There should be no errors for this makefile. +EOF + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "There should be no errors for this makefile.\n"; + +# COMPARE RESULTS + +&compare_output($answer,&get_logfile(1)) diff --git a/tests/scripts/features/conditionals b/tests/scripts/features/conditionals new file mode 100644 index 0000000..2ece60b --- /dev/null +++ b/tests/scripts/features/conditionals @@ -0,0 +1,146 @@ +# -*-perl-*- +$description = "Check GNU make conditionals."; + +$details = "Attempt various different flavors of GNU make conditionals."; + +run_make_test(' +arg1 = first +arg2 = second +arg3 = third +arg4 = cc +arg5 = second + +all: +ifeq ($(arg1),$(arg2)) + @echo arg1 equals arg2 +else + @echo arg1 NOT equal arg2 +endif + +ifeq \'$(arg2)\' "$(arg5)" + @echo arg2 equals arg5 +else + @echo arg2 NOT equal arg5 +endif + +ifneq \'$(arg3)\' \'$(arg4)\' + @echo arg3 NOT equal arg4 +else + @echo arg3 equal arg4 +endif + +ifndef undefined + @echo variable is undefined +else + @echo variable undefined is defined +endif +ifdef arg4 + @echo arg4 is defined +else + @echo arg4 is NOT defined +endif', + '', + 'arg1 NOT equal arg2 +arg2 equals arg5 +arg3 NOT equal arg4 +variable is undefined +arg4 is defined'); + + +# Test expansion of variables inside ifdef. + +run_make_test(' +foo = 1 + +FOO = foo +F = f + +DEF = no +DEF2 = no + +ifdef $(FOO) +DEF = yes +endif + +ifdef $(F)oo +DEF2 = yes +endif + + +DEF3 = no +FUNC = $1 +ifdef $(call FUNC,DEF)3 + DEF3 = yes +endif + +all:; @echo DEF=$(DEF) DEF2=$(DEF2) DEF3=$(DEF3)', + '', + 'DEF=yes DEF2=yes DEF3=yes'); + + +# Test all the different "else if..." constructs + +run_make_test(' +arg1 = first +arg2 = second +arg3 = third +arg4 = cc +arg5 = fifth + +result = + +ifeq ($(arg1),$(arg2)) + result += arg1 equals arg2 +else ifeq \'$(arg2)\' "$(arg5)" + result += arg2 equals arg5 +else ifneq \'$(arg3)\' \'$(arg3)\' + result += arg3 NOT equal arg4 +else ifndef arg5 + result += variable is undefined +else ifdef undefined + result += arg4 is defined +else + result += success +endif + + +all: ; @echo $(result)', + '', + 'success'); + + +# Test some random "else if..." construct nesting + +run_make_test(' +arg1 = first +arg2 = second +arg3 = third +arg4 = cc +arg5 = second + +ifeq ($(arg1),$(arg2)) + $(info failed 1) +else ifeq \'$(arg2)\' "$(arg2)" + ifdef undefined + $(info failed 2) + else + $(info success) + endif +else ifneq \'$(arg3)\' \'$(arg3)\' + $(info failed 3) +else ifdef arg5 + $(info failed 4) +else ifdef undefined + $(info failed 5) +else + $(info failed 6) +endif + +.PHONY: all +all: ; @:', + '', + 'success'); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/default_names b/tests/scripts/features/default_names new file mode 100644 index 0000000..e53127e --- /dev/null +++ b/tests/scripts/features/default_names @@ -0,0 +1,41 @@ +# -*-perl-*- + +$description = "This script tests to make sure that Make looks for +default makefiles in the correct order (GNUmakefile,makefile,Makefile)"; + +# Create a makefile called "GNUmakefile" +$makefile = "GNUmakefile"; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE "FIRST: ; \@echo It chose GNUmakefile\n"; +close(MAKEFILE); + +# DOS/WIN32 platforms preserve case, but Makefile is the same file as makefile. +# Just test what we can here (avoid Makefile versus makefile test). + +if ($port_type eq 'UNIX') { + # Create another makefile called "makefile" + open(MAKEFILE,"> makefile"); + print MAKEFILE "SECOND: ; \@echo It chose makefile\n"; + close(MAKEFILE); +} + +# Create another makefile called "Makefile" +open(MAKEFILE,"> Makefile"); +print MAKEFILE "THIRD: ; \@echo It chose Makefile\n"; +close(MAKEFILE); + + +&run_make_with_options("","",&get_logfile); +&compare_output("It chose GNUmakefile\n",&get_logfile(1)); +unlink $makefile; + +if ($port_type eq 'UNIX') { + &run_make_with_options("","",&get_logfile); + &compare_output("It chose makefile\n",&get_logfile(1)); + unlink "makefile"; +} + +&run_make_with_options("","",&get_logfile); +&compare_output("It chose Makefile\n",&get_logfile(1)); +unlink "Makefile"; diff --git a/tests/scripts/features/double_colon b/tests/scripts/features/double_colon new file mode 100644 index 0000000..cad605d --- /dev/null +++ b/tests/scripts/features/double_colon @@ -0,0 +1,155 @@ +# -*-perl-*- +$description = "Test handling of double-colon rules."; + +$details = "\ +We test these features: + + - Multiple commands for the same (double-colon) target + - Different prerequisites for targets: only out-of-date + ones are rebuilt. + - Double-colon targets that aren't the goal target. + +Then we do the same thing for parallel builds: double-colon +targets should always be built serially."; + +# The Contents of the MAKEFILE ... + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; + +all: baz + +foo:: f1.h ; @echo foo FIRST +foo:: f2.h ; @echo foo SECOND + +bar:: ; @echo aaa; sleep 1; echo aaa done +bar:: ; @echo bbb + +baz:: ; @echo aaa +baz:: ; @echo bbb + +biz:: ; @echo aaa +biz:: two ; @echo bbb + +two: ; @echo two + +f1.h f2.h: ; @echo $@ + +d :: ; @echo ok +d :: d ; @echo oops + +EOF + +close(MAKEFILE); + +# TEST 0: A simple double-colon rule that isn't the goal target. + +&run_make_with_options($makefile, "all", &get_logfile, 0); +$answer = "aaa\nbbb\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 1: As above, in parallel + +if ($parallel_jobs) { + &run_make_with_options($makefile, "-j10 all", &get_logfile, 0); + $answer = "aaa\nbbb\n"; + &compare_output($answer, &get_logfile(1)); +} + +# TEST 2: A simple double-colon rule that is the goal target + +&run_make_with_options($makefile, "bar", &get_logfile, 0); +$answer = "aaa\naaa done\nbbb\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 3: As above, in parallel + +if ($parallel_jobs) { + &run_make_with_options($makefile, "-j10 bar", &get_logfile, 0); + $answer = "aaa\naaa done\nbbb\n"; + &compare_output($answer, &get_logfile(1)); +} + +# TEST 4: Each double-colon rule is supposed to be run individually + +&utouch(-5, 'f2.h'); +&touch('foo'); + +&run_make_with_options($makefile, "foo", &get_logfile, 0); +$answer = "f1.h\nfoo FIRST\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 5: Again, in parallel. + +if ($parallel_jobs) { + &run_make_with_options($makefile, "-j10 foo", &get_logfile, 0); + $answer = "f1.h\nfoo FIRST\n"; + &compare_output($answer, &get_logfile(1)); +} + +# TEST 6: Each double-colon rule is supposed to be run individually + +&utouch(-5, 'f1.h'); +unlink('f2.h'); +&touch('foo'); + +&run_make_with_options($makefile, "foo", &get_logfile, 0); +$answer = "f2.h\nfoo SECOND\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 7: Again, in parallel. + +if ($parallel_jobs) { + &run_make_with_options($makefile, "-j10 foo", &get_logfile, 0); + $answer = "f2.h\nfoo SECOND\n"; + &compare_output($answer, &get_logfile(1)); +} + +# TEST 8: Test circular dependency check; PR/1671 + +&run_make_with_options($makefile, "d", &get_logfile, 0); +$answer = "ok\n$make_name: Circular d <- d dependency dropped.\noops\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 8: I don't grok why this is different than the above, but it is... +# +# Hmm... further testing indicates this might be timing-dependent? +# +#if ($parallel_jobs) { +# &run_make_with_options($makefile, "-j10 biz", &get_logfile, 0); +# $answer = "aaa\ntwo\nbbb\n"; +# &compare_output($answer, &get_logfile(1)); +#} + +unlink('foo','f1.h','f2.h'); + + +# TEST 9: make sure all rules in s double colon family get executed +# (Savannah bug #14334). +# + +&touch('one'); +&touch('two'); + +run_make_test(' +.PHONY: all +all: result + +result:: one + @echo $^ >>$@ + @echo $^ + +result:: two + @echo $^ >>$@ + @echo $^ + +', +'', +'one +two'); + +unlink('result','one','two'); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/echoing b/tests/scripts/features/echoing new file mode 100644 index 0000000..40debf5 --- /dev/null +++ b/tests/scripts/features/echoing @@ -0,0 +1,64 @@ +# -*-perl-*- +$description = "The following test creates a makefile to test command +echoing. It tests that when a command line starts with +a '\@', the echoing of that line is suppressed. It also +tests the -n option which tells make to ONLY echo the +commands and no execution happens. In this case, even +the commands with '\@' are printed. Lastly, it tests the +-s flag which tells make to prevent all echoing, as if +all commands started with a '\@'."; + +$details = "This test is similar to the 'clean' test except that a '\@' has +been placed in front of the delete command line. Four tests +are run here. First, make is run normally and the first echo +command should be executed. In this case there is no '\@' so +we should expect make to display the command AND display the +echoed message. Secondly, make is run with the clean target, +but since there is a '\@' at the beginning of the command, we +expect no output; just the deletion of a file which we check +for. Third, we give the clean target again except this time +we give make the -n option. We now expect the command to be +displayed but not to be executed. In this case we need only +to check the output since an error message would be displayed +if it actually tried to run the delete command again and the +file didn't exist. Lastly, we run the first test again with +the -s option and check that make did not echo the echo +command before printing the message.\n"; + +$example = "EXAMPLE_FILE"; + +touch($example); + +# TEST #1 +# ------- + +run_make_test(" +all: +\techo This makefile did not clean the dir... good +clean: +\t\@$delete_command $example\n", + '', 'echo This makefile did not clean the dir... good +This makefile did not clean the dir... good'); + +# TEST #2 +# ------- + +run_make_test(undef, 'clean', ''); +if (-f $example) { + $test_passed = 0; + unlink($example); +} + +# TEST #3 +# ------- + +run_make_test(undef, '-n clean', "$delete_command $example\n"); + + +# TEST #4 +# ------- + +run_make_test(undef, '-s', "This makefile did not clean the dir... good\n"); + + +1; diff --git a/tests/scripts/features/errors b/tests/scripts/features/errors new file mode 100644 index 0000000..e372fe0 --- /dev/null +++ b/tests/scripts/features/errors @@ -0,0 +1,92 @@ +# -*-perl-*- + +$description = "The following tests the -i option and the '-' in front of \n" + ."commands to test that make ignores errors in these commands\n" + ."and continues processing."; + +$details = "This test runs two makes. The first runs on a target with a \n" + ."command that has a '-' in front of it (and a command that is \n" + ."intended to fail) and then a delete command after that is \n" + ."intended to succeed. If make ignores the failure of the first\n" + ."command as it is supposed to, then the second command should \n" + ."delete a file and this is what we check for. The second make\n" + ."that is run in this test is identical except that the make \n" + ."command is given with the -i option instead of the '-' in \n" + ."front of the command. They should run the same. "; + +if ($vos) +{ + $rm_command = "delete_file"; +} +else +{ + $rm_command = "rm"; +} + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "clean:\n" + ."\t-$rm_command cleanit\n" + ."\t$rm_command foo\n" + ."clean2: \n" + ."\t$rm_command cleanit\n" + ."\t$rm_command foo\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch("foo"); + +unlink("cleanit"); +$cleanit_error = `sh -c "$rm_command cleanit 2>&1"`; +$delete_error_code = $? >> 8; + +# TEST #1 +# ------- + +$answer = "$rm_command cleanit\n" + . $cleanit_error + ."$make_name: [clean] Error $delete_error_code (ignored)\n" + ."$rm_command foo\n"; + +&run_make_with_options($makefile,"",&get_logfile); + +# If make acted as planned, it should ignore the error from the first +# command in the target and execute the second which deletes the file "foo" +# This file, therefore, should not exist if the test PASSES. +if (-f "foo") { + $test_passed = 0; +} + +# The output for this on VOS is too hard to replicate, so we only check it +# on unix. +if (!$vos) +{ + &compare_output($answer,&get_logfile(1)); +} + + +&touch("foo"); + +# TEST #2 +# ------- + +$answer = "$rm_command cleanit\n" + . $cleanit_error + ."$make_name: [clean2] Error $delete_error_code (ignored)\n" + ."$rm_command foo\n"; + +&run_make_with_options($makefile,"clean2 -i",&get_logfile); + +if (-f "foo") { + $test_passed = 0; +} + +if (!$vos) { + &compare_output($answer,&get_logfile(1)); +} + +1; diff --git a/tests/scripts/features/escape b/tests/scripts/features/escape new file mode 100644 index 0000000..97a2994 --- /dev/null +++ b/tests/scripts/features/escape @@ -0,0 +1,58 @@ +# -*-perl-*- +$description = "Test various types of escaping in makefiles."; + +$details = "\ +Make sure that escaping of `:' works in target names. +Make sure escaping of whitespace works in target names. +Make sure that escaping of '#' works."; + + +close(MAKEFILE); + + +# TEST 1 + +run_make_test(' +$(path)foo : ; @echo "touch ($@)" + +foo\ bar: ; @echo "touch ($@)" + +sharp: foo\#bar.ext +foo\#bar.ext: ; @echo "foo#bar.ext = ($@)"', + '', + 'touch (foo)'); + +# TEST 2: This one should fail, since the ":" is unquoted. + +run_make_test(undef, + 'path=pre:', + "#MAKEFILE#:2: *** target pattern contains no `%'. Stop.", + 512); + +# TEST 3: This one should work, since we escape the ":". + +run_make_test(undef, + "'path=pre\\:'", + 'touch (pre:foo)'); + +# TEST 4: This one should fail, since the escape char is escaped. + +run_make_test(undef, + "'path=pre\\\\:'", + "#MAKEFILE#:2: *** target pattern contains no `%'. Stop.", + 512); + +# TEST 5: This one should work + +run_make_test(undef, + "'foo bar'", + 'touch (foo bar)'); + +# TEST 6: Test escaped comments + +run_make_test(undef, + 'sharp', + 'foo#bar.ext = (foo#bar.ext)'); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/export b/tests/scripts/features/export new file mode 100644 index 0000000..81bff0c --- /dev/null +++ b/tests/scripts/features/export @@ -0,0 +1,186 @@ +# -*-perl-*- +$description = "Check GNU make export/unexport commands."; + +$details = ""; + +# The test driver cleans out our environment for us so we don't have to worry +# about that here. + +&run_make_test(' +FOO = foo +BAR = bar +BOZ = boz + +export BAZ = baz +export BOZ + +BITZ = bitz +BOTZ = botz + +export BITZ BOTZ +unexport BOTZ + +ifdef EXPORT_ALL +export +endif + +ifdef UNEXPORT_ALL +unexport +endif + +ifdef EXPORT_ALL_PSEUDO +.EXPORT_ALL_VARIABLES: +endif + +all: + @echo "FOO=$(FOO) BAR=$(BAR) BAZ=$(BAZ) BOZ=$(BOZ) BITZ=$(BITZ) BOTZ=$(BOTZ)" + @echo "FOO=$$FOO BAR=$$BAR BAZ=$$BAZ BOZ=$$BOZ BITZ=$$BITZ BOTZ=$$BOTZ" +', + '', "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO= BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 1: make sure vars inherited from the parent are exported + +$extraENV{FOO} = 1; + +&run_make_test(undef, '', "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO=foo BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 2: global export. Explicit unexport takes precedence. + +run_make_test(undef, "EXPORT_ALL=1" , + "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 3: global unexport. Explicit export takes precedence. + +&run_make_test(undef, "UNEXPORT_ALL=1", + "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO= BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 4: both: in the above makefile the unexport comes last so that rules. + +&run_make_test(undef, "EXPORT_ALL=1 UNEXPORT_ALL=1", + "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO= BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 5: test the pseudo target. + +&run_make_test(undef, "EXPORT_ALL_PSEUDO=1", + "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz +FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"); + +# TEST 6: Test the expansion of variables inside export + +&run_make_test(' +foo = f-ok +bar = b-ok + +FOO = foo +F = f + +BAR = bar +B = b + +export $(FOO) +export $(B)ar + +all: + @echo foo=$(foo) bar=$(bar) + @echo foo=$$foo bar=$$bar +', + "", "foo=f-ok bar=b-ok\nfoo=f-ok bar=b-ok\n"); + +# TEST 7: Test the expansion of variables inside unexport + +&run_make_test(' +foo = f-ok +bar = b-ok + +FOO = foo +F = f + +BAR = bar +B = b + +export foo bar + +unexport $(FOO) +unexport $(B)ar + +all: + @echo foo=$(foo) bar=$(bar) + @echo foo=$$foo bar=$$bar +', + '', "foo=f-ok bar=b-ok\nfoo= bar=\n"); + +# TEST 7: Test exporting multiple variables on the same line + +&run_make_test(' +A = a +B = b +C = c +D = d +E = e +F = f +G = g +H = h +I = i +J = j + +SOME = A B C + +export F G H I J + +export D E $(SOME) + +all: ; @echo A=$$A B=$$B C=$$C D=$$D E=$$E F=$$F G=$$G H=$$H I=$$I J=$$J +', + '', "A=a B=b C=c D=d E=e F=f G=g H=h I=i J=j\n"); + +# TEST 8: Test unexporting multiple variables on the same line + +@extraENV{qw(A B C D E F G H I J)} = qw(1 2 3 4 5 6 7 8 9 10); + +&run_make_test(' +A = a +B = b +C = c +D = d +E = e +F = f +G = g +H = h +I = i +J = j + +SOME = A B C + +unexport F G H I J + +unexport D E $(SOME) + +all: ; @echo A=$$A B=$$B C=$$C D=$$D E=$$E F=$$F G=$$G H=$$H I=$$I J=$$J +', + '', "A= B= C= D= E= F= G= H= I= J=\n"); + +# TEST 9: Check setting a variable named "export" + +&run_make_test(' +export = 123 +export export +export export = 456 +a: ; @echo "\$$(export)=$(export) / \$$export=$$export" +', + '', "\$(export)=456 / \$export=456\n"); + +# TEST 9: Check "export" as a target + +&run_make_test(' +a: export +export: ; @echo "$@" +', + '', "export\n"); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/include b/tests/scripts/features/include new file mode 100644 index 0000000..ba8908c --- /dev/null +++ b/tests/scripts/features/include @@ -0,0 +1,179 @@ +# -*-mode: perl; rm-trailing-spaces: nil-*- + +$description = "Test various forms of the GNU make `include' command."; + +$details = "\ +Test include, -include, sinclude and various regressions involving them. +Test extra whitespace at the end of the include, multiple -includes and +sincludes (should not give an error) and make sure that errors are reported +for targets that were also -included."; + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); + +# The contents of the Makefile ... + +print MAKEFILE < $makefile2"); + +print MAKEFILE "ANOTHER: ; \@echo This is another included makefile\n"; + +close(MAKEFILE); + +# Create the answer to what should be produced by this Makefile +&run_make_with_options($makefile, "all", &get_logfile); +$answer = "There should be no errors for this makefile.\n"; +&compare_output($answer, &get_logfile(1)); + +&run_make_with_options($makefile, "ANOTHER", &get_logfile); +$answer = "This is another included makefile\n"; +&compare_output($answer, &get_logfile(1)); + +$makefile = undef; + +# Try to build the "error" target; this will fail since we don't know +# how to create makeit.mk, but we should also get a message (even though +# the -include suppressed it during the makefile read phase, we should +# see one during the makefile run phase). + +run_make_test + (' +-include foo.mk +error: foo.mk ; @echo $@ +', + '', + "#MAKE#: *** No rule to make target `foo.mk', needed by `error'. Stop.\n", + 512 + ); + +# Make sure that target-specific variables don't impact things. This could +# happen because a file record is created when a target-specific variable is +# set. + +run_make_test + (' +bar.mk: foo := baz +-include bar.mk +hello: ; @echo hello +', + '', + "hello\n" + ); + + +# Test inheritance of dontcare flag when rebuilding makefiles. +# +run_make_test(' +.PHONY: all +all: ; @: + +-include foo + +foo: bar; @: +', '', ''); + + +# Make sure that we don't die when the command fails but we dontcare. +# (Savannah bug #13216). +# +run_make_test(' +.PHONY: all +all:; @: + +-include foo + +foo: bar; @: + +bar:; @exit 1 +', '', ''); + +# Check include, sinclude, -include with no filenames. +# (Savannah bug #1761). + +run_make_test(' +.PHONY: all +all:; @: +include +-include +sinclude', '', ''); + + +# Test that the diagnostics is issued even if the target has been +# tried before with the dontcare flag (direct dependency case). +# +run_make_test(' +-include foo + +all: bar + +foo: baz +bar: baz +', +'', +"#MAKE#: *** No rule to make target `baz', needed by `bar'. Stop.\n", +512); + +# Test that the diagnostics is issued even if the target has been +# tried before with the dontcare flag (indirect dependency case). +# +run_make_test(' +-include foo + +all: bar + +foo: baz +bar: baz +baz: end +', +'', +"#MAKE#: *** No rule to make target `end', needed by `baz'. Stop.\n", +512); + +# Test that the diagnostics is issued even if the target has been +# tried before with the dontcare flag (include/-include case). +# +run_make_test(' +include bar +-include foo + +all: + +foo: baz +bar: baz +baz: end +', +'', +"#MAKEFILE#:2: bar: No such file or directory +#MAKE#: *** No rule to make target `end', needed by `baz'. Stop.\n", +512); + +if ($all_tests) { + # Test that include of a rebuild-able file doesn't show a warning + # Savannah bug #102 + run_make_test(q! +include foo +foo: ; @echo foo = bar > $@ +!, + '', "#MAKE#: `foo' is up to date.\n"); + rmfiles('foo'); +} + +1; diff --git a/tests/scripts/features/mult_rules b/tests/scripts/features/mult_rules new file mode 100644 index 0000000..6f120f1 --- /dev/null +++ b/tests/scripts/features/mult_rules @@ -0,0 +1,78 @@ +$description = "\ +The following test creates a makefile to test the presence +of multiple rules for one target. One file can be the +target of several rules if at most one rule has commands; +the other rules can only have dependencies."; + +$details = "\ +The makefile created in this test contains two hardcoded rules +for foo.o and bar.o. It then gives another multiple target rule +with the same names as above but adding more dependencies. +Additionally, another variable extradeps is listed as a +dependency but is defined to be null. It can however be defined +on the make command line as extradeps=extra.h which adds yet +another dependency to the targets."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE < $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "bigoutput littleoutput: test.h\n"; +print MAKEFILE "\t\@echo I am \$(subst output,,\$@)\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch("test.h"); + +&run_make_with_options($makefile,"bigoutput",&get_logfile); + + +# Create the answer to what should be produced by this Makefile +$answer = "I am big\n"; + +&compare_output($answer,&get_logfile(1)); + +&run_make_with_options($makefile,"littleoutput",&get_logfile); +$answer = "I am little\n"; +&compare_output($answer,&get_logfile(1)); + +unlink "test.h"; + +1; + + + + + + diff --git a/tests/scripts/features/order_only b/tests/scripts/features/order_only new file mode 100644 index 0000000..4ebdc2b --- /dev/null +++ b/tests/scripts/features/order_only @@ -0,0 +1,118 @@ +# -*-perl-*- +$description = "Test order-only prerequisites."; + +$details = "\ +Create makefiles with various combinations of normal and order-only +prerequisites and ensure they behave properly. Test the \$| variable."; + +# TEST #0 -- Basics + +run_make_test(' +%r: | baz ; @echo $< $^ $| +bar: foo +foo:;@: +baz:;@:', + '', "foo foo baz\n"); + +# TEST #1 -- First try: the order-only prereqs need to be built. + +run_make_test(q! +foo: bar | baz + @echo '$$^ = $^' + @echo '$$| = $|' + touch $@ + +.PHONY: baz + +bar baz: + touch $@!, + '', "touch bar\ntouch baz\n\$^ = bar\n\$| = baz\ntouch foo\n"); + + +# TEST #2 -- now we do it again: baz is PHONY but foo should _NOT_ be updated + +run_make_test(undef, '', "touch baz\n"); + +unlink(qw(foo bar baz)); + +# TEST #3 -- Make sure the order-only prereq was promoted to normal. + +run_make_test(q! +foo: bar | baz + @echo '$$^ = $^' + @echo '$$| = $|' + touch $@ + +foo: baz + +.PHONY: baz + +bar baz: + touch $@!, + '', "touch bar\ntouch baz\n\$^ = bar baz\n\$| = \ntouch foo\n"); + + +# TEST #4 -- now we do it again + +run_make_test(undef, '', "touch baz\n\$^ = bar baz\n\$| = \ntouch foo\n"); + +unlink(qw(foo bar baz)); + +# Test empty normal prereqs + +# TEST #5 -- make sure the parser was correct. + +run_make_test(q! +foo:| baz + @echo '$$^ = $^' + @echo '$$| = $|' + touch $@ + +.PHONY: baz + +baz: + touch $@!, + '', "touch baz\n\$^ = \n\$| = baz\ntouch foo\n"); + +# TEST #6 -- now we do it again: this time foo won't be built + +run_make_test(undef, '', "touch baz\n"); + +unlink(qw(foo baz)); + +# Test order-only in pattern rules + +# TEST #7 -- make sure the parser was correct. + +run_make_test(q! +%.w : %.x | baz + @echo '$$^ = $^' + @echo '$$| = $|' + touch $@ + +all: foo.w + +.PHONY: baz +foo.x baz: + touch $@!, + '', + "touch foo.x\ntouch baz\n\$^ = foo.x\n\$| = baz\ntouch foo.w\n"); + +# TEST #8 -- now we do it again: this time foo.w won't be built + +run_make_test(undef, '', "touch baz\n"); + +unlink(qw(foo.w foo.x baz)); + +# TEST #9 -- make sure that $< is set correctly in the face of order-only +# prerequisites in pattern rules. + +run_make_test(' +%r: | baz ; @echo $< $^ $| +bar: foo +foo:;@: +baz:;@:', + '', "foo foo baz\n"); + + +1; diff --git a/tests/scripts/features/override b/tests/scripts/features/override new file mode 100644 index 0000000..fff6c4e --- /dev/null +++ b/tests/scripts/features/override @@ -0,0 +1,45 @@ +# -*-perl-*- + +$description = "Test the override directive on variable assignments."; + +$details = ""; + +# TEST 0: Basic override + +run_make_test(' +X = start +override recur = $(X) +override simple := $(X) +X = end +all: ; @echo "$(recur) $(simple)" +', + 'recur=I simple=J', "end start\n"); + +# TEST 1: Override with append + +run_make_test(' +X += X1 +override X += X2 +override Y += Y1 +Y += Y2 +all: ; @echo "$(X) $(Y)" +', + '', "X1 X2 Y1\n"); + +# TEST 2: Override with append to the command line + +run_make_test(undef, 'X=C Y=C', "C X2 C Y1\n"); + +# Test override of define/endef + +run_make_test(' +override define foo +@echo First comes the definition. +@echo Then comes the override. +endef +all: ; $(foo) +', + 'foo=Hello', "First comes the definition.\nThen comes the override.\n"); + + +1; diff --git a/tests/scripts/features/parallelism b/tests/scripts/features/parallelism new file mode 100644 index 0000000..cc0f84f --- /dev/null +++ b/tests/scripts/features/parallelism @@ -0,0 +1,254 @@ +# -*-perl-*- + +$description = "Test parallelism (-j) option."; + + +$details = "This test creates a makefile with two double-colon default +rules. The first rule has a series of sleep and echo commands +intended to run in series. The second and third have just an +echo statement. When make is called in this test, it is given +the -j option with a value of 4. This tells make that it may +start up to four jobs simultaneously. In this case, since the +first command is a sleep command, the output of the second +and third commands will appear before the first if indeed +make is running all of these commands in parallel."; + +if (!$parallel_jobs) { + return -1; +} + +if ($vos) { + $sleep_command = "sleep -seconds"; +} +else { + $sleep_command = "sleep"; +} + + +run_make_test(" +all : def_1 def_2 def_3 +def_1 : ; \@echo ONE; $sleep_command 3 ; echo TWO +def_2 : ; \@$sleep_command 2 ; echo THREE +def_3 : ; \@$sleep_command 1 ; echo FOUR", + '-j4', "ONE\nFOUR\nTHREE\nTWO"); + +# Test parallelism with included files. Here we sleep/echo while +# building the included files, to test that they are being built in +# parallel. +run_make_test(" +all: 1 2; \@echo success +-include 1.inc 2.inc +1.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@ +2.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@", + "-j4", + "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n"); + +rmfiles(qw(1.inc 2.inc)); + + +# Test parallelism with included files--this time recurse first and make +# sure the jobserver works. +run_make_test(" +recurse: ; \@\$(MAKE) --no-print-directory -f #MAKEFILE# INC=yes all +all: 1 2; \@echo success + +INC = no +ifeq (\$(INC),yes) +-include 1.inc 2.inc +endif + +1.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@ +2.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@", + "-j4", + "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n"); + +rmfiles(qw(1.inc 2.inc)); + +# Grant Taylor reports a problem where tokens can be lost (not written back +# to the pipe when they should be): this happened when there is a $(shell ...) +# function in an exported recursive variable. I added some code to check +# for this situation and print a message if it occurred. This test used +# to trigger this code when I added it but no longer does after the fix. +# We have to increase the timeout from the default (5s) on this test. + +run_make_test(" +export HI = \$(shell \$(\$\@.CMD)) +first.CMD = echo hi +second.CMD = $sleep_command 4; echo hi + +.PHONY: all first second +all: first second + +first second: ; \@echo \$\@; $sleep_command 1; echo \$\@", + '-j2', "first\nfirst\nsecond\nsecond", 0, 7); + +# Michael Matz reported a bug where if make is running in +# parallel without -k and two jobs die in a row, but not too close to each +# other, then make will quit without waiting for the rest of the jobs to die. + +run_make_test(" +.PHONY: all fail.1 fail.2 fail.3 ok +all: fail.1 ok fail.2 fail.3 + +fail.1 fail.2 fail.3: + \@sleep \$(patsubst fail.%,%,\$\@) + \@echo Fail + \@exit 1 + +ok: + \@sleep 4 + \@echo Ok done", + '-rR -j5', 'Fail +#MAKE#: *** [fail.1] Error 1 +#MAKE#: *** Waiting for unfinished jobs.... +Fail +#MAKE#: *** [fail.2] Error 1 +Fail +#MAKE#: *** [fail.3] Error 1 +Ok done', + 512); + + +# Test for Savannah bug #15641. +# +run_make_test(' +.PHONY: all +all:; @: + +-include foo.d + +foo.d: comp + @echo building $@ + +comp: mod_a.o mod_b.o; @: + +mod_a.o mod_b.o: + @exit 1 +', '-j2', ''); + + +# TEST #9 -- Savannah bugs 3330 and 15919 +# In earlier versions of make this will either give the wrong answer, or hang. + +utouch(-10, 'target'); +run_make_test('target: intermed ; touch $@ + +.INTERMEDIATE: intermed +intermed: | phony ; touch $@ + +.PHONY: phony +phony: ; : phony', '-rR -j', ': phony'); +rmfiles('target'); + +# TEST #10: Don't put --jobserver-fds into a re-exec'd MAKEFLAGS. +# We can't test this directly because there's no way a makefile can +# show the value of MAKEFLAGS we were re-exec'd with. We can intuit it +# by looking for "disabling jobserver mode" warnings; we should only +# get one from the original invocation and none from the re-exec. +# See Savannah bug #18124 + +run_make_test(q! +-include inc.mk +recur: +# @echo 'MAKEFLAGS = $(MAKEFLAGS)' + @rm -f inc.mk + @$(MAKE) -j2 -f #MAKEFILE# all +all: +# @echo 'MAKEFLAGS = $(MAKEFLAGS)' + @echo $@ +inc.mk: +# @echo 'MAKEFLAGS = $(MAKEFLAGS)' + @echo 'FOO = bar' > $@ +!, + '--no-print-directory -j2', "#MAKE#[1]: warning: -jN forced in submake: disabling jobserver mode.\nall\n"); + +rmfiles('inc.mk'); + +if ($all_tests) { + # Implicit files aren't properly recreated during parallel builds + # Savannah bug #26864 + + # The first run works fine + run_make_test(q! +%.bar: %.x foo.y ; cat $^ > $@ +%.x: ; touch $@ +foo.y: foo.y.in ; cp $< $@ +foo.y.in: ; touch $@ +!, + '-j2 main.bar', + "touch foo.y.in +touch main.x +cp foo.y.in foo.y +cat main.x foo.y > main.bar +rm main.x"); + + # Now we touch the .in file and make sure it still works + touch('foo.y.in'); + + run_make_test(undef, '-j2 main.bar', "cp foo.y.in foo.y +touch main.x +cat main.x foo.y > main.bar +rm main.x"); + + # Clean up + rmfiles(qw(foo.y foo.y.in main.bar)); +} + +if ($all_tests) { + # Jobserver FD handling is messed up in some way. + # Savannah bug #28189 + # It doesn't look like that bug anymore but this is the code it runs + + run_make_test(q! +ifdef EXTRA +vpath %.dst / +xxx.dst: ; true +yyy.dst: ; true +endif + +M := $(MAKE) +xx: ; $M --no-print-directory -j2 -f $(MAKEFILE_LIST) xxx.dst yyy.dst EXTRA=1 +!, + '-j2', + '#MAKE#[1]: warning: -jN forced in submake: disabling jobserver mode. +true +true +'); +} + +# Make sure that all jobserver FDs are closed if we need to re-exec the +# master copy. +# +# First, find the "default" file descriptors we normally use +# Then make sure they're still used. +# +# Right now we don't have a way to run a makefile and capture the output +# without checking it, so we can't really write this test. + +# run_make_test(' +# submake: ; @$(MAKE) --no-print-directory -f #MAKEFILE# fdprint 5>output + +# dependfile: ; @echo FOO=bar > $@ + +# INCL := true + +# FOO=foo +# ifeq ($(INCL),true) +# -include dependfile +# endif + +# fdprint: ; @echo $(filter --jobserver%,$(MAKEFLAGS)) + +# recurse: ; @$(MAKE) --no-print-directory -f #MAKEFILE# submake INCL=true', +# '-j2 INCL=false fdprint', +# 'bar'); + +# rmfiles(qw(dependfile output)); + + +# # Do it again, this time where the include is done by the non-master make. +# run_make_test(undef, '-j2 recurse INCL=false', 'bar'); + +# rmfiles(qw(dependfile output)); + +1; diff --git a/tests/scripts/features/patspecific_vars b/tests/scripts/features/patspecific_vars new file mode 100644 index 0000000..8ca228d --- /dev/null +++ b/tests/scripts/features/patspecific_vars @@ -0,0 +1,148 @@ +# -*-perl-*- +$description = "Test pattern-specific variable settings."; + +$details = "\ +Create a makefile containing various flavors of pattern-specific variable +settings, override and non-override, and using various variable expansion +rules, semicolon interference, etc."; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +all: one.x two.x three.x +FOO = foo +BAR = bar +BAZ = baz +one.x: override FOO = one +%.x: BAR = two +t%.x: BAR = four +thr% : override BAZ = three +one.x two.x three.x: ; @echo $@: $(FOO) $(BAR) $(BAZ) +four.x: baz ; @echo $@: $(FOO) $(BAR) $(BAZ) +baz: ; @echo $@: $(FOO) $(BAR) $(BAZ) + +# test matching multiple patterns +a%: AAA = aaa +%b: BBB = ccc +a%: BBB += ddd +%b: AAA ?= xxx +%b: AAA += bbb +.PHONY: ab +ab: ; @echo $(AAA); echo $(BBB) +EOF + +close(MAKEFILE); + + +# TEST #1 -- basics + +&run_make_with_options($makefile, "", &get_logfile); +$answer = "one.x: one two baz\ntwo.x: foo four baz\nthree.x: foo four three\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST #2 -- try the override feature + +&run_make_with_options($makefile, "BAZ=five", &get_logfile); +$answer = "one.x: one two five\ntwo.x: foo four five\nthree.x: foo four three\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST #3 -- make sure patterns are inherited properly + +&run_make_with_options($makefile, "four.x", &get_logfile); +$answer = "baz: foo two baz\nfour.x: foo two baz\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST #4 -- test multiple patterns matching the same target + +&run_make_with_options($makefile, "ab", &get_logfile); +$answer = "aaa bbb\nccc ddd\n"; +&compare_output($answer,&get_logfile(1)); + +# TEST #5 -- test pattern-specific exported variables +# +run_make_test(' +/%: export foo := foo + +/bar: + @echo $(foo) $$foo +', '', 'foo foo'); + + +# TEST #6 -- test expansion of pattern-specific simple variables +# +run_make_test(' +.PHONY: all + +all: inherit := good $$t +all: bar baz + +b%: pattern := good $$t + +global := orginal $$t + + +# normal target +# +ifdef rec +bar: a = global: $(global) pattern: $(pattern) inherit: $(inherit) +else +bar: a := global: $(global) pattern: $(pattern) inherit: $(inherit) +endif + +bar: ; @echo \'normal: $a;\' + + +# pattern target +# +ifdef rec +%z: a = global: $(global) pattern: $(pattern) inherit: $(inherit) +else +%z: a := global: $(global) pattern: $(pattern) inherit: $(inherit) +endif + +%z: ; @echo \'pattrn: $a;\' + + +global := new $$t +', +'', +'normal: global: orginal $t pattern: inherit: ; +pattrn: global: orginal $t pattern: inherit: ;'); + + +# TEST #7 -- test expansion of pattern-specific recursive variables +# +run_make_test(undef, # reuse previous makefile +'rec=1', +'normal: global: new $t pattern: good $t inherit: good $t; +pattrn: global: new $t pattern: good $t inherit: good $t;'); + +# TEST #8: override in pattern-specific variables + +run_make_test(' +a%: override FOO += f1 +a%: FOO += f2 +ab: ; @echo "$(FOO)" +', + '', "f1\n"); + +run_make_test(undef, 'FOO=C', "C f1\n"); + +# TEST #9: Test shortest stem selection in pattern-specific variables. + +run_make_test(' +%-mt.x: x := two +%.x: x := one + +all: foo.x foo-mt.x + +foo.x: ;@echo $x +foo-mt.x: ;@echo $x +', +'', +"one\ntwo"); + +1; diff --git a/tests/scripts/features/patternrules b/tests/scripts/features/patternrules new file mode 100644 index 0000000..eebe7c0 --- /dev/null +++ b/tests/scripts/features/patternrules @@ -0,0 +1,224 @@ +# -*-perl-*- + +$description = "Test pattern rules."; + +$details = ""; + +use Cwd; + +$dir = cwd; +$dir =~ s,.*/([^/]+)$,../$1,; + + +# TEST #0: Make sure that multiple patterns where the same target +# can be built are searched even if the first one fails +# to match properly. +# + +run_make_test(q! +.PHONY: all + +all: case.1 case.2 case.3 + +# We can't have this, due to "Implicit Rule Search Algorithm" step 5c +#xxx: void + +# 1 - existing file +%.1: void + @exit 1 +%.1: #MAKEFILE# + @exit 0 + +# 2 - phony +%.2: void + @exit 1 +%.2: 2.phony + @exit 0 +.PHONY: 2.phony + +# 3 - implicit-phony +%.3: void + @exit 1 +%.3: 3.implicit-phony + @exit 0 + +3.implicit-phony: +!, '', ''); + +# TEST #1: make sure files that are built via implicit rules are marked +# as targets (Savannah bug #12202). +# +run_make_test(' +TARGETS := foo foo.out + +.PHONY: all foo.in + +all: $(TARGETS) + +%: %.in + @echo $@ + +%.out: % + @echo $@ + +foo.in: ; @: + +', +'', +'foo +foo.out'); + + +# TEST #2: make sure intermediate files that also happened to be +# prerequisites are not removed (Savannah bug #12267). +# +run_make_test(' +$(dir)/foo.o: + +$(dir)/foo.y: + @echo $@ + +%.c: %.y + touch $@ + +%.o: %.c + @echo $@ + +.PHONY: install +install: $(dir)/foo.c + +', +"dir=$dir", +"$dir/foo.y +touch $dir/foo.c +$dir/foo.o"); + +unlink("$dir/foo.c"); + + +# TEST #3: make sure precious flag is set properly for targets +# that are built via implicit rules (Savannah bug #13218). +# +run_make_test(' +.DELETE_ON_ERROR: + +.PRECIOUS: %.bar + +%.bar:; @touch $@ && exit 1 + +$(dir)/foo.bar: + +', +"dir=$dir", +"#MAKE#: *** [$dir/foo.bar] Error 1", +512); + +unlink("$dir/foo.bar"); + + +# TEST #4: make sure targets of a matched implicit pattern rule are +# never considered intermediate (Savannah bug #13022). +# +run_make_test(' +.PHONY: all +all: foo.c foo.o + +%.h %.c: %.in + touch $*.h + touch $*.c + +%.o: %.c %.h + echo $+ >$@ + +%.o: %.c + @echo wrong rule + +foo.in: + touch $@ + +', +'', +'touch foo.in +touch foo.h +touch foo.c +echo foo.c foo.h >foo.o'); + +unlink('foo.in', 'foo.h', 'foo.c', 'foo.o'); + +# TEST #5: make sure both prefix and suffix patterns work with multiple +# target patterns (Savannah bug #26593). +# +run_make_test(' +all: foo.s1 foo.s2 p1.foo p2.foo + +p1.% p2.%: %.orig + @echo $@ +%.s1 %.s2: %.orig + @echo $@ + +.PHONY: foo.orig +', + '', "foo.s1\np1.foo\n"); + +# TEST 6: Make sure that non-target files are still eligible to be created +# as part of implicit rule chaining. Savannah bug #17752. + +run_make_test(q! +BIN = xyz +COPY = $(BIN).cp +SRC = $(BIN).c +allbroken: $(COPY) $(BIN) ; @echo ok +$(SRC): ; @echo 'main(){}' > $@ +%.cp: % ; @cp $< $@ +% : %.c ; @cp $< $@ +clean: ; @rm -rf $(SRC) $(COPY) $(BIN) +!, + '', "ok\n"); + +unlink(qw(xyz xyz.cp xyz.c)); + +# TEST 7: Make sure that all prereqs of all "also_make" targets get created +# before any of the things that depend on any of them. Savannah bug #19108. + +run_make_test(q! +final: x ; @echo $@ +x: x.t1 x.t2 ; @echo $@ +x.t2: dep +dep: ; @echo $@ +%.t1 %.t2: ; @echo $*.t1 ; echo $*.t2 +!, + '', "dep\nx.t1\nx.t2\nx\nfinal\n"); + + +# TEST 8: Verify we can remove pattern rules. Savannah bug #18622. + +my @f = (qw(foo.w foo.ch)); +touch(@f); + +run_make_test(q! +CWEAVE := : + +# Disable builtin rules +%.tex : %.w +%.tex : %.w %.ch +!, + 'foo.tex', + "#MAKE#: *** No rule to make target `foo.tex'. Stop.", 512); + +unlink(@f); + +# TEST #9: Test shortest stem selection in pattern rules. + +run_make_test(' +%.x: ;@echo one +%-mt.x: ;@echo two + +all: foo.x foo-mt.x +', +'', +"one\ntwo"); + +1; + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/quoting b/tests/scripts/features/quoting new file mode 100644 index 0000000..916681c --- /dev/null +++ b/tests/scripts/features/quoting @@ -0,0 +1,32 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to test using \n" . + "quotes within makefiles."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<'EOM'; +SHELL = /bin/sh +TEXFONTS = NICEFONT +DEFINES = -DDEFAULT_TFM_PATH=\".:$(TEXFONTS)\" +test: ; @"echo" 'DEFINES = $(DEFINES)' +EOM + +# END of Contents of MAKEFILE + +close(MAKEFILE); + + +&run_make_with_options($makefile,"",&get_logfile); + + +# Create the answer to what should be produced by this Makefile +$answer = 'DEFINES = -DDEFAULT_TFM_PATH=\".:NICEFONT\"' . "\n"; + +# COMPARE RESULTS + +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/tests/scripts/features/recursion b/tests/scripts/features/recursion new file mode 100644 index 0000000..a6b8f90 --- /dev/null +++ b/tests/scripts/features/recursion @@ -0,0 +1,55 @@ +# -*-perl-*- +$description = "Test recursion."; + +$details = "DETAILS"; + +# Test some basic recursion. +run_make_test(' +all: + $(MAKE) -f #MAKEFILE# foo +foo: + @echo $(MAKE) + @echo MAKELEVEL = $(MAKELEVEL) + $(MAKE) -f #MAKEFILE# last +last: + @echo $(MAKE) + @echo MAKELEVEL = $(MAKELEVEL) + @echo THE END +', + ('CFLAGS=-O -w' . ($parallel_jobs ? ' -j 2' : '')), + ($vos + ? "#MAKE#: Entering directory `#PWD#' +make 'CFLAGS=-O' -f #MAKEFILE# foo +make CFLAGS=-O +MAKELEVEL = 0 +make 'CFLAGS=-O' -f #MAKEFILE# last +make CFLAGS=-O +MAKELEVEL = 0 +THE END +#MAKE#: Leaving directory `#PWD#'" + : "#MAKE#: Entering directory `#PWD#' +#MAKEPATH# -f #MAKEFILE# foo +#MAKE#[1]: Entering directory `#PWD#' +#MAKEPATH# +MAKELEVEL = 1 +#MAKEPATH# -f #MAKEFILE# last +#MAKE#[2]: Entering directory `#PWD#' +#MAKEPATH# +MAKELEVEL = 2 +THE END +#MAKE#[2]: Leaving directory `#PWD#' +#MAKE#[1]: Leaving directory `#PWD#' +#MAKE#: Leaving directory `#PWD#'")); + + +# Test command line overrides. +run_make_test(' +recur: all ; @$(MAKE) --no-print-directory -f #MAKEFILE# a=AA all +all: ; @echo "MAKEOVERRIDES = $(MAKEOVERRIDES)" +', + 'a=ZZ', + 'MAKEOVERRIDES = a=ZZ +MAKEOVERRIDES = a=AA +'); + +1; diff --git a/tests/scripts/features/reinvoke b/tests/scripts/features/reinvoke new file mode 100644 index 0000000..9952ced --- /dev/null +++ b/tests/scripts/features/reinvoke @@ -0,0 +1,65 @@ +# -*-mode: perl-*- + +$description = "Test GNU make's auto-reinvocation feature."; + +$details = "\ +If the makefile or one it includes can be rebuilt then it is, and make +is reinvoked. We create a rule to rebuild the makefile from a temp +file, then touch the temp file to make it newer than the makefile."; + +$omkfile = $makefile; + +&utouch(-600, 'incl.mk'); +# For some reason if we don't do this then the test fails for systems +# with sub-second timestamps, maybe + NFS? Not sure. +&utouch(-1, 'incl-1.mk'); + +run_make_test(' +all: ; @echo running rules. + +#MAKEFILE# incl.mk: incl-1.mk + @echo rebuilding $@ + @echo >> $@ + +include incl.mk', + '', "rebuilding incl.mk\nrunning rules.\n"); + +# Make sure updating the makefile itself also works + +&utouch(-600, $omkfile); + +run_make_test(undef, '', "rebuilding #MAKEFILE#\nrunning rules.\n"); + +&rmfiles('incl.mk', 'incl-1.mk'); + + +# In this test we create an included file that's out-of-date, but then +# the rule doesn't update it. Make shouldn't re-exec. + +&utouch(-600, 'b','a'); +#&utouch(-10, 'a'); +&touch('c'); + +run_make_test(' +SHELL = /bin/sh + +all: ; @echo hello + +a : b ; echo >> $@ + +b : c ; [ -f $@ ] || echo >> $@ + +c: ; echo >> $@ + +include $(F)', + 'F=a', "[ -f b ] || echo >> b\nhello\n"); + +# Now try with the file we're not updating being the actual file we're +# including: this and the previous one test different parts of the code. + +run_make_test(undef, "F=b", "[ -f b ] || echo >> b\nhello\n") + +&rmfiles('a','b','c'); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/se_explicit b/tests/scripts/features/se_explicit new file mode 100644 index 0000000..79e0a36 --- /dev/null +++ b/tests/scripts/features/se_explicit @@ -0,0 +1,156 @@ +# -*-perl-*- +$description = "Test second expansion in ordinary rules."; + +$details = ""; + +# TEST #0: Test handing of '$' in prerequisites with and without second +# expansion. + +run_make_test(q! +ifdef SE + .SECONDEXPANSION: +endif +foo$$bar: bar$$baz bar$$biz ; @echo '$@ : $^' +PRE = one two +bar$$baz: $$(PRE) +baraz: $$(PRE) +PRE = three four +.DEFAULT: ; @echo '$@' +!, + '', + "\$\nbar\$biz\nfoo\$bar : bar\$baz bar\$biz"); + +run_make_test(undef, 'SE=1', "three\nfour\nbariz\nfoo\$bar : baraz bariz"); + +# TEST #1: automatic variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo: bar baz + +foo: biz | buz + +foo: $$@.1 \ + $$<.2 \ + $$(addsuffix .3,$$^) \ + $$(addsuffix .4,$$+) \ + $$|.5 \ + $$*.6 + +!, +'', +'bar +baz +biz +buz +foo.1 +bar.2 +bar.3 +baz.3 +biz.3 +bar.4 +baz.4 +biz.4 +buz.5 +.6 +'); + + +# Test #2: target/pattern -specific variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo.x: $$a $$b + +foo.x: a := bar + +%.x: b := baz +!, +'', +'bar +baz +'); + + +# Test #3: order of prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +all: foo bar baz + +# Subtest #1 +foo: foo.1; @: +foo: foo.2 +foo: foo.3 + +# Subtest #2 +bar: bar.2 +bar: bar.1; @: +bar: bar.3 + +# Subtest #3 +baz: baz.1 +baz: baz.2 +baz: ; @: +!, +'', +'foo.1 +foo.2 +foo.3 +bar.1 +bar.2 +bar.3 +baz.1 +baz.2 +'); + +# TEST #4: eval in a context where there is no reading_file +run_make_test(q! +.SECONDEXPANSION: +all : $$(eval $$(info test)) +!, + '', "test\n#MAKE#: Nothing to be done for `all'.\n"); + +# TEST #5: (NEGATIVE) catch eval in a prereq list trying to create new +# target/prereq relationships. + +run_make_test(q! +.SECONDEXPANSION: +proj1.exe : proj1.o $$(eval $$(test)) +define test +proj1.o : proj1.c +proj1.c: proj1.h +endef +!, + '', "#MAKE#: *** prerequisites cannot be defined in recipes. Stop.\n", 512); + + +# Automatic $$+ variable expansion issue. Savannah bug #25780 +run_make_test(q! +all : foo foo +.SECONDEXPANSION: +all : $$+ ; @echo '$+' +foo : ; +!, + '', "foo foo foo foo\n"); + + +# Automatic $$+ variable expansion issue. Savannah bug #25780 +run_make_test(q! +all : bar bar +bar : ; +q%x : ; +.SECONDEXPANSION: +a%l: q1x $$+ q2x ; @echo '$+' +!, + '', "q1x bar bar q2x bar bar\n"); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/se_implicit b/tests/scripts/features/se_implicit new file mode 100644 index 0000000..e9acb2f --- /dev/null +++ b/tests/scripts/features/se_implicit @@ -0,0 +1,226 @@ +# -*-perl-*- +$description = "Test second expansion in ordinary rules."; + +$details = ""; + +use Cwd; + +$dir = cwd; +$dir =~ s,.*/([^/]+)$,../$1,; + + +# Test #1: automatic variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo.a: bar baz + +foo.a: biz | buz + +foo.%: 1.$$@ \ + 2.$$< \ + $$(addprefix 3.,$$^) \ + $$(addprefix 4.,$$+) \ + 5.$$| \ + 6.$$* + @: + +1.foo.a \ +2.bar \ +3.bar \ +3.baz \ +3.biz \ +4.bar \ +4.baz \ +4.biz \ +5.buz \ +6.a: + @echo '$@' + +!, +'', +'1.foo.a +2.bar +3.bar +3.baz +3.biz +4.bar +4.baz +4.biz +5.buz +6.a +bar +baz +biz +buz +'); + + +# Test #2: target/pattern -specific variables. +# +run_make_test(q! +.SECONDEXPANSION: +foo.x: + +foo.%: $$(%_a) $$(%_b) bar + @: + +foo.x: x_a := bar + +%.x: x_b := baz + +bar baz: ; @echo '$@' +!, + '', "bar\nbaz\n"); + + +# Test #3: order of prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +all: foo bar baz + + +# Subtest #1 +# +%oo: %oo.1; @: + +foo: foo.2 + +foo: foo.3 + +foo.1: ; @echo '$@' + + +# Subtest #2 +# +bar: bar.2 + +%ar: %ar.1; @: + +bar: bar.3 + +bar.1: ; @echo '$@' + + +# Subtest #3 +# +baz: baz.1 + +baz: baz.2 + +%az: ; @: +!, + '', +'foo.1 +foo.2 +foo.3 +bar.1 +bar.2 +bar.3 +baz.1 +baz.2 +'); + + +# Test #4: stem splitting logic. +# +run_make_test(q! +.SECONDEXPANSION: +$(dir)/tmp/bar.o: + +$(dir)/tmp/foo/bar.c: ; @echo '$@' +$(dir)/tmp/bar/bar.c: ; @echo '$@' +foo.h: ; @echo '$@' + +%.o: $$(addsuffix /%.c,foo bar) foo.h + @echo '$@: {$<} $^' +!, + "dir=$dir", "$dir/tmp/foo/bar.c +$dir/tmp/bar/bar.c +foo.h +$dir/tmp/bar.o: {$dir/tmp/foo/bar.c} $dir/tmp/foo/bar.c $dir/tmp/bar/bar.c foo.h +"); + + +# Test #5: stem splitting logic and order-only prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +$(dir)/tmp/foo.o: $(dir)/tmp/foo.c +$(dir)/tmp/foo.c: ; @echo '$@' +bar.h: ; @echo '$@' + +%.o: %.c|bar.h + @echo '$@: {$<} {$|} $^' + +!, + "dir=$dir", "$dir/tmp/foo.c +bar.h +$dir/tmp/foo.o: {$dir/tmp/foo.c} {bar.h} $dir/tmp/foo.c +"); + + +# Test #6: lack of implicit prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +foo.o: foo.c +foo.c: ; @echo '$@' + +%.o: + @echo '$@: {$<} $^' +!, + '', "foo.c\nfoo.o: {foo.c} foo.c\n"); + + +# Test #7: Test stem from the middle of the name. +# +run_make_test(q! +.SECONDEXPANSION: +foobarbaz: + +foo%baz: % $$*.1 + @echo '$*' + +bar bar.1: + @echo '$@' +!, + '', "bar\nbar.1\nbar\n"); + + +# Test #8: Make sure stem triple-expansion does not happen. +# +run_make_test(q! +.SECONDEXPANSION: +foo$$bar: + +f%r: % $$*.1 + @echo '$*' + +oo$$ba oo$$ba.1: + @echo '$@' +!, + '', 'oo$ba +oo$ba.1 +oo$ba +'); + +# Test #9: Check the value of $^ +run_make_test(q! +.SECONDEXPANSION: + +%.so: | $$(extra) ; @echo $^ + +foo.so: extra := foo.o +foo.so: +foo.o: +!, + '', "\n"); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/se_statpat b/tests/scripts/features/se_statpat new file mode 100644 index 0000000..b1e59e1 --- /dev/null +++ b/tests/scripts/features/se_statpat @@ -0,0 +1,107 @@ +# -*-perl-*- +$description = "Test second expansion in static pattern rules."; + +$details = ""; + +# Test #1: automatic variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo.a foo.b: foo.%: bar.% baz.% +foo.a foo.b: foo.%: biz.% | buz.% + +foo.a foo.b: foo.%: $$@.1 \ + $$<.2 \ + $$(addsuffix .3,$$^) \ + $$(addsuffix .4,$$+) \ + $$|.5 \ + $$*.6 +!, + '', 'bar.a +baz.a +biz.a +buz.a +foo.a.1 +bar.a.2 +bar.a.3 +baz.a.3 +biz.a.3 +bar.a.4 +baz.a.4 +biz.a.4 +buz.a.5 +a.6 +'); + + +# Test #2: target/pattern -specific variables. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +foo.x foo.y: foo.%: $$(%_a) $$($$*_b) + +foo.x: x_a := bar + +%.x: x_b := baz +!, + '', "bar\nbaz\n"); + + +# Test #3: order of prerequisites. +# +run_make_test(q! +.SECONDEXPANSION: +.DEFAULT: ; @echo '$@' + +all: foo.a bar.a baz.a + +# Subtest #1 +foo.a foo.b: foo.%: foo.%.1; @: +foo.a foo.b: foo.%: foo.%.2 +foo.a foo.b: foo.%: foo.%.3 + + +# Subtest #2 +bar.a bar.b: bar.%: bar.%.2 +bar.a bar.b: bar.%: bar.%.1; @: +bar.a bar.b: bar.%: bar.%.3 + + +# Subtest #3 +baz.a baz.b: baz.%: baz.%.1 +baz.a baz.b: baz.%: baz.%.2 +baz.a baz.b: ; @: +!, + '', 'foo.a.1 +foo.a.2 +foo.a.3 +bar.a.1 +bar.a.2 +bar.a.3 +baz.a.1 +baz.a.2 +'); + + +# Test #4: Make sure stem triple-expansion does not happen. +# +run_make_test(q! +.SECONDEXPANSION: +foo$$bar: f%r: % $$*.1 + @echo '$*' + +oo$$ba oo$$ba.1: + @echo '$@' +!, + '', 'oo$ba +oo$ba.1 +oo$ba +'); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/features/statipattrules b/tests/scripts/features/statipattrules new file mode 100644 index 0000000..3f363de --- /dev/null +++ b/tests/scripts/features/statipattrules @@ -0,0 +1,111 @@ +# -*-perl-*- +$description = "Test handling of static pattern rules."; + +$details = "\ +The makefile created in this test has three targets. The +filter command is used to get those target names ending in +.o and statically creates a compile command with the target +name and the target name with .c. It also does the same thing +for another target filtered with .elc and creates a command +to emacs a .el file"; + +&touch('bar.c', 'lose.c'); + +# TEST #0 +# ------- + +run_make_test(' +files = foo.elc bar.o lose.o + +$(filter %.o,$(files)): %.o: %.c ; @echo CC -c $(CFLAGS) $< -o $@ + +$(filter %.elc,$(files)): %.elc: %.el ; @echo emacs $< +', + '', + 'CC -c bar.c -o bar.o'); + +# TEST #1 +# ------- + +run_make_test(undef, 'lose.o', 'CC -c lose.c -o lose.o'); + + +# TEST #2 +# ------- +&touch("foo.el"); + +run_make_test(undef, 'foo.elc', 'emacs foo.el'); + +# Clean up after the first tests. +unlink('foo.el', 'bar.c', 'lose.c'); + + +# TEST #3 -- PR/1670: don't core dump on invalid static pattern rules +# ------- + +run_make_test(' +.DEFAULT: ; @echo $@ +foo: foo%: % %.x % % % y.% % ; @echo $@ +', + '', ".x\ny.\nfoo"); + + +# TEST #4 -- bug #12180: core dump on a stat pattern rule with an empty +# prerequisite list. +run_make_test(' +foo.x bar.x: %.x : ; @echo $@ + +', + '', 'foo.x'); + + +# TEST #5 -- bug #13881: double colon static pattern rule does not +# substitute %. +run_make_test(' +foo.bar:: %.bar: %.baz +foo.baz: ;@: +', + '', ''); + + +# TEST #6: make sure the second stem does not overwrite the first +# perprerequisite's stem (Savannah bug #16053). +# +run_make_test(' +all.foo.bar: %.foo.bar: %.one + +all.foo.bar: %.bar: %.two + +all.foo.bar: + @echo $* + @echo $^ + +.DEFAULT:;@: +', +'', +'all.foo +all.one all.foo.two'); + + +# TEST #7: make sure the second stem does not overwrite the first +# perprerequisite's stem when second expansion is enabled +# (Savannah bug #16053). +# +run_make_test(' +.SECONDEXPANSION: + +all.foo.bar: %.foo.bar: %.one $$*-one + +all.foo.bar: %.bar: %.two $$*-two + +all.foo.bar: + @echo $* + @echo $^ + +.DEFAULT:;@: +', +'', +'all.foo +all.one all-one all.foo.two all.foo-two'); + +1; diff --git a/tests/scripts/features/targetvars b/tests/scripts/features/targetvars new file mode 100644 index 0000000..ddd6c1f --- /dev/null +++ b/tests/scripts/features/targetvars @@ -0,0 +1,263 @@ +# -*-perl-*- +$description = "Test target-specific variable settings."; + +$details = "\ +Create a makefile containing various flavors of target-specific variable +values, override and non-override, and using various variable expansion +rules, semicolon interference, etc."; + +run_make_test(' +SHELL = /bin/sh +export FOO = foo +export BAR = bar +one: override FOO = one +one two: ; @echo $(FOO) $(BAR) +two: BAR = two +three: ; BAR=1000 + @echo $(FOO) $(BAR) +# Some things that shouldn not be target vars +funk : override +funk : override adelic +adelic override : ; echo $@ +# Test per-target recursive variables +four:FOO=x +four:VAR$(FOO)=ok +four: ; @echo "$(FOO) $(VAR$(FOO)) $(VAR) $(VARx)" +five:FOO=x +five six : VAR$(FOO)=good +five six: ;@echo "$(FOO) $(VAR$(FOO)) $(VAR) $(VARx) $(VARfoo)" +# Test per-target variable inheritance +seven: eight +seven eight: ; @echo $@: $(FOO) $(BAR) +seven: BAR = seven +seven: FOO = seven +eight: BAR = eight +# Test the export keyword with per-target variables +nine: ; @echo $(FOO) $(BAR) $$FOO $$BAR +nine: FOO = wallace +nine-a: export BAZ = baz +nine-a: ; @echo $$BAZ +# Test = escaping +EQ = = +ten: one$(EQ)two +ten: one $(EQ) two +ten one$(EQ)two $(EQ):;@echo $@ +.PHONY: one two three four five six seven eight nine ten $(EQ) one$(EQ)two +# Test target-specific vars with pattern/suffix rules +QVAR = qvar +RVAR = = +%.q : ; @echo $(QVAR) $(RVAR) +foo.q : RVAR += rvar +# Target-specific vars with multiple LHS pattern rules +%.r %.s %.t: ; @echo $(QVAR) $(RVAR) $(SVAR) $(TVAR) +foo.r : RVAR += rvar +foo.t : TVAR := $(QVAR) +', + "one two three", "one bar\nfoo two\nBAR=1000\nfoo bar\n"); + +# TEST #2 + +run_make_test(undef, "one two FOO=1 BAR=2", "one 2\n1 2\n"); + +# TEST #3 + +run_make_test(undef, "four", "x ok ok\n"); + +# TEST #4 + +run_make_test(undef, "seven", "eight: seven eight\nseven: seven seven\n"); + +# TEST #5 + +run_make_test(undef, "nine", "wallace bar wallace bar\n"); + +# TEST #5-a + +run_make_test(undef, "nine-a", "baz\n"); + +# TEST #6 + +run_make_test(undef, "ten", "one=two\none bar\n=\nfoo two\nten\n"); + +# TEST #6 + +run_make_test(undef, "foo.q bar.q", "qvar = rvar\nqvar =\n"); + +# TEST #7 + +run_make_test(undef, "foo.t bar.s", "qvar = qvar\nqvar =\n"); + + +# TEST #8 +# For PR/1378: Target-specific vars don't inherit correctly + +run_make_test(' +foo: FOO = foo +bar: BAR = bar +foo: bar +bar: baz +baz: ; @echo $(FOO) $(BAR) +', "", "foo bar\n"); + +# TEST #9 +# For PR/1380: Using += assignment in target-specific variables sometimes fails +# Also PR/1831 + +run_make_test(' +.PHONY: all one +all: FOO += baz +all: one; @echo $(FOO) + +FOO = bar + +one: FOO += biz +one: FOO += boz +one: ; @echo $(FOO) +', + '', "bar baz biz boz\nbar baz\n"); + +# Test #10 + +run_make_test(undef, 'one', "bar biz boz\n"); + +# Test #11 +# PR/1709: Test semicolons in target-specific variable values + +run_make_test(' +foo : FOO = ; ok +foo : ; @echo "$(FOO)" +', + '', "; ok\n"); + +# Test #12 +# PR/2020: More hassles with += target-specific vars. I _really_ think +# I nailed it this time :-/. + +run_make_test(' +.PHONY: a + +BLAH := foo +COMMAND = echo $(BLAH) + +a: ; @$(COMMAND) + +a: BLAH := bar +a: COMMAND += snafu $(BLAH) +', + '', "bar snafu bar\n"); + +# Test #13 +# Test double-colon rules with target-specific variable values + +run_make_test(' +W = bad +X = bad +foo: W = ok +foo:: ; @echo $(W) $(X) $(Y) $(Z) +foo:: ; @echo $(W) $(X) $(Y) $(Z) +foo: X = ok + +Y = foo +bar: foo +bar: Y = bar + +Z = nopat +ifdef PATTERN + fo% : Z = pat +endif +', + 'foo', "ok ok foo nopat\nok ok foo nopat\n"); + +# Test #14 +# Test double-colon rules with target-specific variable values and +# inheritance + +run_make_test(undef, 'bar', "ok ok bar nopat\nok ok bar nopat\n"); + +# Test #15 +# Test double-colon rules with pattern-specific variable values + +run_make_test(undef, 'foo PATTERN=yes', "ok ok foo pat\nok ok foo pat\n"); + +# Test #16 +# Test target-specific variables with very long command line +# (> make default buffer length) + +run_make_test(' +base_metals_fmd_reports.sun5 base_metals_fmd_reports CreateRealPositions CreateMarginFunds deals_changed_since : BUILD_OBJ=$(shell if [ -f "build_information.generate" ]; then echo "$(OBJ_DIR)/build_information.o"; else echo "no build information"; fi ) + +deals_changed_since: ; @echo $(BUILD_OBJ) +', + '', "no build information\n"); + +# TEST #17 + +# Test a merge of set_lists for files, where one list is much longer +# than the other. See Savannah bug #15757. + +mkdir('t1', 0777); +touch('t1/rules.mk'); + +run_make_test(' +VPATH = t1 +include rules.mk +.PHONY: all +all: foo.x +foo.x : rules.mk ; @echo MYVAR=$(MYVAR) FOOVAR=$(FOOVAR) ALLVAR=$(ALLVAR) +all: ALLVAR = xxx +foo.x: FOOVAR = bar +rules.mk : MYVAR = foo +.INTERMEDIATE: foo.x rules.mk +', + '-I t1', 'MYVAR= FOOVAR=bar ALLVAR=xxx'); + +rmfiles('t1/rules.mk'); +rmdir('t1'); + +# TEST #18 + +# Test appending to a simple variable containing a "$": avoid a +# double-expansion. See Savannah bug #15913. + +run_make_test(' +VAR := $$FOO +foo: VAR += BAR +foo: ; @echo '."'".'$(VAR)'."'".' +', + '', '$FOO BAR'); + +# TEST #19: Override with append variables + +run_make_test(' +a: override FOO += f1 +a: FOO += f2 +a: ; @echo "$(FOO)" +', + '', "f1\n"); + +run_make_test(undef, 'FOO=C', "C f1\n"); + +# TEST #20: Check for continuation after semicolons + +run_make_test(q! +a: A = 'hello; \ +world' +a: ; @echo $(A) +!, + '', "hello; world\n"); + +# TEST #19: Test define/endef variables as target-specific vars + +# run_make_test(' +# define b +# @echo global +# endef +# a: define b +# @echo local +# endef + +# a: ; $(b) +# ', +# '', "local\n"); + +1; diff --git a/tests/scripts/features/varnesting b/tests/scripts/features/varnesting new file mode 100644 index 0000000..15d5071 --- /dev/null +++ b/tests/scripts/features/varnesting @@ -0,0 +1,34 @@ +$description = "The following test creates a makefile to ..."; + +$details = ""; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "x = variable1\n" + ."variable2 := Hello\n" + ."y = \$(subst 1,2,\$(x))\n" + ."z = y\n" + ."a := \$(\$(\$(z)))\n" + ."all: \n" + ."\t\@echo \$(a)\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "Hello\n"; + +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + diff --git a/tests/scripts/features/vpath b/tests/scripts/features/vpath new file mode 100644 index 0000000..a3aebd9 --- /dev/null +++ b/tests/scripts/features/vpath @@ -0,0 +1,81 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to test the \n" + ."vpath directive which allows you to specify a search \n" + ."path for a particular class of filenames, those that\n" + ."match a particular pattern."; + +$details = "This tests the vpath directive by specifying search directories\n" + ."for one class of filenames with the form: vpath pattern directories" + ."\nIn this test, we specify the working directory for all files\n" + ."that end in c or h. We also test the variables $@ (which gives\n" + ."target name) and $^ (which is a list of all dependencies \n" + ."including the directories in which they were found). It also\n" + ."uses the function firstword used to extract just the first\n" + ."dependency from the entire list."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "vpath %.c foo\n"; +print MAKEFILE "vpath %.c $workdir\n"; +print MAKEFILE "vpath %.h $workdir\n"; +print MAKEFILE "objects = main.o kbd.o commands.o display.o insert.o\n"; +print MAKEFILE "edit: \$(objects)\n"; +print MAKEFILE "\t\@echo cc -o \$@ \$^\n"; +print MAKEFILE "main.o : main.c defs.h\n"; +print MAKEFILE "\t\@echo cc -c \$(firstword \$^)\n"; +print MAKEFILE "kbd.o : kbd.c defs.h command.h\n"; +print MAKEFILE "\t\@echo cc -c kbd.c\n"; +print MAKEFILE "commands.o : command.c defs.h command.h\n"; +print MAKEFILE "\t\@echo cc -c commands.c\n"; +print MAKEFILE "display.o : display.c defs.h buffer.h\n"; +print MAKEFILE "\t\@echo cc -c display.c\n"; +print MAKEFILE "insert.o : insert.c defs.h buffer.h\n"; +print MAKEFILE "\t\@echo cc -c insert.c\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + + +@files_to_touch = ("$workdir${pathsep}main.c","$workdir${pathsep}defs.h", + "$workdir${pathsep}kbd.c","$workdir${pathsep}command.h", + "$workdir${pathsep}commands.c","$workdir${pathsep}display.c", + "$workdir${pathsep}buffer.h","$workdir${pathsep}insert.c", + "$workdir${pathsep}command.c"); + +&touch(@files_to_touch); + +&run_make_with_options($makefile,"",&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "cc -c $workdir${pathsep}main.c\ncc -c kbd.c\ncc -c commands.c\n" + ."cc -c display.c\n" + ."cc -c insert.c\ncc -o edit main.o kbd.o commands.o display.o " + ."insert.o\n"; + +if (&compare_output($answer,&get_logfile(1))) +{ + unlink @files_to_touch; +} + +# TEST 2: after vpath lookup ensure we don't get incorrect circular dependency +# warnings due to change of struct file ptr. Savannah bug #13529. + +mkdir('vpath-d', 0777); + +run_make_test(q! +vpath %.te vpath-d/ +.SECONDARY: +default: vpath-d/a vpath-d/b +vpath-d/a: fail.te +vpath-d/b : fail.te +vpath-d/fail.te: +!, + '', "#MAKE#: Nothing to be done for `default'.\n"); + +rmdir('vpath-d'); + +1; diff --git a/tests/scripts/features/vpath2 b/tests/scripts/features/vpath2 new file mode 100644 index 0000000..7e970a7 --- /dev/null +++ b/tests/scripts/features/vpath2 @@ -0,0 +1,45 @@ +$description = "This is part 2 in a series to test the vpath directive\n" + ."It tests the three forms of the directive:\n" + ." vpath pattern directive\n" + ." vpath pattern (clears path associated with pattern)\n" + ." vpath (clears all paths specified with vpath)\n"; + +$details = "This test simply adds many search paths using various vpath\n" + ."directive forms and clears them afterwards. It has a simple\n" + ."rule to print a message at the end to confirm that the makefile\n" + ."ran with no errors.\n"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "VPATH = $workdir:$sourcedir\n"; +print MAKEFILE "vpath %.c foo\n"; +print MAKEFILE "vpath %.c $workdir\n"; +print MAKEFILE "vpath %.c $sourcedir\n"; +print MAKEFILE "vpath %.h $workdir\n"; +print MAKEFILE "vpath %.c\n"; +print MAKEFILE "vpath\n"; +print MAKEFILE "all:\n"; +print MAKEFILE "\t\@echo ALL IS WELL\n"; +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "ALL IS WELL\n"; + +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + + + + diff --git a/tests/scripts/features/vpath3 b/tests/scripts/features/vpath3 new file mode 100644 index 0000000..978c5ee --- /dev/null +++ b/tests/scripts/features/vpath3 @@ -0,0 +1,50 @@ +# -*-perl-*- + +$description = "Test the interaction of the -lfoo feature and vpath"; +$details = ""; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "vpath %.a a1\n"; +print MAKEFILE "vpath %.so b1\n"; +print MAKEFILE "vpath % a2 b2\n"; +print MAKEFILE "vpath % b3\n"; +print MAKEFILE "all: -l1 -l2 -l3; \@echo \$^\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +mkdir("a1", 0777); +mkdir("b1", 0777); +mkdir("a2", 0777); +mkdir("b2", 0777); +mkdir("b3", 0777); + +@files_to_touch = ("a1${pathsep}lib1.a", + "b1${pathsep}lib1.so", + "a2${pathsep}lib2.a", + "b2${pathsep}lib2.so", + "lib3.a", + "b3${pathsep}lib3.so"); + +&touch(@files_to_touch); + +&run_make_with_options($makefile,"",&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "a1${pathsep}lib1.a a2${pathsep}lib2.a lib3.a\n"; + +if (&compare_output($answer,&get_logfile(1))) +{ + unlink @files_to_touch; + rmdir("a1"); + rmdir("b1"); + rmdir("a2"); + rmdir("b2"); + rmdir("b3"); +} + +1; diff --git a/tests/scripts/features/vpathgpath b/tests/scripts/features/vpathgpath new file mode 100644 index 0000000..f7683f5 --- /dev/null +++ b/tests/scripts/features/vpathgpath @@ -0,0 +1,66 @@ +# -*-perl-*- +$description = "Tests VPATH+/GPATH functionality."; + +$details = ""; + +$VP = "$workdir$pathsep"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "VPATH = $VP\n"; + +print MAKEFILE <<'EOMAKE'; + +GPATH = $(VPATH) + +.SUFFIXES: .a .b .c .d +.PHONY: general rename notarget intermediate + +%.a: +%.b: +%.c: +%.d: + +%.a : %.b ; cat $^ > $@ +%.b : %.c ; cat $^ > $@ +%.c :: %.d ; cat $^ > $@ + +# General testing info: + +general: foo.b +foo.b: foo.c bar.c + +EOMAKE + +close(MAKEFILE); + +@touchedfiles = (); + +$off = -500; + +sub touchfiles { + foreach (@_) { + ($f = $_) =~ s,VP/,$VP,g; + &utouch($off, $f); + $off += 10; + push(@touchedfiles, $f); + } +} + +# Run the general-case test + +&touchfiles("VP/foo.d", "VP/bar.d", "VP/foo.c", "VP/bar.c", "foo.b", "bar.d"); + +&run_make_with_options($makefile,"general",&get_logfile()); + +push(@touchedfiles, "bar.c"); + +$answer = "$make_name: Nothing to be done for `general'.\n"; + +&compare_output($answer,&get_logfile(1)); + +unlink(@touchedfiles) unless $keep; + +1; diff --git a/tests/scripts/features/vpathplus b/tests/scripts/features/vpathplus new file mode 100644 index 0000000..a37fbed --- /dev/null +++ b/tests/scripts/features/vpathplus @@ -0,0 +1,128 @@ +# -*-perl-*- +$description = "Tests the new VPATH+ functionality added in 3.76."; + +$details = ""; + +$VP = "$workdir$pathsep"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "VPATH = $VP\n"; + +print MAKEFILE <<'EOMAKE'; + +SHELL = /bin/sh + +.SUFFIXES: .a .b .c .d +.PHONY: general rename notarget intermediate + +%.a: +%.b: +%.c: +%.d: + +%.a : %.b + cat $^ > $@ +%.b : %.c + cat $^ > $@ 2>/dev/null || exit 1 +%.c :: %.d + cat $^ > $@ + +# General testing info: + +general: foo.b +foo.b: foo.c bar.c + +# Rename testing info: + +rename: $(VPATH)/foo.c foo.d + +# Target not made testing info: + +notarget: notarget.b +notarget.c: notarget.d + -@echo "not creating $@ from $^" + +# Intermediate files: + +intermediate: inter.a + +EOMAKE + +close(MAKEFILE); + +@touchedfiles = (); + +$off = -500; + +sub touchfiles { + foreach (@_) { + &utouch($off, $_); + $off += 10; + push(@touchedfiles, $_); + } +} + +# Run the general-case test + +&touchfiles("$VP/foo.d", "$VP/bar.d", "$VP/foo.c", "$VP/bar.c", "foo.b", "bar.d"); + +&run_make_with_options($makefile,"general",&get_logfile); + +push(@touchedfiles, "bar.c"); + +$answer = "cat bar.d > bar.c +cat ${VP}foo.c bar.c > foo.b 2>/dev/null || exit 1 +"; +&compare_output($answer,&get_logfile(1)); + +# Test rules that don't make the target correctly + +&touchfiles("$VP/notarget.c", "notarget.b", "notarget.d"); + +&run_make_with_options($makefile,"notarget",&get_logfile,512); + +$answer = "not creating notarget.c from notarget.d +cat notarget.c > notarget.b 2>/dev/null || exit 1 +$make_name: *** [notarget.b] Error 1 +"; + +&compare_output($answer,&get_logfile(1)); + +# Test intermediate file handling (part 1) + +&touchfiles("$VP/inter.d"); + +&run_make_with_options($makefile,"intermediate",&get_logfile); + +push(@touchedfiles, "inter.a", "inter.b"); + +$answer = "cat ${VP}inter.d > inter.c +cat inter.c > inter.b 2>/dev/null || exit 1 +cat inter.b > inter.a +rm inter.b inter.c +"; +&compare_output($answer,&get_logfile(1)); + +# Test intermediate file handling (part 2) + +&utouch(-20, "inter.a"); +&utouch(-10, "$VP/inter.b"); +&touch("$VP/inter.d"); + +push(@touchedfiles, "$VP/inter.b", "$VP/inter.d"); + +&run_make_with_options($makefile,"intermediate",&get_logfile); + +$answer = "cat ${VP}inter.d > inter.c +cat inter.c > inter.b 2>/dev/null || exit 1 +cat inter.b > inter.a +rm inter.c +"; +&compare_output($answer,&get_logfile(1)); + +unlink @touchedfiles unless $keep; + +1; diff --git a/tests/scripts/functions/abspath b/tests/scripts/functions/abspath new file mode 100644 index 0000000..84c30ab --- /dev/null +++ b/tests/scripts/functions/abspath @@ -0,0 +1,81 @@ +# -*-perl-*- +$description = "Test the abspath functions."; + +$details = ""; + +run_make_test(' +ifneq ($(realpath $(abspath .)),$(CURDIR)) + $(warning .: abs="$(abspath .)" real="$(realpath $(abspath .))" curdir="$(CURDIR)") +endif + +ifneq ($(realpath $(abspath ./)),$(CURDIR)) + $(warning ./: abs="$(abspath ./)" real="$(realpath $(abspath ./))" curdir="$(CURDIR)") +endif + +ifneq ($(realpath $(abspath .///)),$(CURDIR)) + $(warning .///: abs="$(abspath .///)" real="$(realpath $(abspath .///))" curdir="$(CURDIR)") +endif + +ifneq ($(abspath /),/) + $(warning /: abspath="$(abspath /)") +endif + +ifneq ($(abspath ///),/) + $(warning ///: abspath="$(abspath ///)") +endif + +ifneq ($(abspath /.),/) + $(warning /.: abspath="$(abspath /.)") +endif + +ifneq ($(abspath ///.),/) + $(warning ///.: abspath="$(abspath ///.)") +endif + +ifneq ($(abspath /./),/) + $(warning /./: abspath="$(abspath /./)") +endif + +ifneq ($(abspath /.///),/) + $(warning /.///: abspath="$(abspath /.///)") +endif + +ifneq ($(abspath /..),/) + $(warning /..: abspath="$(abspath /..)") +endif + +ifneq ($(abspath ///..),/) + $(warning ///..: abspath="$(abspath ///..)") +endif + +ifneq ($(abspath /../),/) + $(warning /../: abspath="$(abspath /../)") +endif + +ifneq ($(abspath /..///),/) + $(warning /..///: abspath="$(abspath /..///)") +endif + + +ifneq ($(abspath /foo/bar/..),/foo) + $(warning /foo/bar/..: abspath="$(abspath /foo/bar/..)") +endif + +ifneq ($(abspath /foo/bar/../../../baz),/baz) + $(warning /foo/bar/../../../baz: abspath="$(abspath /foo/bar/../../../baz)") +endif + +ifneq ($(abspath /foo/bar/../ /..),/foo /) + $(warning /foo/bar/../ /..: abspath="$(abspath /foo/bar/../ /..)") +endif + + +.PHONY: all +all: ; @: +', +'', +''); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/functions/addprefix b/tests/scripts/functions/addprefix new file mode 100644 index 0000000..1845552 --- /dev/null +++ b/tests/scripts/functions/addprefix @@ -0,0 +1,44 @@ +$description = "The following test creates a makefile to test the addprefix " + ."function."; + +$details = ""; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(addprefix src${pathsep},a.b.z.foo hacks) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "src${pathsep}a.b.z.foo src${pathsep}hacks\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/addsuffix b/tests/scripts/functions/addsuffix new file mode 100644 index 0000000..da4fbb7 --- /dev/null +++ b/tests/scripts/functions/addsuffix @@ -0,0 +1,36 @@ +# -*-perl-*- +$description = "Test the addsuffix function."; + +$details = ""; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(basename src${pathsep}a.b.z.foo.c src${pathsep}hacks src.bar${pathsep}a.b.z.foo.c src.bar${pathsep}hacks hacks) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "src${pathsep}a.b.z.foo src${pathsep}hacks src.bar${pathsep}a.b.z.foo src.bar${pathsep}hacks hacks\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/call b/tests/scripts/functions/call new file mode 100644 index 0000000..f3c5470 --- /dev/null +++ b/tests/scripts/functions/call @@ -0,0 +1,99 @@ +# -*-perl-*- +$description = "Test the call function.\n"; + +$details = "Try various uses of call and ensure they all give the correct +results.\n"; + +open(MAKEFILE, "> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<'EOMAKE'; +# Simple, just reverse two things +# +reverse = $2 $1 + +# A complex `map' function, using recursive `call'. +# +map = $(foreach a,$2,$(call $1,$a)) + +# Test using a builtin; this is silly as it's simpler to do without call +# +my-notdir = $(call notdir,$(1)) + +# Test using non-expanded builtins +# +my-foreach = $(foreach $(1),$(2),$(3)) +my-if = $(if $(1),$(2),$(3)) + +# Test recursive invocations of call with different arguments +# +one = $(1) $(2) $(3) +two = $(call one,$(1),foo,$(2)) + +# Test recursion on the user-defined function. As a special case make +# won't error due to this. +# Implement transitive closure using $(call ...) +# +DEP_foo = bar baz quux +DEP_baz = quux blarp +rest = $(wordlist 2,$(words ${1}),${1}) +tclose = $(if $1,$(firstword $1) \ + $(call tclose,$(sort ${DEP_$(firstword $1)} $(call rest,$1)))) + +all: ; @echo '$(call reverse,bar,foo)'; \ + echo '$(call map,origin,MAKE reverse map)'; \ + echo '$(call my-notdir,a/b c/d e/f)'; \ + echo '$(call my-foreach)'; \ + echo '$(call my-foreach,a,,,)'; \ + echo '$(call my-if,a,b,c)'; \ + echo '$(call two,bar,baz)'; \ + echo '$(call tclose,foo)' + + + +EOMAKE + +# These won't work until/unless PR/1527 is resolved. +# echo '$(call my-foreach,a,x y z,$(a)$(a))'; \ +# echo '$(call my-if,,$(warning don't print this),ok)' +# +# $answer = "xx yy zz\nok\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile, "", &get_logfile); +$answer = "foo bar\ndefault file file\nb d f\n\n\nb\nbar foo baz\nfoo bar baz blarp quux \n"; +&compare_output($answer, &get_logfile(1)); + + +# TEST eclipsing of arguments when invoking sub-calls + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile2"); + +print MAKEFILE <<'EOF'; + +all = $1 $2 $3 $4 $5 $6 $7 $8 $9 + +level1 = $(call all,$1,$2,$3,$4,$5) +level2 = $(call level1,$1,$2,$3) +level3 = $(call level2,$1,$2,$3,$4,$5) + +all: + @echo $(call all,1,2,3,4,5,6,7,8,9,10,11) + @echo $(call level1,1,2,3,4,5,6,7,8) + @echo $(call level2,1,2,3,4,5,6,7,8) + @echo $(call level3,1,2,3,4,5,6,7,8) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, "", &get_logfile); +$answer = "1 2 3 4 5 6 7 8 9\n1 2 3 4 5\n1 2 3\n1 2 3\n"; +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/tests/scripts/functions/dir b/tests/scripts/functions/dir new file mode 100644 index 0000000..f48fb8c --- /dev/null +++ b/tests/scripts/functions/dir @@ -0,0 +1,44 @@ +$description = "The following test creates a makefile to test the dir " + ."function."; + +$details = ""; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(dir src${pathsep}foo.c hacks) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "src${pathsep} .${pathsep}\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/error b/tests/scripts/functions/error new file mode 100644 index 0000000..0d61177 --- /dev/null +++ b/tests/scripts/functions/error @@ -0,0 +1,73 @@ +# -*-Perl-*- + +$description = "\ +The following test creates a makefile to test the error function."; + +$details = ""; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE 'err = $(error Error found!) + +ifdef ERROR1 +$(error error is $(ERROR1)) +endif + +ifdef ERROR2 +$(error error is $(ERROR2)) +endif + +ifdef ERROR3 +all: some; @echo $(error error is $(ERROR3)) +endif + +ifdef ERROR4 +all: some; @echo error is $(ERROR4) + @echo $(error error is $(ERROR4)) +endif + +some: ; @echo Some stuff + +testvar: ; @: $(err) +'; + +close(MAKEFILE); + +# Test #1 + +&run_make_with_options($makefile, "ERROR1=yes", &get_logfile, 512); +$answer = "$makefile:4: *** error is yes. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #2 + +&run_make_with_options($makefile, "ERROR2=no", &get_logfile, 512); +$answer = "$makefile:8: *** error is no. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #3 + +&run_make_with_options($makefile, "ERROR3=maybe", &get_logfile, 512); +$answer = "Some stuff\n$makefile:12: *** error is maybe. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #4 + +&run_make_with_options($makefile, "ERROR4=definitely", &get_logfile, 512); +$answer = "Some stuff\n$makefile:16: *** error is definitely. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #5 + +&run_make_with_options($makefile, "testvar", &get_logfile, 512); +$answer = "$makefile:22: *** Error found!. Stop.\n"; +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/eval b/tests/scripts/functions/eval new file mode 100644 index 0000000..90513bd --- /dev/null +++ b/tests/scripts/functions/eval @@ -0,0 +1,169 @@ +# -*-perl-*- + +$description = "Test the eval function."; + +$details = "This is a test of the eval function in GNU make. +This function will evaluate inline makefile syntax and incorporate the +results into its internal database.\n"; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +define Y + all:: ; @echo $AA + A = B +endef + +X = $(eval $(value Y)) + +$(eval $(shell echo A = A)) +$(eval $(Y)) +$(eval A = C) +$(eval $(X)) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile, "", &get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "AA\nBA\n"; + +&compare_output($answer,&get_logfile(1)); + +# Test to make sure defining variables when we have extra scope pushed works +# as expected. + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile2"); + +print MAKEFILE <<'EOF'; +VARS = A B + +VARSET = $(1) = $(2) + +$(foreach v,$(VARS),$(eval $(call VARSET,$v,$v))) + +all: ; @echo A = $(A) B = $(B) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, "", &get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "A = A B = B\n"; + +&compare_output($answer,&get_logfile(1)); + +# Test to make sure eval'ing inside conditionals works properly + +$makefile3 = &get_tmpfile; + +open(MAKEFILE,"> $makefile3"); + +print MAKEFILE <<'EOF'; +FOO = foo + +all:: ; @echo it + +define Y + all:: ; @echo worked +endef + +ifdef BAR +$(eval $(Y)) +endif + +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile3, "", &get_logfile); +$answer = "it\n"; +&compare_output($answer,&get_logfile(1)); + +&run_make_with_options($makefile3, "BAR=1", &get_logfile); +$answer = "it\nworked\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST very recursive invocation of eval + +$makefile3 = &get_tmpfile; + +open(MAKEFILE,"> $makefile3"); + +print MAKEFILE <<'EOF'; +..9 := 0 1 2 3 4 5 6 7 8 9 +rev=$(eval res:=)$(foreach word,$1,$(eval res:=${word} ${res}))${res} +a:=$(call rev,${..9}) +all: ; @echo '[$(a)]' + +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile3, "", &get_logfile); +$answer = "[ 9 8 7 6 5 4 3 2 1 0 ]\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST eval with no filename context. +# The trick here is that because EVAR is taken from the environment, it must +# be evaluated before every command is invoked. Make sure that works, when +# we have no file context for reading_file (bug # 6195) + +$makefile4 = &get_tmpfile; + +open(MAKEFILE,"> $makefile4"); + +print MAKEFILE <<'EOF'; +EVAR = $(eval FOBAR = 1) +all: ; @echo "OK" + +EOF + +close(MAKEFILE); + +$extraENV{EVAR} = '1'; +&run_make_with_options($makefile4, "", &get_logfile); +$answer = "OK\n"; +&compare_output($answer,&get_logfile(1)); + + +# Clean out previous information to allow new run_make_test() interface. +# If we ever convert all the above to run_make_test() we can remove this line. +$makefile = undef; + +# Test handling of backslashes in strings to be evaled. + +run_make_test(' +define FOO +all: ; @echo hello \ +world +endef +$(eval $(FOO)) +', '', 'hello world'); + +run_make_test(' +define FOO +all: ; @echo '."'".'he\llo'."'".' + @echo world +endef +$(eval $(FOO)) +', '', 'he\llo +world'); + + +# We don't allow new target/prerequisite relationships to be defined within a +# command script, because these are evaluated after snap_deps() and that +# causes lots of problems (like core dumps!) +# See Savannah bug # 12124. + +run_make_test('deps: ; $(eval deps: foo)', '', + '#MAKEFILE#:1: *** prerequisites cannot be defined in recipes. Stop.', + 512); + +1; diff --git a/tests/scripts/functions/filter-out b/tests/scripts/functions/filter-out new file mode 100644 index 0000000..6c8b27a --- /dev/null +++ b/tests/scripts/functions/filter-out @@ -0,0 +1,28 @@ +# -*-perl-*- + +$description = "Test the filter-out function."; + +$details = "The makefile created in this test has two variables. The +filter-out function is first used to discard names ending in +.o with a single simple pattern. The second filter-out function +augments the simple pattern with three literal names, which are +also added to the text argument. This tests an internal hash table +which is only used if there are multiple literals present in both +the pattern and text arguments. The result of both filter-out +functions is the same single .elc name.\n"; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +files1 := $(filter-out %.o, foo.elc bar.o lose.o) +files2 := $(filter-out foo.i bar.i lose.i %.o, foo.i bar.i lose.i foo.elc bar.o lose.o) +all: ; @echo $(files1) $(files2) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile, "", &get_logfile, 0); +$answer = "foo.elc foo.elc\n"; +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/tests/scripts/functions/findstring b/tests/scripts/functions/findstring new file mode 100644 index 0000000..48abede --- /dev/null +++ b/tests/scripts/functions/findstring @@ -0,0 +1,47 @@ +$description = "The following test creates a makefile to test the findstring " + ."function."; + +$details = ""; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(findstring port, reporter)\n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile, + "", + &get_logfile, + 0); + +# Create the answer to what should be produced by this Makefile +$answer = "port\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/flavor b/tests/scripts/functions/flavor new file mode 100644 index 0000000..80d6be7 --- /dev/null +++ b/tests/scripts/functions/flavor @@ -0,0 +1,44 @@ +# -*-perl-*- +$description = "Test the flavor function."; + +$details = ""; + + +# Test #1: Test general logic. +# +run_make_test(' +s := s +r = r + +$(info u $(flavor u)) +$(info s $(flavor s)) +$(info r $(flavor r)) + +ra += ra +rc ?= rc + +$(info ra $(flavor ra)) +$(info rc $(flavor rc)) + +s += s +r += r + +$(info s $(flavor s)) +$(info r $(flavor r)) + + +.PHONY: all +all:;@: +', +'', +'u undefined +s simple +r recursive +ra recursive +rc recursive +s simple +r recursive'); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/functions/foreach b/tests/scripts/functions/foreach new file mode 100644 index 0000000..82e99d7 --- /dev/null +++ b/tests/scripts/functions/foreach @@ -0,0 +1,77 @@ +# -*-perl-*- +# $Id: foreach,v 1.5 2006/03/10 02:20:46 psmith Exp $ + +$description = "Test the foreach function."; + +$details = "This is a test of the foreach function in gnu make. +This function starts with a space separated list of +names and a variable. Each name in the list is subsituted +into the variable and the given text evaluated. The general +form of the command is $(foreach var,$list,$text). Several +types of foreach loops are tested\n"; + + +# TEST 0 + +# Set an environment variable that we can test in the makefile. +$extraENV{FOOFOO} = 'foo foo'; + +run_make_test("space = ' '".' +null := +auto_var = udef space CC null FOOFOO MAKE foo CFLAGS WHITE @ < +foo = bletch null @ garf +av = $(foreach var, $(auto_var), $(origin $(var)) ) +override WHITE := BLACK +for_var = $(addsuffix .c,foo $(null) $(foo) $(space) $(av) ) +fe = $(foreach var2, $(for_var),$(subst .c,.o, $(var2) ) ) +all: auto for2 +auto : ; @echo $(av) +for2: ; @echo $(fe)', + '-e WHITE=WHITE CFLAGS=', + "undefined file default file environment default file command line override automatic automatic +foo.o bletch.o null.o @.o garf.o .o .o undefined.o file.o default.o file.o environment.o default.o file.o command.o line.o override.o automatic.o automatic.o"); + +delete $extraENV{FOOFOO}; + +# TEST 1: Test that foreach variables take precedence over global +# variables in a global scope (like inside an eval). Tests bug #11913 + +run_make_test(' +.PHONY: all target +all: target + +x := BAD + +define mktarget +target: x := $(x) +target: ; @echo "$(x)" +endef + +x := GLOBAL + +$(foreach x,FOREACH,$(eval $(value mktarget)))', + '', + 'FOREACH'); + + +# TEST 2: Check some error conditions. + +run_make_test(' +x = $(foreach ) +y = $x + +all: ; @echo $y', + '', + "#MAKEFILE#:2: *** insufficient number of arguments (1) to function `foreach'. Stop.", + 512); + +run_make_test(' +x = $(foreach ) +y := $x + +all: ; @echo $y', + '', + "#MAKEFILE#:2: *** insufficient number of arguments (1) to function `foreach'. Stop.", + 512); + +1; diff --git a/tests/scripts/functions/if b/tests/scripts/functions/if new file mode 100644 index 0000000..8604e4f --- /dev/null +++ b/tests/scripts/functions/if @@ -0,0 +1,33 @@ +# -*-perl-*- +$description = "Test the if function.\n"; + +$details = "Try various uses of if and ensure they all give the correct +results.\n"; + +open(MAKEFILE, "> $makefile"); + +print MAKEFILE <1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(join a b c,foo hacks .pl1) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "afoo bhacks c.pl1\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/notdir b/tests/scripts/functions/notdir new file mode 100644 index 0000000..4ed8f9c --- /dev/null +++ b/tests/scripts/functions/notdir @@ -0,0 +1,44 @@ +$description = "The following test creates a makefile to test the notdir " + ."function."; + +$details = ""; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := \$(notdir ${pathsep}src${pathsep}foo.c hacks) \n" + ."all: \n" + ."\t\@echo \$(string) \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "foo.c hacks\n"; + +# COMPARE RESULTS + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/origin b/tests/scripts/functions/origin new file mode 100644 index 0000000..f7b7eb8 --- /dev/null +++ b/tests/scripts/functions/origin @@ -0,0 +1,51 @@ +# -*-perl-*- + +$description = "Test the origin function."; + +$details = "This is a test of the origin function in gnu make. +This function will report on where a variable was +defined per the following list: + +'undefined' never defined +'default' default definition +'environment' environment var without -e +'environment override' environment var with -e +'file' defined in makefile +'command line' defined on the command line +'override' defined by override in makefile +'automatic' Automatic variable\n"; + +# Set an environment variable +$extraENV{MAKETEST} = 1; + +run_make_test(' +foo := bletch garf +auto_var = undefined CC MAKETEST MAKE foo CFLAGS WHITE @ +av = $(foreach var, $(auto_var), $(origin $(var)) ) +override WHITE := BLACK +all: auto + @echo $(origin undefined) + @echo $(origin CC) + @echo $(origin MAKETEST) + @echo $(origin MAKE) + @echo $(origin foo) + @echo $(origin CFLAGS) + @echo $(origin WHITE) + @echo $(origin @) +auto : + @echo $(av)', + '-e WHITE=WHITE CFLAGS=', + 'undefined default environment default file command line override automatic +undefined +default +environment +default +file +command line +override +automatic'); + +# Reset an environment variable +delete $extraENV{MAKETEST}; + +1; diff --git a/tests/scripts/functions/realpath b/tests/scripts/functions/realpath new file mode 100644 index 0000000..9b503b4 --- /dev/null +++ b/tests/scripts/functions/realpath @@ -0,0 +1,82 @@ +# -*-perl-*- +$description = "Test the realpath functions."; + +$details = ""; + +run_make_test(' +ifneq ($(realpath .),$(CURDIR)) + $(error ) +endif + +ifneq ($(realpath ./),$(CURDIR)) + $(error ) +endif + +ifneq ($(realpath .///),$(CURDIR)) + $(error ) +endif + +ifneq ($(realpath /),/) + $(error ) +endif + +ifneq ($(realpath /.),/) + $(error ) +endif + +ifneq ($(realpath /./),/) + $(error ) +endif + +ifneq ($(realpath /.///),/) + $(error ) +endif + +ifneq ($(realpath /..),/) + $(error ) +endif + +ifneq ($(realpath /../),/) + $(error ) +endif + +ifneq ($(realpath /..///),/) + $(error ) +endif + +ifneq ($(realpath . /..),$(CURDIR) /) + $(error ) +endif + +.PHONY: all +all: ; @: +', + '', + ''); + +# On Windows platforms, "//" means something special. So, don't do these +# tests there. + +if ($port_type ne 'W32') { + run_make_test(' +ifneq ($(realpath ///),/) + $(error ) +endif + +ifneq ($(realpath ///.),/) + $(error ) +endif + +ifneq ($(realpath ///..),/) + $(error ) +endif + +.PHONY: all +all: ; @:', + '', + ''); +} + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/functions/shell b/tests/scripts/functions/shell new file mode 100644 index 0000000..723cd0e --- /dev/null +++ b/tests/scripts/functions/shell @@ -0,0 +1,32 @@ +# -*-perl-*- + +$description = 'Test the $(shell ...) function.'; + +$details = ''; + + +# Test shells inside rules. +run_make_test('.PHONY: all +all: ; @echo $(shell echo hi) +','','hi'); + + +# Test unescaped comment characters in shells. Savannah bug #20513 +if ($all_tests) { + run_make_test(q! +FOO := $(shell echo '#') +foo: ; echo '$(FOO)' +!, + '', "#\n"); +} + +# Test shells inside exported environment variables. +# This is the test that fails if we try to put make exported variables into +# the environment for a $(shell ...) call. +run_make_test(' +export HI = $(shell echo hi) +.PHONY: all +all: ; @echo $$HI +','','hi'); + +1; diff --git a/tests/scripts/functions/sort b/tests/scripts/functions/sort new file mode 100644 index 0000000..d472102 --- /dev/null +++ b/tests/scripts/functions/sort @@ -0,0 +1,55 @@ +$description = "The following test creates a makefile to verify\n" + ."the ability of make to sort lists of object. Sort\n" + ."will also remove any duplicate entries. This will also\n" + ."be tested."; + +$details = "The make file is built with a list of object in a random order\n" + ."and includes some duplicates. Make should sort all of the elements\n" + ."remove all duplicates\n"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "foo := moon_light days \n" + ."foo1:= jazz\n" + ."bar := captured \n" + ."bar2 = boy end, has rise A midnight \n" + ."bar3:= \$(foo)\n" + ."s1 := _by\n" + ."s2 := _and_a\n" + ."t1 := \$(addsuffix \$(s1), \$(bar) )\n" + ."t2 := \$(addsuffix \$(s2), \$(foo1) )\n" + ."t3 := \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \n" + ."t4 := \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \n" + ."t5 := \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \n" + ."t6 := \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \n" + ."t7 := \$(t6) \$(t6) \$(t6) \n" + ."p1 := \$(addprefix \$(foo1), \$(s2) )\n" + ."blank:= \n" + ."all:\n" + ."\t\@echo \$(sort \$(bar2) \$(foo) \$(addsuffix \$(s1), \$(bar) ) \$(t2) \$(bar2) \$(bar3))\n" + ."\t\@echo \$(sort \$(blank) \$(foo) \$(bar2) \$(t1) \$(p1) )\n" + ."\t\@echo \$(sort \$(foo) \$(bar2) \$(t1) \$(t4) \$(t5) \$(t7) \$(t6) )\n"; + + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "A boy captured_by days end, has jazz_and_a midnight moon_light rise\n" + ."A boy captured_by days end, has jazz_and_a midnight moon_light rise\n" + ."A boy captured_by days end, has jazz_and_a midnight moon_light rise\n"; + +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + diff --git a/tests/scripts/functions/strip b/tests/scripts/functions/strip new file mode 100644 index 0000000..8222433 --- /dev/null +++ b/tests/scripts/functions/strip @@ -0,0 +1,57 @@ +# -*-perl-*- +$description = "The following test creates a makefile to verify +the ability of make to strip white space from lists of object.\n"; + + +$details = "The make file is built with a list of objects that contain white space +These are then run through the strip command to remove it. This is then +verified by echoing the result.\n"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<'EOMAKE'; +TEST1 := "Is this TERMINAL fun? What makes you believe is this terminal fun? JAPAN is a WONDERFUL planet -- I wonder if we will ever reach their level of COMPARATIVE SHOPPING..." +E := +TEST2 := $E try this and this $E + +define TEST3 + +and these test out + + +some +blank lines + + + +endef + +.PHONY: all +all: + @echo '$(strip $(TEST1) )' + @echo '$(strip $(TEST2) )' + @echo '$(strip $(TEST3) )' + +space: ; @echo '$(strip ) $(strip )' + +EOMAKE + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile); +$answer = "\"Is this TERMINAL fun? What makes you believe is this terminal fun? JAPAN is a WONDERFUL planet -- I wonder if we will ever reach their level of COMPARATIVE SHOPPING...\" +try this and this +and these test out some blank lines +"; +&compare_output($answer,&get_logfile(1)); + + +&run_make_with_options($makefile,"space",&get_logfile); +$answer = " \n"; +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/tests/scripts/functions/substitution b/tests/scripts/functions/substitution new file mode 100644 index 0000000..0d2f6a2 --- /dev/null +++ b/tests/scripts/functions/substitution @@ -0,0 +1,38 @@ +# -*-perl-*- + +$description = "Test the subst and patsubst functions"; + +$details = ""; + +# Generic patsubst test: test both the function and variable form. + +run_make_test(' +foo := a.o b.o c.o +bar := $(foo:.o=.c) +bar2:= $(foo:%.o=%.c) +bar3:= $(patsubst %.c,%.o,x.c.c bar.c) +all:;@echo $(bar); echo $(bar2); echo $(bar3)', +'', +'a.c b.c c.c +a.c b.c c.c +x.c.o bar.o'); + +# Patsubst without '%'--shouldn't match because the whole word has to match +# in patsubst. Based on a bug report by Markus Mauhart + +run_make_test('all:;@echo $(patsubst Foo,Repl,FooFoo)', '', 'FooFoo'); + +# Variable subst where a pattern matches multiple times in a single word. +# Based on a bug report by Markus Mauhart + +run_make_test(' +A := fooBARfooBARfoo +all:;@echo $(A:fooBARfoo=REPL)', '', 'fooBARREPL'); + +1; + + + + + + diff --git a/tests/scripts/functions/suffix b/tests/scripts/functions/suffix new file mode 100644 index 0000000..0c4f919 --- /dev/null +++ b/tests/scripts/functions/suffix @@ -0,0 +1,57 @@ +$description = "The following test creates a makefile to test the suffix\n" + ."function. \n"; + +$details = "The suffix function will return the string following the last _._\n" + ."the list provided. It will provide all of the unique suffixes found\n" + ."in the list. The long strings are sorted to remove duplicates.\n"; + +# IF YOU NEED >1 MAKEFILE FOR THIS TEST, USE &get_tmpfile; TO GET +# THE NAME OF THE MAKEFILE. THIS INSURES CONSISTENCY AND KEEPS TRACK OF +# HOW MANY MAKEFILES EXIST FOR EASY DELETION AT THE END. +# EXAMPLE: $makefile2 = &get_tmpfile; + + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "string := word.pl general_test2.pl1 FORCE.pl word.pl3 generic_test.perl /tmp.c/bar foo.baz/bar.c MAKEFILES_variable.c\n" + ."string2 := \$(string) \$(string) \$(string) \$(string) \$(string) \$(string) \$(string)\n" + ."string3 := \$(string2) \$(string2) \$(string2) \$(string2) \$(string2) \$(string2) \$(string2)\n" + ."string4 := \$(string3) \$(string3) \$(string3) \$(string3) \$(string3) \$(string3) \$(string3)\n" + ."all: \n" + ."\t\@echo \$(suffix \$(string)) \n" + ."\t\@echo \$(sort \$(suffix \$(string4))) \n" + ."\t\@echo \$(suffix \$(string) a.out) \n" + ."\t\@echo \$(sort \$(suffix \$(string3))) \n"; + + + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile + +# COMPARE RESULTS +$answer = ".pl .pl1 .pl .pl3 .perl .c .c\n" + .".c .perl .pl .pl1 .pl3\n" + .".pl .pl1 .pl .pl3 .perl .c .c .out\n" + .".c .perl .pl .pl1 .pl3\n"; + +# In this call to compare output, you should use the call &get_logfile(1) +# to send the name of the last logfile created. You may also use +# the special call &get_logfile(1) which returns the same as &get_logfile(1). + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/value b/tests/scripts/functions/value new file mode 100644 index 0000000..8e1a6f0 --- /dev/null +++ b/tests/scripts/functions/value @@ -0,0 +1,30 @@ +# -*-perl-*- + +$description = "Test the value function."; + +$details = "This is a test of the value function in GNU make. +This function will evaluate to the value of the named variable with no +further expansion performed on it.\n"; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +export FOO = foo + +recurse = FOO = $FOO +static := FOO = $(value FOO) + +all: ; @echo $(recurse) $(value recurse) $(static) $(value static) +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile, "", &get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "FOO = OO FOO = foo FOO = foo FOO = foo\n"; + + +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/tests/scripts/functions/warning b/tests/scripts/functions/warning new file mode 100644 index 0000000..cd452d4 --- /dev/null +++ b/tests/scripts/functions/warning @@ -0,0 +1,65 @@ +# -*-Perl-*- + +$description = "\ +The following test creates a makefile to test the warning function."; + +$details = ""; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +ifdef WARNING1 +$(warning warning is $(WARNING1)) +endif + +ifdef WARNING2 +$(warning warning is $(WARNING2)) +endif + +ifdef WARNING3 +all: some; @echo hi $(warning warning is $(WARNING3)) +endif + +ifdef WARNING4 +all: some; @echo hi + @echo there $(warning warning is $(WARNING4)) +endif + +some: ; @echo Some stuff + +EOF + +close(MAKEFILE); + +# Test #1 + +&run_make_with_options($makefile, "WARNING1=yes", &get_logfile, 0); +$answer = "$makefile:2: warning is yes\nSome stuff\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #2 + +&run_make_with_options($makefile, "WARNING2=no", &get_logfile, 0); +$answer = "$makefile:6: warning is no\nSome stuff\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #3 + +&run_make_with_options($makefile, "WARNING3=maybe", &get_logfile, 0); +$answer = "Some stuff\n$makefile:10: warning is maybe\nhi\n"; +&compare_output($answer,&get_logfile(1)); + +# Test #4 + +&run_make_with_options($makefile, "WARNING4=definitely", &get_logfile, 0); +$answer = "Some stuff\n$makefile:14: warning is definitely\nhi\nthere\n"; +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/functions/wildcard b/tests/scripts/functions/wildcard new file mode 100644 index 0000000..2841f5d --- /dev/null +++ b/tests/scripts/functions/wildcard @@ -0,0 +1,91 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to test wildcard +expansions and the ability to put a command on the same +line as the target name separated by a semi-colon."; + +$details = "\ +This test creates 4 files by the names of 1.example, +two.example and 3.example. We execute three tests. The first +executes the print1 target which tests the '*' wildcard by +echoing all filenames by the name of '*.example'. The second +test echo's all files which match '?.example' and +[a-z0-9].example. Lastly we clean up all of the files using +the '*' wildcard as in the first test"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE < $makefile"); +print MAKEFILE <<'EOF'; +string := word.pl general_test2.pl FORCE.pl word.pl generic_test.perl MAKEFILES_variable.pl +string2 := $(string) $(string) $(string) $(string) $(string) $(string) $(string) +string3 := $(string2) $(string2) $(string2) $(string2) $(string2) $(string2) $(string2) +string4 := $(string3) $(string3) $(string3) $(string3) $(string3) $(string3) $(string3) +all: + @echo $(words $(string)) + @echo $(words $(string4)) + @echo $(word 1, $(string)) + @echo $(word 100, $(string)) + @echo $(word 1, $(string)) + @echo $(word 1000, $(string3)) + @echo $(wordlist 3, 4, $(string)) + @echo $(wordlist 4, 3, $(string)) + @echo $(wordlist 1, 6, $(string)) + @echo $(wordlist 5, 7, $(string)) + @echo $(wordlist 100, 110, $(string)) + @echo $(wordlist 7, 10, $(string2)) +EOF +close(MAKEFILE); + +&run_make_with_options($makefile, "", &get_logfile); +$answer = "6\n" + ."2058\n" + ."word.pl\n" + ."\n" + ."word.pl\n" + ."\n" + ."FORCE.pl word.pl\n" + ."\n" + ."word.pl general_test2.pl FORCE.pl word.pl generic_test.perl MAKEFILES_variable.pl\n" + ."generic_test.perl MAKEFILES_variable.pl\n" + ."\n" + ."word.pl general_test2.pl FORCE.pl word.pl\n"; +&compare_output($answer, &get_logfile(1)); + + +# Test error conditions + +run_make_test('FOO = foo bar biz baz + +word-e1: ; @echo $(word ,$(FOO)) +word-e2: ; @echo $(word abc ,$(FOO)) +word-e3: ; @echo $(word 1a,$(FOO)) + +wordlist-e1: ; @echo $(wordlist ,,$(FOO)) +wordlist-e2: ; @echo $(wordlist abc ,,$(FOO)) +wordlist-e3: ; @echo $(wordlist 1, 12a ,$(FOO))', + 'word-e1', + "#MAKEFILE#:3: *** non-numeric first argument to `word' function: ''. Stop.", + 512); + +run_make_test(undef, + 'word-e2', + "#MAKEFILE#:4: *** non-numeric first argument to `word' function: 'abc '. Stop.", + 512); + +run_make_test(undef, + 'word-e3', + "#MAKEFILE#:5: *** non-numeric first argument to `word' function: '1a'. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e1', + "#MAKEFILE#:7: *** non-numeric first argument to `wordlist' function: ''. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e2', + "#MAKEFILE#:8: *** non-numeric first argument to `wordlist' function: 'abc '. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e3', + "#MAKEFILE#:9: *** non-numeric second argument to `wordlist' function: ' 12a '. Stop.", + 512); + +# Test error conditions again, but this time in a variable reference + +run_make_test('FOO = foo bar biz baz + +W = $(word $x,$(FOO)) +WL = $(wordlist $s,$e,$(FOO)) + +word-e: ; @echo $(W) +wordlist-e: ; @echo $(WL)', + 'word-e x=', + "#MAKEFILE#:3: *** non-numeric first argument to `word' function: ''. Stop.", + 512); + +run_make_test(undef, + 'word-e x=abc', + "#MAKEFILE#:3: *** non-numeric first argument to `word' function: 'abc'. Stop.", + 512); + +run_make_test(undef, + 'word-e x=0', + "#MAKEFILE#:3: *** first argument to `word' function must be greater than 0. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e s= e=', + "#MAKEFILE#:4: *** non-numeric first argument to `wordlist' function: ''. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e s=abc e=', + "#MAKEFILE#:4: *** non-numeric first argument to `wordlist' function: 'abc'. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e s=4 e=12a', + "#MAKEFILE#:4: *** non-numeric second argument to `wordlist' function: '12a'. Stop.", + 512); + +run_make_test(undef, + 'wordlist-e s=0 e=12', + "#MAKEFILE#:4: *** invalid first argument to `wordlist' function: `0'. Stop.", + 512); + + +# TEST #8 -- test $(firstword ) +# +run_make_test(' +void := +list := $(void) foo bar baz # + +a := $(word 1,$(list)) +b := $(firstword $(list)) + +.PHONY: all + +all: + @test "$a" = "$b" && echo $a +', +'', +'foo'); + + +# TEST #9 -- test $(lastword ) +# +run_make_test(' +void := +list := $(void) foo bar baz # + +a := $(word $(words $(list)),$(list)) +b := $(lastword $(list)) + +.PHONY: all + +all: + @test "$a" = "$b" && echo $a +', +'', +'baz'); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/misc/close_stdout b/tests/scripts/misc/close_stdout new file mode 100644 index 0000000..18606c3 --- /dev/null +++ b/tests/scripts/misc/close_stdout @@ -0,0 +1,9 @@ +# -*-perl-*- + +$description = "Make sure make exits with an error if stdout is full."; + +if (-e '/dev/full') { + run_make_test('', '-v > /dev/full', '/^#MAKE#: write error/', 256); +} + +1; diff --git a/tests/scripts/misc/general1 b/tests/scripts/misc/general1 new file mode 100644 index 0000000..352fc6a --- /dev/null +++ b/tests/scripts/misc/general1 @@ -0,0 +1,51 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to test the +simple functionality of make. It mimics the +rebuilding of a product with dependencies. +It also tests the simple definition of VPATH."; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE < $makefile"); + +# The contents of the Makefile ... + +print MAKEFILE < $makefile2"); +print MAKEFILE "all:;\@echo FOO = \$(FOO)\nFOO = foo"; +close(MAKEFILE); + +&run_make_with_options($makefile2,"",&get_logfile); +$answer = "FOO = foo\n"; +&compare_output($answer,&get_logfile(1)); + +# TEST 3 + +# Check semicolons in variable references + +run_make_test(' +$(if true,$(info true; true)) +all: ; @: +', + '', 'true; true'); + +# TEST 4 + +# Check that backslashes in command scripts are handled according to POSIX. +# Checks Savannah bug # 1332. + +# Test the fastpath / no quotes +run_make_test(' +all: + @echo foo\ +bar + @echo foo\ + bar + @echo foo\ + bar + @echo foo\ + bar + @echo foo \ +bar + @echo foo \ + bar + @echo foo \ + bar + @echo foo \ + bar +', + '', 'foobar +foobar +foo bar +foo bar +foo bar +foo bar +foo bar +foo bar'); + +# Test the fastpath / single quotes +run_make_test(" +all: + \@echo 'foo\\ +bar' + \@echo 'foo\\ + bar' + \@echo 'foo\\ + bar' + \@echo 'foo\\ + bar' + \@echo 'foo \\ +bar' + \@echo 'foo \\ + bar' + \@echo 'foo \\ + bar' + \@echo 'foo \\ + bar' +", + '', 'foo\ +bar +foo\ +bar +foo\ + bar +foo\ + bar +foo \ +bar +foo \ +bar +foo \ + bar +foo \ + bar'); + +# Test the fastpath / double quotes +run_make_test(' +all: + @echo "foo\ +bar" + @echo "foo\ + bar" + @echo "foo\ + bar" + @echo "foo\ + bar" + @echo "foo \ +bar" + @echo "foo \ + bar" + @echo "foo \ + bar" + @echo "foo \ + bar" +', + '', 'foobar +foobar +foo bar +foo bar +foo bar +foo bar +foo bar +foo bar'); + +# Test the slow path / no quotes +run_make_test(' +all: + @echo hi; echo foo\ +bar + @echo hi; echo foo\ + bar + @echo hi; echo foo\ + bar + @echo hi; echo foo\ + bar + @echo hi; echo foo \ +bar + @echo hi; echo foo \ + bar + @echo hi; echo foo \ + bar + @echo hi; echo foo \ + bar +', + '', 'hi +foobar +hi +foobar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar'); + +# Test the slow path / no quotes. This time we put the slow path +# determination _after_ the backslash-newline handling. +run_make_test(' +all: + @echo foo\ +bar; echo hi + @echo foo\ + bar; echo hi + @echo foo\ + bar; echo hi + @echo foo\ + bar; echo hi + @echo foo \ +bar; echo hi + @echo foo \ + bar; echo hi + @echo foo \ + bar; echo hi + @echo foo \ + bar; echo hi +', + '', 'foobar +hi +foobar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi'); + +# Test the slow path / single quotes +run_make_test(" +all: + \@echo hi; echo 'foo\\ +bar' + \@echo hi; echo 'foo\\ + bar' + \@echo hi; echo 'foo\\ + bar' + \@echo hi; echo 'foo\\ + bar' + \@echo hi; echo 'foo \\ +bar' + \@echo hi; echo 'foo \\ + bar' + \@echo hi; echo 'foo \\ + bar' + \@echo hi; echo 'foo \\ + bar' +", + '', 'hi +foo\ +bar +hi +foo\ +bar +hi +foo\ + bar +hi +foo\ + bar +hi +foo \ +bar +hi +foo \ +bar +hi +foo \ + bar +hi +foo \ + bar'); + +# Test the slow path / double quotes +run_make_test(' +all: + @echo hi; echo "foo\ +bar" + @echo hi; echo "foo\ + bar" + @echo hi; echo "foo\ + bar" + @echo hi; echo "foo\ + bar" + @echo hi; echo "foo \ +bar" + @echo hi; echo "foo \ + bar" + @echo hi; echo "foo \ + bar" + @echo hi; echo "foo \ + bar" +', + '', 'hi +foobar +hi +foobar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar +hi +foo bar'); + +1; diff --git a/tests/scripts/misc/general4 b/tests/scripts/misc/general4 new file mode 100644 index 0000000..6d42a16 --- /dev/null +++ b/tests/scripts/misc/general4 @@ -0,0 +1,82 @@ +# -*-perl-*- + +$description = "\ +This tests random features of make's algorithms, often somewhat obscure, +which have either broken at some point in the past or seem likely to +break."; + +run_make_test(' +# Make sure that subdirectories built as prerequisites are actually handled +# properly. + +all: dir/subdir/file.a + +dir/subdir: ; @echo mkdir -p dir/subdir + +dir/subdir/file.b: dir/subdir ; @echo touch dir/subdir/file.b + +dir/subdir/%.a: dir/subdir/%.b ; @echo cp $< $@', + '', "mkdir -p dir/subdir\ntouch dir/subdir/file.b\ncp dir/subdir/file.b dir/subdir/file.a\n"); + +# Test implicit rules + +&touch('foo.c'); +run_make_test('foo: foo.o', + 'CC="@echo cc" OUTPUT_OPTION=', + 'cc -c foo.c +cc foo.o -o foo'); +unlink('foo.c'); + + +# Test implicit rules with '$' in the name (see se_implicit) + +run_make_test(q! +%.foo : baz$$bar ; @echo 'done $<' +%.foo : bar$$baz ; @echo 'done $<' +test.foo: +baz$$bar bar$$baz: ; @echo '$@' +!, + '', + "baz\$bar\ndone baz\$bar"); + + +# Test implicit rules with '$' in the name (see se_implicit) +# Use the '$' in the pattern. + +run_make_test(q! +%.foo : %$$bar ; @echo 'done $<' +test.foo: +test$$bar: ; @echo '$@' +!, + '', + "test\$bar\ndone test\$bar"); + +# Make sure that subdirectories built as prerequisites are actually handled +# properly... this time with '$' + +run_make_test(q! + +all: dir/subdir/file.$$a + +dir/subdir: ; @echo mkdir -p '$@' + +dir/subdir/file.$$b: dir/subdir ; @echo touch '$@' + +dir/subdir/%.$$a: dir/subdir/%.$$b ; @echo 'cp $< $@' +!, + '', "mkdir -p dir/subdir\ntouch dir/subdir/file.\$b\ncp dir/subdir/file.\$b dir/subdir/file.\$a\n"); + +# Test odd whitespace at the beginning of a line + +run_make_test(" +all: + \f + + \\ + \f \\ + \013 \\ +all: ; \@echo hi +", + '', "hi\n"); + +1; diff --git a/tests/scripts/options/dash-B b/tests/scripts/options/dash-B new file mode 100644 index 0000000..e36842e --- /dev/null +++ b/tests/scripts/options/dash-B @@ -0,0 +1,85 @@ +# -*-perl-*- + +$description = "Test make -B (always remake) option.\n"; + +$details = "\ +Construct a simple makefile that builds a target. +Invoke make once, so it builds everything. Invoke it again and verify +that nothing is built. Then invoke it with -B and verify that everything +is built again."; + +&touch('bar.x'); + +run_make_test(' +.SUFFIXES: + +.PHONY: all +all: foo + +foo: bar.x + @echo cp $< $@ + @echo "" > $@ +', + '', 'cp bar.x foo'); + +run_make_test(undef, '', "#MAKE#: Nothing to be done for `all'."); +run_make_test(undef, '-B', 'cp bar.x foo'); + +# Put the timestamp for foo into the future; it should still be remade. + +utouch(1000, 'foo'); +run_make_test(undef, '', "#MAKE#: Nothing to be done for `all'."); +run_make_test(undef, '-B', 'cp bar.x foo'); + +# Clean up + +rmfiles('bar.x', 'foo'); + +# Test -B with the re-exec feature: we don't want to re-exec forever +# Savannah bug # 7566 + +run_make_test(' +all: ; @: +$(info MAKE_RESTARTS=$(MAKE_RESTARTS)) +include foo.x +foo.x: ; @touch $@ +', + '-B', 'MAKE_RESTARTS= +#MAKEFILE#:4: foo.x: No such file or directory +MAKE_RESTARTS=1'); + +rmfiles('foo.x'); + +# Test -B with the re-exec feature: we DO want -B in the "normal" part of the +# makefile. + +&touch('blah.x'); + +run_make_test(' +all: blah.x ; @echo $@ +$(info MAKE_RESTARTS=$(MAKE_RESTARTS)) +include foo.x +foo.x: ; @touch $@ +blah.x: ; @echo $@ +', + '-B', 'MAKE_RESTARTS= +#MAKEFILE#:4: foo.x: No such file or directory +MAKE_RESTARTS=1 +blah.x +all'); + +rmfiles('foo.x', 'blah.x'); + +# Test that $? is set properly with -B; all prerequisites will be newer! + +utouch(-10, 'x.b'); +touch('x.a'); + +run_make_test(q! +x.a: x.b ; @echo $? +!, + '-B', "x.b\n"); + +unlink(qw(x.a x.b)); + +1; diff --git a/tests/scripts/options/dash-C b/tests/scripts/options/dash-C new file mode 100644 index 0000000..5864ffd --- /dev/null +++ b/tests/scripts/options/dash-C @@ -0,0 +1,71 @@ +# -*-perl-*- + +$description = "Test the -C option to GNU make."; + +$details = "\ +This test is similar to the clean test except that this test creates the file +to delete in the work directory instead of the current directory. Make is +called from another directory using the -C workdir option so that it can both +find the makefile and the file to delete in the work directory."; + +$example = $workdir . $pathsep . "EXAMPLE"; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE < $makefile"); + +# The Contents of the MAKEFILE ... + +$mf2 = substr ($makefile2, index ($makefile2, $pathsep) + 1); +print MAKEFILE < $makefile2"); + +print MAKEFILE <> $@ +', + '', "echo >> b.x\necho >> a.x"); + +# Run it again: nothing should happen + +run_make_test(undef, '', "#MAKE#: `a.x' is up to date."); + +# Now run it with -W b.x: should rebuild a.x + +run_make_test(undef, '-W b.x', 'echo >> a.x'); + +# Put the timestamp for a.x into the future; it should still be remade. + +utouch(1000, 'a.x'); +run_make_test(undef, '', "#MAKE#: `a.x' is up to date."); +run_make_test(undef, '-W b.x', 'echo >> a.x'); + +# Clean up + +rmfiles('a.x', 'b.x'); + +# Test -W with the re-exec feature: we don't want to re-exec forever +# Savannah bug # 7566 + +# First set it up with a normal build + +run_make_test(' +all: baz.x ; @: +include foo.x +foo.x: bar.x + @echo "\$$(info restarts=\$$(MAKE_RESTARTS))" > $@ + @echo "touch $@" +bar.x: ; echo >> $@ +baz.x: bar.x ; @echo "touch $@" +', + '', '#MAKEFILE#:3: foo.x: No such file or directory +echo >> bar.x +touch foo.x +restarts=1 +touch baz.x'); + +# Now run with -W bar.x + +# Tweak foo.x's timestamp so the update will change it. +&utouch(1000, 'foo.x'); + +run_make_test(undef, '-W bar.x', "restarts=\ntouch foo.x\nrestarts=1\ntouch baz.x"); + +rmfiles('foo.x', 'bar.x'); + +# Test -W on vpath-found files: it should take effect. +# Savannah bug # 15341 + +mkdir('x-dir', 0777); +utouch(-20, 'x-dir/x'); +touch('y'); + +run_make_test(' +y: x ; @echo cp $< $@ +', + '-W x-dir/x VPATH=x-dir', + 'cp x-dir/x y'); + +# Make sure ./ stripping doesn't interfere with the match. + +run_make_test(' +y: x ; @echo cp $< $@ +', + '-W ./x-dir/x VPATH=x-dir', + 'cp x-dir/x y'); + +run_make_test(undef, + '-W x-dir/x VPATH=./x-dir', + 'cp ./x-dir/x y'); + +unlink(qw(y x-dir/x)); +rmdir('x-dir'); + +1; diff --git a/tests/scripts/options/dash-e b/tests/scripts/options/dash-e new file mode 100644 index 0000000..17c3fc8 --- /dev/null +++ b/tests/scripts/options/dash-e @@ -0,0 +1,24 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to ..."; + +$details = ""; + +$extraENV{GOOGLE} = 'boggle'; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; +GOOGLE = bazzle +all:; @echo "$(GOOGLE)" +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile, '-e' ,&get_logfile); + +$answer = "boggle\n"; + +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/tests/scripts/options/dash-f b/tests/scripts/options/dash-f new file mode 100644 index 0000000..3aa4746 --- /dev/null +++ b/tests/scripts/options/dash-f @@ -0,0 +1,85 @@ +$description = "The following test tests that if you specify greater \n" + ."than one '-f makefilename' on the command line, \n" + ."that make concatenates them. This test creates three \n" + ."makefiles and specifies all of them with the -f option \n" + ."on the command line. To make sure they were concatenated, \n" + ."we then call make with the rules from the concatenated \n" + ."makefiles one at a time. Finally, it calls all three \n" + ."rules in one call to make and checks that the output\n" + ."is in the correct order."; + +$makefile2 = &get_tmpfile; +$makefile3 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "all: \n"; +print MAKEFILE "\t\@echo This is the output from the original makefile\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +# Create a second makefile +open(MAKEFILE,"> $makefile2"); +print MAKEFILE "TWO: \n"; +print MAKEFILE "\t\@echo This is the output from makefile 2\n"; +close(MAKEFILE); + +# Create a third makefile +open(MAKEFILE,"> $makefile3"); +print MAKEFILE "THREE: \n"; +print MAKEFILE "\t\@echo This is the output from makefile 3\n"; +close(MAKEFILE); + + +# Create the answer to what should be produced by this Makefile +$answer = "This is the output from the original makefile\n"; + +# Run make to catch the default rule +&run_make_with_options($makefile,"-f $makefile2 -f $makefile3",&get_logfile,0); + +&compare_output($answer,&get_logfile(1)); + + +# Run Make again with the rule from the second makefile: TWO +$answer = "This is the output from makefile 2\n"; + +&run_make_with_options($makefile,"-f $makefile2 -f $makefile3 TWO",&get_logfile,0); + +&compare_output($answer,&get_logfile(1)); + + +# Run Make again with the rule from the third makefile: THREE + +$answer = "This is the output from makefile 3\n"; +&run_make_with_options($makefile, + "-f $makefile2 -f $makefile3 THREE", + &get_logfile, + 0); +&compare_output($answer,&get_logfile(1)); + + +# Run Make again with ALL three rules in the order 2 1 3 to make sure +# that all rules are executed in the proper order + +$answer = "This is the output from makefile 2\n"; +$answer .= "This is the output from the original makefile\n"; +$answer .= "This is the output from makefile 3\n"; +&run_make_with_options($makefile, + "-f $makefile2 -f $makefile3 TWO all THREE", + &get_logfile, + 0); +&compare_output($answer,&get_logfile(1)); + + + + + + + + + + diff --git a/tests/scripts/options/dash-k b/tests/scripts/options/dash-k new file mode 100644 index 0000000..d87a786 --- /dev/null +++ b/tests/scripts/options/dash-k @@ -0,0 +1,114 @@ +# -*-perl-*- + +$description = "Test the make -k (don't stop on error) option.\n"; + +$details = "\ +The makefile created in this test is a simulation of building +a small product. However, the trick to this one is that one +of the dependencies of the main target does not exist. +Without the -k option, make would fail immediately and not +build any part of the target. What we are looking for here, +is that make builds the rest of the dependencies even though +it knows that at the end it will fail to rebuild the main target."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE < $makefile2"); +print MAKEFILE <<'EOF'; +.SUFFIXES: + +all: exe1 exe2; @echo making $@ + +exe1 exe2: lib; @echo cp $^ $@ + +lib: foo.o; @echo cp $^ $@ + +foo.o: ; exit 1 +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, "-k", &get_logfile, $error_code); + +$answer = "exit 1 +$make_name: *** [foo.o] Error 1 +$make_name: Target `all' not remade because of errors.\n"; + +&compare_output($answer, &get_logfile(1)); + +# TEST -- make sure we keep the error code if we can't create an included +# makefile. + +run_make_test('all: ; @echo hi +include ifile +ifile: no-such-file; @false +', + '-k', + "#MAKEFILE#:2: ifile: No such file or directory +#MAKE#: *** No rule to make target `no-such-file', needed by `ifile'. +#MAKE#: Failed to remake makefile `ifile'. +hi\n", + 512); + +1; diff --git a/tests/scripts/options/dash-l b/tests/scripts/options/dash-l new file mode 100644 index 0000000..0b0f196 --- /dev/null +++ b/tests/scripts/options/dash-l @@ -0,0 +1,56 @@ +# -*-perl-*- +# Date: Tue, 11 Aug 1992 09:34:26 -0400 +# From: pds@lemming.webo.dg.com (Paul D. Smith) + +$description = "Test load balancing (-l) option."; + +$details = "\ +This test creates a makefile where all depends on three rules +which contain the same body. Each rule checks for the existence +of a temporary file; if it exists an error is generated. If it +doesn't exist then it is created, the rule sleeps, then deletes +the temp file again. Thus if any of the rules are run in +parallel the test will fail. When make is called in this test, +it is given the -l option with a value of 0.0001. This ensures +that the load will be above this number and make will therefore +decide that it cannot run more than one job even though -j 4 was +also specified on the command line."; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<'EOF'; +SHELL = /bin/sh + +define test +if [ ! -f test-file ]; then \ + echo >> test-file; sleep 2; rm -f test-file; \ +else \ + echo $@ FAILED; \ +fi +endef + +all : ONE TWO THREE +ONE : ; @$(test) +TWO : ; @$(test) +THREE : ; @$(test) +EOF + + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +$mkoptions = "-l 0.0001"; +$mkoptions .= " -j 4" if ($parallel_jobs); + +# We have to wait longer than the default (5s). +&run_make_with_options($makefile, $mkoptions, &get_logfile, 0, 8); + +$slurp = &read_file_into_string (&get_logfile(1)); +if ($slurp !~ /cannot enforce load limit/) { + &compare_output("", &get_logfile(1)); +} + +1; diff --git a/tests/scripts/options/dash-n b/tests/scripts/options/dash-n new file mode 100644 index 0000000..de19f42 --- /dev/null +++ b/tests/scripts/options/dash-n @@ -0,0 +1,70 @@ +# -*-perl-*- +$description = "Test the -n option.\n"; + +$details = "Try various uses of -n and ensure they all give the correct results.\n"; + +open(MAKEFILE, "> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE <<'EOMAKE'; + +final: intermediate ; echo >> $@ +intermediate: orig ; echo >> $@ + +EOMAKE + +close(MAKEFILE); + +&touch('orig'); + +# TEST 0 + +&run_make_with_options($makefile, "", &get_logfile); +$answer = "echo >> intermediate\necho >> final\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 1 + +&run_make_with_options($makefile, "-Worig -n", &get_logfile); +$answer = "echo >> intermediate\necho >> final\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('orig', 'intermediate', 'final'); + +# We consider the actual updated timestamp of targets with all +# recursive commands, even with -n. + +$makefile2 = &get_tmpfile; + +open(MAKEFILE, "> $makefile2"); + +print MAKEFILE <<'EOF'; +.SUFFIXES: +BAR = # nothing +FOO = +$(BAR) +a: b; echo > $@ +b: c; $(FOO) +EOF + +close(MAKEFILE); + +&utouch(-20, 'b'); +&utouch(-10, 'a'); +&touch('c'); + +# TEST 2 + +&run_make_with_options($makefile2, "", &get_logfile); +$answer = "$make_name: `a' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST 3 + +&run_make_with_options($makefile2, "-n", &get_logfile); +$answer = "$make_name: `a' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('a', 'b', 'c'); + +1; diff --git a/tests/scripts/options/dash-q b/tests/scripts/options/dash-q new file mode 100644 index 0000000..56f04a1 --- /dev/null +++ b/tests/scripts/options/dash-q @@ -0,0 +1,57 @@ +# -*-perl-*- +$description = "Test the -q option.\n"; + +$details = "Try various uses of -q and ensure they all give the correct results.\n"; + +# TEST 0 + +run_make_test(' +one: +two: ; +three: ; : +four: ; $(.XY) +five: ; \ + $(.XY) +six: ; \ + $(.XY) + $(.XY) +seven: ; \ + $(.XY) + : foo + $(.XY) +', + '-q one', ''); + +# TEST 1 + +run_make_test(undef, '-q two', ''); + +# TEST 2 + +run_make_test(undef, '-q three', '', 256); + +# TEST 3 + +run_make_test(undef, '-q four', ''); + +# TEST 4 + +run_make_test(undef, '-q five', ''); + +# TEST 5 + +run_make_test(undef, '-q six', ''); + +# TEST 6 + +run_make_test(undef, '-q seven', '', 256); + +# TEST 7 : Savannah bug # 7144 + +run_make_test(' +one:: ; @echo one +one:: ; @echo two +', + '-q', '', 256); + +1; diff --git a/tests/scripts/options/dash-t b/tests/scripts/options/dash-t new file mode 100644 index 0000000..ec27d7a --- /dev/null +++ b/tests/scripts/options/dash-t @@ -0,0 +1,58 @@ +# -*-perl-*- + +$description = "Test the -t option.\n"; + +$details = "Look out for regressions of prior bugs related to -t.\n"; +# That means, nobody has even tried to make the tests below comprehensive + +# TEST 0 +# bug reported by Henning Makholm on 2001-11-03: +# make 3.79.1 touches only interm-[ab] but reports final-[a] as +# 'up to date' without touching them. +# The 'obvious' fix didn't work for double-colon rules, so pay special +# attention to them. + +open(MAKEFILE, "> $makefile"); +print MAKEFILE <<'EOMAKE'; +final-a: interm-a ; echo >> $@ +final-b: interm-b ; echo >> $@ +interm-a:: orig1-a ; echo >> $@ +interm-a:: orig2-a ; echo >> $@ +interm-b:: orig1-b ; echo >> $@ +interm-b:: orig2-b ; echo >> $@ +EOMAKE +close(MAKEFILE); + +&utouch(-30, 'orig1-a','orig2-b'); +&utouch(-20, 'interm-a','interm-b'); +&utouch(-10, 'final-a','final-b'); +&touch('orig2-a','orig1-b'); + +&run_make_with_options($makefile, "-t final-a final-b", &get_logfile); +$answer = "touch interm-a\ntouch final-a\ntouch interm-b\ntouch final-b\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('orig1-a', 'orig2-a', 'interm-a', 'final-a'); +unlink('orig1-b', 'orig2-b', 'interm-b', 'final-b'); + +# TEST 1 +# -t should not touch files with no commands. + +$makefile2 = &get_tmpfile; + +open(MAKEFILE, "> $makefile2"); +print MAKEFILE <<'EOMAKE'; + +PHOOEY: xxx +xxx: ; @: + +EOMAKE +close(MAKEFILE); + +&run_make_with_options($makefile2, "-t", &get_logfile); +$answer = "touch xxx\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('xxx'); + +1; diff --git a/tests/scripts/options/eval b/tests/scripts/options/eval new file mode 100644 index 0000000..06a035c --- /dev/null +++ b/tests/scripts/options/eval @@ -0,0 +1,19 @@ +# -*-perl-*- + +$description = "Test the --eval option."; + +$details = "Verify that --eval options take effect, +and are passed to sub-makes."; + +# Verify that --eval is evaluated first +run_make_test(q! +BAR = bar +all: ; @echo all +recurse: ; @$(MAKE) -f #MAKEFILE# && echo recurse!, + '--eval=\$\(info\ eval\) FOO=\$\(BAR\)', "eval\nall"); + +# Make sure that --eval is handled correctly during recursion +run_make_test(undef, '--no-print-directory --eval=\$\(info\ eval\) recurse', + "eval\neval\nall\nrecurse"); + +1; diff --git a/tests/scripts/options/general b/tests/scripts/options/general new file mode 100644 index 0000000..d35bb35 --- /dev/null +++ b/tests/scripts/options/general @@ -0,0 +1,35 @@ +# -*-perl-*- +$description = "Test generic option processing.\n"; + +open(MAKEFILE, "> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "foo 1foo: ; \@echo \$\@\n"; + +close(MAKEFILE); + +# TEST 0 + +&run_make_with_options($makefile, "-j 1foo", &get_logfile); +if (!$parallel_jobs) { + $answer = "$make_name: Parallel jobs (-j) are not supported on this platform.\n$make_name: Resetting to single job (-j1) mode.\n1foo\n"; +} +else { + $answer = "1foo\n"; +} + +# TEST 1 + +# This test prints the usage string; I don't really know a good way to +# test it. I guess I could invoke make with a known-bad option to see +# what the usage looks like, then compare it to what I get here... :( + +# If I were always on UNIX, I could invoke it with 2>/dev/null, then +# just check the error code. + +&run_make_with_options($makefile, "-j1foo 2>/dev/null", &get_logfile, 512); +$answer = ""; +&compare_output($answer, &get_logfile(1)); + +1; diff --git a/tests/scripts/options/symlinks b/tests/scripts/options/symlinks new file mode 100644 index 0000000..40d2564 --- /dev/null +++ b/tests/scripts/options/symlinks @@ -0,0 +1,68 @@ +# -*-perl-*- + +$description = "Test the -L option."; + +$details = "Verify that symlink handling with and without -L works properly."; + +# Only run these tests if the system sypports symlinks + +# Apparently the Windows port of Perl reports that it does support symlinks +# (in that the symlink() function doesn't fail) but it really doesn't, so +# check for it explicitly. + +if ($port_type eq 'W32' || !( eval { symlink("",""); 1 })) { + # This test is N/A + -1; +} else { + + # Set up a symlink sym -> dep + # We'll make both dep and targ older than sym + $pwd =~ m%/([^/]+)$%; + $dirnm = $1; + &utouch(-10, 'dep'); + &utouch(-5, 'targ'); + symlink("../$dirnm/dep", 'sym'); + + # Without -L, nothing should happen + # With -L, it should update targ + run_make_test('targ: sym ; @echo make $@ from $<', '', + "#MAKE#: `targ' is up to date."); + run_make_test(undef, '-L', "make targ from sym"); + + # Now update dep; in all cases targ should be out of date. + &touch('dep'); + run_make_test(undef, '', "make targ from sym"); + run_make_test(undef, '-L', "make targ from sym"); + + # Now update targ; in all cases targ should be up to date. + &touch('targ'); + run_make_test(undef, '', "#MAKE#: `targ' is up to date."); + run_make_test(undef, '-L', "#MAKE#: `targ' is up to date."); + + # Add in a new link between sym and dep. Be sure it's newer than targ. + sleep(1); + rename('dep', 'dep1'); + symlink('dep1', 'dep'); + + # Without -L, nothing should happen + # With -L, it should update targ + run_make_test(undef, '', "#MAKE#: `targ' is up to date."); + run_make_test(undef, '-L', "make targ from sym"); + + rmfiles('targ', 'dep', 'sym', 'dep1'); + + # Check handling when symlinks point to non-existent files. Without -L we + # should get an error: with -L we should use the timestamp of the symlink. + + symlink("../$dirname/dep", 'sym'); + run_make_test('targ: sym ; @echo make $@ from $<', '', + "#MAKE#: *** No rule to make target `sym', needed by `targ'. Stop.", 512); + + run_make_test('targ: sym ; @echo make $@ from $<', '-L', + 'make targ from sym'); + + + rmfiles('targ', 'sym'); + + 1; +} diff --git a/tests/scripts/options/warn-undefined-variables b/tests/scripts/options/warn-undefined-variables new file mode 100644 index 0000000..34bfaea --- /dev/null +++ b/tests/scripts/options/warn-undefined-variables @@ -0,0 +1,25 @@ +# -*-perl-*- + +$description = "Test the --warn-undefined-variables option."; + +$details = "Verify that warnings are printed for referencing undefined variables."; + +# Without --warn-undefined-variables, nothing should happen +run_make_test(' +EMPTY = +EREF = $(EMPTY) +UREF = $(UNDEFINED) + +SEREF := $(EREF) +SUREF := $(UREF) + +all: ; @echo ref $(EREF) $(UREF)', + '', 'ref'); + +# With --warn-undefined-variables, it should warn me +run_make_test(undef, '--warn-undefined-variables', + "#MAKEFILE#:7: warning: undefined variable `UNDEFINED' +#MAKEFILE#:9: warning: undefined variable `UNDEFINED' +ref"); + +1; diff --git a/tests/scripts/targets/DEFAULT b/tests/scripts/targets/DEFAULT new file mode 100644 index 0000000..0cabde9 --- /dev/null +++ b/tests/scripts/targets/DEFAULT @@ -0,0 +1,53 @@ +$description = "The following test creates a makefile to override part\n" + ."of one Makefile with Another Makefile with the .DEFAULT\n" + ."rule."; + +$details = "This tests the use of the .DEFAULT special target to say that \n" + ."to remake any target that cannot be made fram the information\n" + ."in the containing makefile, make should look in another makefile\n" + ."This test gives this makefile the target bar which is not \n" + ."defined here but passes the target bar on to another makefile\n" + ."which does have the target bar defined.\n"; + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "foo:\n"; +print MAKEFILE "\t\@echo Executing rule FOO\n\n"; +print MAKEFILE ".DEFAULT:\n"; +print MAKEFILE "\t\@\$(MAKE) -f $makefile2 \$\@ \n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + + +open(MAKEFILE,"> $makefile2"); + +print MAKEFILE "bar:\n"; +print MAKEFILE "\t\@echo Executing rule BAR\n\n"; + +close(MAKEFILE); + +&run_make_with_options($makefile,'bar',&get_logfile); + +# Create the answer to what should be produced by this Makefile +$answer = "${make_name}[1]: Entering directory `$pwd'\n" + . "Executing rule BAR\n" + . "${make_name}[1]: Leaving directory `$pwd'\n"; + +# COMPARE RESULTS + +&compare_output($answer,&get_logfile(1)); + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/targets/FORCE b/tests/scripts/targets/FORCE new file mode 100644 index 0000000..eb8f251 --- /dev/null +++ b/tests/scripts/targets/FORCE @@ -0,0 +1,40 @@ +# -*-perl-*- + +$description = "The following tests rules without Commands or Dependencies."; + +$details = "If the rule ...\n"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE ".IGNORE :\n"; +print MAKEFILE "clean: FORCE\n"; +print MAKEFILE "\t$delete_command clean\n"; +print MAKEFILE "FORCE:\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + + +# Create a file named "clean". This is the same name as the target clean +# and tricks the target into thinking that it is up to date. (Unless you +# use the .PHONY target. +&touch("clean"); + +$answer = "$delete_command clean\n"; +&run_make_with_options($makefile,"clean",&get_logfile); + +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + + + + diff --git a/tests/scripts/targets/INTERMEDIATE b/tests/scripts/targets/INTERMEDIATE new file mode 100644 index 0000000..4fdd7a2 --- /dev/null +++ b/tests/scripts/targets/INTERMEDIATE @@ -0,0 +1,108 @@ +# -*-perl-*- + +$description = "Test the behaviour of the .INTERMEDIATE target."; + +$details = "\ +Test the behavior of the .INTERMEDIATE special target. +Create a makefile where a file would not normally be considered +intermediate, then specify it as .INTERMEDIATE. Build and ensure it's +deleted properly. Rebuild to ensure that it's not created if it doesn't +exist but doesn't need to be built. Change the original and ensure +that the intermediate file and the ultimate target are both rebuilt, and +that the intermediate file is again deleted. + +Try this with implicit rules and explicit rules: both should work.\n"; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; + +.INTERMEDIATE: foo.e bar.e + +# Implicit rule test +%.d : %.e ; cp $< $@ +%.e : %.f ; cp $< $@ + +foo.d: foo.e + +# Explicit rule test +foo.c: foo.e bar.e; cat $^ > $@ +EOF + +close(MAKEFILE); + +# TEST #0 + +&utouch(-20, 'foo.f', 'bar.f'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.d\nrm foo.e\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #1 + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "$make_name: `foo.d' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #2 + +&utouch(-10, 'foo.d'); +&touch('foo.f'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.d\nrm foo.e\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #3 + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "cp foo.f foo.e\ncp bar.f bar.e\ncat foo.e bar.e > foo.c\nrm bar.e foo.e\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #4 + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "$make_name: `foo.c' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #5 + +&utouch(-10, 'foo.c'); +&touch('foo.f'); + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "cp foo.f foo.e\ncp bar.f bar.e\ncat foo.e bar.e > foo.c\nrm bar.e foo.e\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #6 -- added for PR/1669: don't remove files mentioned on the cmd line. + +&run_make_with_options($makefile,'foo.e',&get_logfile); +$answer = "cp foo.f foo.e\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('foo.f', 'foo.e', 'foo.d', 'foo.c', 'bar.f', 'bar.e', 'bar.d', 'bar.c'); + +# TEST #7 -- added for PR/1423 + +$makefile2 = &get_tmpfile; + +open(MAKEFILE, "> $makefile2"); + +print MAKEFILE <<'EOF'; +all: foo +foo.a: ; touch $@ +%: %.a ; touch $@ +.INTERMEDIATE: foo.a +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, '-R', &get_logfile); +$answer = "touch foo.a\ntouch foo\nrm foo.a\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('foo'); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/targets/ONESHELL b/tests/scripts/targets/ONESHELL new file mode 100644 index 0000000..997423f --- /dev/null +++ b/tests/scripts/targets/ONESHELL @@ -0,0 +1,69 @@ +# -*-perl-*- + +$description = "Test the behaviour of the .ONESHELL target."; + +$details = ""; + + +# Simple + +run_make_test(q! +.ONESHELL: +all: + a=$$$$ + [ 0"$$a" -eq "$$$$" ] || echo fail +!, + '', 'a=$$ +[ 0"$a" -eq "$$" ] || echo fail +'); + +# Again, but this time with inner prefix chars + +run_make_test(q! +.ONESHELL: +all: + a=$$$$ + @-+ [ 0"$$a" -eq "$$$$" ] || echo fail +!, + '', 'a=$$ +[ 0"$a" -eq "$$" ] || echo fail +'); + +# This time with outer prefix chars + +run_make_test(q! +.ONESHELL: +all: + @a=$$$$ + [ 0"$$a" -eq "$$$$" ] || echo fail +!, + '', ''); + + +# This time with outer and inner prefix chars + +run_make_test(q! +.ONESHELL: +all: + @a=$$$$ + -@ +[ 0"$$a" -eq "$$$$" ] || echo fail +!, + '', ''); + + +# Now try using a different interpreter + +run_make_test(q! +.RECIPEPREFIX = > +.ONESHELL: +SHELL = #PERL# +.SHELLFLAGS = -e +all: +> @$$a=5 +> +7; +> @y=qw(a b c); +>print "a = $$a, y = (@y)\n"; +!, + '', "a = 12, y = (a b c)\n"); + +1; diff --git a/tests/scripts/targets/PHONY b/tests/scripts/targets/PHONY new file mode 100644 index 0000000..c8e2110 --- /dev/null +++ b/tests/scripts/targets/PHONY @@ -0,0 +1,54 @@ +# -*-perl-*- + +$description = "The following tests the use of a PHONY target. It makes\n" + ."sure that the rules under a target get executed even if\n" + ."a filename of the same name of the target exists in the\n" + ."directory.\n"; + +$details = "This makefile in this test declares the target clean to be a \n" + ."PHONY target. We then create a file named \"clean\" in the \n" + ."directory. Although this file exists, the rule under the target\n" + ."clean should still execute because of it's phony status."; + +$example = "EXAMPLE_FILE"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE ".PHONY : clean \n"; +print MAKEFILE "all: \n"; +print MAKEFILE "\t\@echo This makefile did not clean the dir ... good\n"; +print MAKEFILE "clean: \n"; +print MAKEFILE "\t$delete_command $example clean\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch($example); + +# Create a file named "clean". This is the same name as the target clean +# and tricks the target into thinking that it is up to date. (Unless you +# use the .PHONY target. +&touch("clean"); + +$answer = "$delete_command $example clean\n"; +&run_make_with_options($makefile,"clean",&get_logfile); + +if (-f $example) { + $test_passed = 0; +} + +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + + + + diff --git a/tests/scripts/targets/POSIX b/tests/scripts/targets/POSIX new file mode 100644 index 0000000..9c30e18 --- /dev/null +++ b/tests/scripts/targets/POSIX @@ -0,0 +1,33 @@ +# -*-perl-*- + +$description = "Test the behaviour of the .PHONY target."; + +$details = ""; + + +# Ensure turning on .POSIX enables the -e flag for the shell +# We can't assume the exit value of "false" because on different systems it's +# different. + +my $script = 'false; true'; +my $flags = '-ec'; +my $out = `/bin/sh $flags '$script' 2>&1`; +my $err = $? >> 8; +run_make_test(qq! +.POSIX: +all: ; \@$script +!, + '', "#MAKE#: *** [all] Error $err\n", 512); + +# User settings must override .POSIX +$flags = '-xc'; +$out = `/bin/sh $flags '$script' 2>&1`; +run_make_test(qq! +.SHELLFLAGS = $flags +.POSIX: +all: ; \@$script +!, + '', $out); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/targets/SECONDARY b/tests/scripts/targets/SECONDARY new file mode 100644 index 0000000..c954ee9 --- /dev/null +++ b/tests/scripts/targets/SECONDARY @@ -0,0 +1,189 @@ +#! -*-perl-*- + +$description = "Test the behaviour of the .SECONDARY target."; + +$details = "\ +Test the behavior of the .SECONDARY special target. +Create a makefile where a file would not normally be considered +intermediate, then specify it as .SECONDARY. Build and note that it's +not automatically deleted. Delete the file. Rebuild to ensure that +it's not created if it doesn't exist but doesn't need to be built. +Change the original and ensure that the secondary file and the ultimate +target are both rebuilt, and that the secondary file is not deleted. + +Try this with implicit rules and explicit rules: both should work.\n"; + +open(MAKEFILE,"> $makefile"); + +print MAKEFILE <<'EOF'; + +.SECONDARY: foo.e + +# Implicit rule test +%.d : %.e ; cp $< $@ +%.e : %.f ; cp $< $@ + +foo.d: foo.e + +# Explicit rule test +foo.c: foo.e ; cp $< $@ +EOF + +close(MAKEFILE); + +# TEST #1 + +&utouch(-20, 'foo.f'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.d\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #2 + +unlink('foo.e'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "$make_name: `foo.d' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #3 + +&utouch(-10, 'foo.d'); +&touch('foo.f'); + +&run_make_with_options($makefile,'foo.d',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.d\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #4 + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "cp foo.e foo.c\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #5 + +unlink('foo.e'); + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "$make_name: `foo.c' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #6 + +&utouch(-10, 'foo.c'); +&touch('foo.f'); + +&run_make_with_options($makefile,'foo.c',&get_logfile); +$answer = "cp foo.f foo.e\ncp foo.e foo.c\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('foo.f', 'foo.e', 'foo.d', 'foo.c'); + +# TEST #7 -- test the "global" .SECONDARY, with no targets. + +$makefile2 = &get_tmpfile; + +open(MAKEFILE, "> $makefile2"); + +print MAKEFILE <<'EOF'; +.SECONDARY: + +final: intermediate +intermediate: source + +final intermediate source: + echo $< > $@ +EOF + +close(MAKEFILE); + +&utouch(-10, 'source'); +touch('final'); + +&run_make_with_options($makefile2, '', &get_logfile); +$answer = "$make_name: `final' is up to date.\n"; +&compare_output($answer, &get_logfile(1)); + +unlink('source', 'final', 'intermediate'); + + +# TEST #8 -- test the "global" .SECONDARY, with .PHONY. + +touch('version2'); +run_make_test(' +.PHONY: version +.SECONDARY: +version2: version ; @echo GOOD +all: version2', + 'all', 'GOOD'); + +unlink('version2'); + +# TEST #9 -- Savannah bug #15919 +# The original fix for this bug caused a new bug, shown here. + +touch(qw(1.a 2.a)); + +run_make_test(' +%.c : %.b ; cp $< $@ +%.b : %.a ; cp $< $@ +all : 1.c 2.c', '-rR -j', +'cp 1.a 1.b +cp 2.a 2.b +cp 1.b 1.c +cp 2.b 2.c +rm 1.b 2.b'); + +unlink(qw(1.a 2.a 1.c 2.c)); + +# TEST #10 -- Savannah bug #15919 +touch('test.0'); +run_make_test(' +.SECONDARY : test.1 test.2 test.3 + +test : test.4 + +%.4 : %.int %.3 ; touch $@ + +%.int : %.3 %.2 ; touch $@ + +%.3 : | %.2 ; touch $@ + +%.2 : %.1 ; touch $@ + +%.1 : %.0 ; touch $@', '-rR -j 2', +'touch test.1 +touch test.2 +touch test.3 +touch test.int +touch test.4 +rm test.int'); + +# After a touch of test.0 it should give the same output, except we don't need +# to rebuild test.3 (order-only) +sleep(1); +touch('test.0'); +run_make_test(undef, '-rR -j 2', +'touch test.1 +touch test.2 +touch test.int +touch test.4 +rm test.int'); + +# With both test.0 and test.3 updated it should still build everything except +# test.3 +sleep(1); +touch('test.0', 'test.3'); +run_make_test(undef, '-rR -j 2', +'touch test.1 +touch test.2 +touch test.int +touch test.4 +rm test.int'); + +unlink(qw(test.0 test.1 test.2 test.3 test.4)); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/targets/SILENT b/tests/scripts/targets/SILENT new file mode 100644 index 0000000..4bb0a0f --- /dev/null +++ b/tests/scripts/targets/SILENT @@ -0,0 +1,42 @@ +# -*-perl-*- + +$description = "The following tests the special target .SILENT. By simply\n" + ."mentioning this as a target, it tells make not to print\n" + ."commands before executing them."; + +$details = "This test is the same as the clean test except that it should\n" + ."not echo its command before deleting the specified file.\n"; + +$example = "EXAMPLE_FILE"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE ".SILENT : clean\n"; +print MAKEFILE "clean: \n"; +print MAKEFILE "\t$delete_command EXAMPLE_FILE\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch($example); + +$answer = ""; +&run_make_with_options($makefile,"clean",&get_logfile,0); +if (-f $example) { + $test_passed = 0; +} +&compare_output($answer,&get_logfile(1)); + +1; + + + + + + + + + diff --git a/tests/scripts/targets/clean b/tests/scripts/targets/clean new file mode 100644 index 0000000..b32c976 --- /dev/null +++ b/tests/scripts/targets/clean @@ -0,0 +1,50 @@ +# -*-perl-*- + +$description = "The following test creates a makefile to delete a \n" + ."file in the directory. It tests to see if make will \n" + ."NOT execute the command unless the rule is given in \n" + ."the make command line."; + +$example = "EXAMPLE_FILE"; + +open(MAKEFILE,"> $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE "all: \n"; +print MAKEFILE "\t\@echo This makefile did not clean the dir... good\n"; +print MAKEFILE "clean: \n"; +print MAKEFILE "\t$delete_command EXAMPLE_FILE\n"; + +# END of Contents of MAKEFILE + +close(MAKEFILE); + +&touch($example); + + +&run_make_with_options($makefile,"",&get_logfile,0); + +# Create the answer to what should be produced by this Makefile +$answer = "This makefile did not clean the dir... good\n"; + +&compare_output($answer,&get_logfile(1)) || &error ("abort"); + + +$answer = "$delete_command $example\n"; +&run_make_with_options($makefile,"clean",&get_logfile,0); +if (-f $example) { + $test_passed = 0; +} +&compare_output($answer,&get_logfile(1)) || &error ("abort"); + +1; + + + + + + + + + diff --git a/tests/scripts/test_template b/tests/scripts/test_template new file mode 100644 index 0000000..3fd3f95 --- /dev/null +++ b/tests/scripts/test_template @@ -0,0 +1,29 @@ +# -*-perl-*- + +$description = ""; +$details = ""; + +# Run a make test. See the documentation of run_make_test() in +# run_make_tests.pl, but briefly the first argument is a string with the +# contents of a makefile to be tested, the second is a string containing the +# arguments to be passed to the make invocation, the third is a string +# containing the expected output. The fourth is the expected exit code for +# make. If not specified, it's assumed that the make program should succeed +# (exit with 0). + +run_make_test('Your test makefile goes here', + 'Arguments to pass to make go here', + 'Expected output from the invocation goes here'); + +# There are various special tokens, options, etc. See the full documentation +# in run_make_tests.pl. + + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/variables/CURDIR b/tests/scripts/variables/CURDIR new file mode 100644 index 0000000..ee7cacb --- /dev/null +++ b/tests/scripts/variables/CURDIR @@ -0,0 +1,20 @@ +# -*-perl-*- + +$description = "This tests the CURDIR varaible."; + +$details = "Echo CURDIR both with and without -C. Also ensure overrides work."; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE "all: ; \@echo \$(CURDIR)\n"; +close(MAKEFILE); + + +# TEST #1 +# ------- + +&run_make_with_options($makefile,"",&get_logfile); +$answer = "$pwd\n"; +&compare_output($answer,&get_logfile(1)); + + +1; diff --git a/tests/scripts/variables/DEFAULT_GOAL b/tests/scripts/variables/DEFAULT_GOAL new file mode 100644 index 0000000..1c06506 --- /dev/null +++ b/tests/scripts/variables/DEFAULT_GOAL @@ -0,0 +1,87 @@ +# -*-perl-*- +$description = "Test the .DEFAULT_GOAL special variable."; + +$details = ""; + + +# Test #1: basic logic. +# +run_make_test(' +# Basics. +# +foo: ; @: + +ifneq ($(.DEFAULT_GOAL),foo) +$(error ) +endif + +# Reset to empty. +# +.DEFAULT_GOAL := + +bar: ; @: + +ifneq ($(.DEFAULT_GOAL),bar) +$(error ) +endif + +# Change to a different goal. +# + +.DEFAULT_GOAL := baz + +baz: ; @echo $@ +', +'', +'baz'); + + +# Test #2: unknown goal. +# +run_make_test(' +.DEFAULT_GOAL = foo +', +'', +'#MAKE#: *** No rule to make target `foo\'. Stop.', +512); + + +# Test #3: more than one goal. +# +run_make_test(' +.DEFAULT_GOAL := foo bar +', +'', +'#MAKE#: *** .DEFAULT_GOAL contains more than one target. Stop.', +512); + + +# Test #4: Savannah bug #12226. +# +run_make_test(' +define rule +foo: ; @echo $$@ +endef + +define make-rule +$(eval $(rule)) +endef + +$(call make-rule) + +', +'', +'foo'); + +# TEST #5: .DEFAULT_GOAL containing just whitespace (Savannah bug #25697) + +run_make_test(' +N = +.DEFAULT_GOAL = $N $N # Just whitespace + +foo: ; @echo "boo" +', + '', "#MAKE#: *** No targets. Stop.\n", 512); + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/variables/INCLUDE_DIRS b/tests/scripts/variables/INCLUDE_DIRS new file mode 100644 index 0000000..c9662e9 --- /dev/null +++ b/tests/scripts/variables/INCLUDE_DIRS @@ -0,0 +1,46 @@ +# -*-perl-*- +$description = "Test the .INCLUDE_DIRS special variable."; + +$details = ""; + +use Cwd; + +$dir = cwd; +$dir =~ s,.*/([^/]+)$,../$1,; + +# Test #1: The content of .INCLUDE_DIRS depends on the platform for which +# make was built. What we know for sure is that it shouldn't be +# empty. +# +run_make_test(' +ifeq ($(.INCLUDE_DIRS),) +$(warning .INCLUDE_DIRS is empty) +endif + +.PHONY: all +all:;@: +', +'', +''); + + +# Test #2: Make sure -I paths end up in .INCLUDE_DIRS. +# +run_make_test(' +ifeq ($(dir),) +$(warning dir is empty) +endif + +ifeq ($(filter $(dir),$(.INCLUDE_DIRS)),) +$(warning .INCLUDE_DIRS does not contain $(dir)) +endif + +.PHONY: all +all:;@: +', +"-I$dir dir=$dir", +''); + + +# This tells the test driver that the perl test script executed properly. +1; diff --git a/tests/scripts/variables/LIBPATTERNS b/tests/scripts/variables/LIBPATTERNS new file mode 100644 index 0000000..826f2fa --- /dev/null +++ b/tests/scripts/variables/LIBPATTERNS @@ -0,0 +1,38 @@ +# -*-perl-*- + +$description = "Test .LIBPATTERNS special variable."; + +$details = ""; + +# TEST 0: basics + +touch('mtest_foo.a'); + +run_make_test(' +.LIBPATTERNS = mtest_%.a +all: -lfoo ; @echo "build $@ from $<" +', + '', "build all from mtest_foo.a\n"); + +# TEST 1: Handle elements that are not patterns. + +run_make_test(' +.LIBPATTERNS = mtest_foo.a mtest_%.a +all: -lfoo ; @echo "build $@ from $<" +', + '', "#MAKE#: .LIBPATTERNS element `mtest_foo.a' is not a pattern +build all from mtest_foo.a\n"); + +# TEST 2: target-specific override + +# Uncomment this when we add support, see Savannah bug #25703 +# run_make_test(' +# .LIBPATTERNS = mbad_%.a +# all: .LIBPATTERNS += mtest_%.a +# all: -lfoo ; @echo "build $@ from $<" +# ', +# '', "build all from mtest_foo.a\n"); + +unlink('mtest_foo.a'); + +1; diff --git a/tests/scripts/variables/MAKE b/tests/scripts/variables/MAKE new file mode 100644 index 0000000..d1081da --- /dev/null +++ b/tests/scripts/variables/MAKE @@ -0,0 +1,24 @@ +# -*-perl-*- + +$description = "Test proper behavior of the MAKE variable"; + +$details = "DETAILS"; + +run_make_test(q! +TMP := $(MAKE) +MAKE := $(subst X=$(X),,$(MAKE)) +all: + @echo $(TMP) + $(MAKE) -f #MAKEFILE# foo + +foo: + @echo $(MAKE) +!, + '', + "#MAKEPATH#\n#MAKEPATH# -f #MAKEFILE# foo\n" + . "#MAKE#[1]: Entering directory `#PWD#'\n" + . "#MAKEPATH#\n#MAKE#[1]: Leaving directory `#PWD#'\n"); + +rmfiles("foo"); + +1; diff --git a/tests/scripts/variables/MAKECMDGOALS b/tests/scripts/variables/MAKECMDGOALS new file mode 100644 index 0000000..879283b --- /dev/null +++ b/tests/scripts/variables/MAKECMDGOALS @@ -0,0 +1,52 @@ +# -*-perl-*- + +$description = "Test the MAKECMDGOALS variable."; + +$details = "\ +We construct a makefile with various targets, all of which print out +\$(MAKECMDGOALS), then call it different ways."; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE "\ +.DEFAULT all: + \@echo \$(MAKECMDGOALS) +"; +close(MAKEFILE); + +# TEST #1 + +&run_make_with_options($makefile, + "", + &get_logfile, + 0); +$answer = "\n"; +&compare_output($answer,&get_logfile(1)); + +# TEST #2 + +&run_make_with_options($makefile, + "all", + &get_logfile, + 0); +$answer = "all\n"; +&compare_output($answer,&get_logfile(1)); + + +# TEST #3 + +&run_make_with_options($makefile, + "foo bar baz yaz", + &get_logfile, + 0); +$answer = "foo bar baz yaz\nfoo bar baz yaz\nfoo bar baz yaz\nfoo bar baz yaz\n"; +&compare_output($answer,&get_logfile(1)); + + +# This tells the test driver that the perl test script executed properly. +1; + + + + + + diff --git a/tests/scripts/variables/MAKEFILES b/tests/scripts/variables/MAKEFILES new file mode 100644 index 0000000..b23da8e --- /dev/null +++ b/tests/scripts/variables/MAKEFILES @@ -0,0 +1,53 @@ +# -*-perl-*- + +$description = "Test the MAKEFILES variable."; + +$makefile2 = &get_tmpfile; +$makefile3 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE 'all: ; @echo DEFAULT RULE: M2=$(M2) M3=$(M3)', "\n"; +close(MAKEFILE); + + +open(MAKEFILE,"> $makefile2"); +print MAKEFILE < $makefile3"); +print MAKEFILE < $makefile"); + +# The Contents of the MAKEFILE ... + +print MAKEFILE < $@ +bar.x: ; @touch $@ +', + '', 'MAKE_RESTARTS= +#MAKEFILE#:4: foo.x: No such file or directory +MAKE_RESTARTS=1 +foo.x:1: bar.x: No such file or directory +MAKE_RESTARTS=2'); + +rmfiles('foo.x', 'bar.x'); + +# Test multiple restarts and make sure the variable is cleaned up + +run_make_test(' +recurse: + @echo recurse MAKE_RESTARTS=$$MAKE_RESTARTS + @$(MAKE) -f #MAKEFILE# all +all: + @echo all MAKE_RESTARTS=$$MAKE_RESTARTS +$(info MAKE_RESTARTS=$(MAKE_RESTARTS)) +include foo.x +foo.x: ; @echo "include bar.x" > $@ +bar.x: ; @touch $@ +', + '', "MAKE_RESTARTS= +#MAKEFILE#:8: foo.x: No such file or directory +MAKE_RESTARTS=1 +foo.x:1: bar.x: No such file or directory +MAKE_RESTARTS=2 +recurse MAKE_RESTARTS= +MAKE_RESTARTS= +#MAKE#[1]: Entering directory `#PWD#' +all MAKE_RESTARTS= +#MAKE#[1]: Leaving directory `#PWD#'"); + +rmfiles('foo.x', 'bar.x'); + +1; diff --git a/tests/scripts/variables/MFILE_LIST b/tests/scripts/variables/MFILE_LIST new file mode 100644 index 0000000..076e42d --- /dev/null +++ b/tests/scripts/variables/MFILE_LIST @@ -0,0 +1,30 @@ +# -*-perl-*- + +$description = "Test the MAKEFILE_LIST variable."; + +$makefile2 = &get_tmpfile; + +open(MAKEFILE,"> $makefile"); +print MAKEFILE < $makefile2"); +print MAKEFILE "m2 := \$(MAKEFILE_LIST)\n"; +close(MAKEFILE); + + +&run_make_with_options($makefile, "", &get_logfile); +$answer = "$makefile\n$makefile $makefile2\n$makefile $makefile2\n"; +&compare_output($answer,&get_logfile(1)); + +1; diff --git a/tests/scripts/variables/SHELL b/tests/scripts/variables/SHELL new file mode 100644 index 0000000..7b7e7fe --- /dev/null +++ b/tests/scripts/variables/SHELL @@ -0,0 +1,86 @@ +# -*-perl-*- + +$description = "Test proper handling of SHELL."; + +# Find the default value when SHELL is not set. On UNIX it will be /bin/sh, +# but on other platforms who knows? +resetENV(); +delete $ENV{SHELL}; +$mshell = `echo 'all:;\@echo \$(SHELL)' | $make_path -f-`; +chop $mshell; + +# According to POSIX, the value of SHELL in the environment has no impact on +# the value in the makefile. +# Note %extraENV takes precedence over the default value for the shell. + +$extraENV{SHELL} = '/dev/null'; +run_make_test('all:;@echo "$(SHELL)"', '', $mshell); + +# According to POSIX, any value of SHELL set in the makefile should _NOT_ be +# exported to the subshell! I wanted to set SHELL to be $^X (perl) in the +# makefile, but make runs $(SHELL) -c 'commandline' and that doesn't work at +# all when $(SHELL) is perl :-/. So, we just add an extra initial /./ which +# works well on UNIX and seems to work OK on at least some non-UNIX systems. + +$extraENV{SHELL} = $mshell; + +run_make_test("SHELL := /./$mshell\n".' +all:;@echo "$(SHELL) $$SHELL" +', '', "/./$mshell $mshell"); + +# As a GNU make extension, if make's SHELL variable is explicitly exported, +# then we really _DO_ export it. + +$extraENV{SHELL} = $mshell; + +run_make_test("export SHELL := /./$mshell\n".' +all:;@echo "$(SHELL) $$SHELL" +', '', "/./$mshell /./$mshell"); + + +# Test out setting of SHELL, both exported and not, as a target-specific +# variable. + +$extraENV{SHELL} = $mshell; + +run_make_test("all: SHELL := /./$mshell\n".' +all:;@echo "$(SHELL) $$SHELL" +', '', "/./$mshell $mshell"); + +$extraENV{SHELL} = $mshell; + +run_make_test(" +SHELL := /././$mshell +one: two +two: export SHELL := /./$mshell\n".' +one two:;@echo "$@: $(SHELL) $$SHELL" +', '', "two: /./$mshell /./$mshell\none: /././$mshell $mshell\n"); + +# Test .SHELLFLAGS + +# We don't know the output here: on Solaris for example, every line printed +# by the shell in -x mode has a trailing space (!!) +my $script = 'true; true'; +my $flags = '-xc'; +my $out = `/bin/sh $flags '$script' 2>&1`; + +run_make_test(qq! +.SHELLFLAGS = $flags +all: ; \@$script +!, + '', $out); + +# We can't just use "false" because on different systems it provides a +# different exit code--once again Solaris: false exits with 255 not 1 +$script = 'true; false; true'; +$flags = '-xec'; +$out = `/bin/sh $flags '$script' 2>&1`; +my $err = $? >> 8; + +run_make_test(qq! +.SHELLFLAGS = $flags +all: ; \@$script +!, + '', "$out#MAKE#: *** [all] Error $err\n", 512); + +1; diff --git a/tests/scripts/variables/automatic b/tests/scripts/variables/automatic new file mode 100644 index 0000000..33c482d --- /dev/null +++ b/tests/scripts/variables/automatic @@ -0,0 +1,122 @@ +# -*-perl-*- + +$description = "Test automatic variable setting."; + +$details = ""; + +use Cwd; + +$dir = cwd; +$dir =~ s,.*/([^/]+)$,../$1,; + +open(MAKEFILE, "> $makefile"); +print MAKEFILE "dir = $dir\n"; +print MAKEFILE <<'EOF'; +.SUFFIXES: +.SUFFIXES: .x .y .z +$(dir)/foo.x : baz.z $(dir)/bar.y baz.z + @echo '$$@ = $@, $$(@D) = $(@D), $$(@F) = $(@F)' + @echo '$$* = $*, $$(*D) = $(*D), $$(*F) = $(*F)' + @echo '$$< = $<, $$( $makefile2"); +print MAKEFILE "dir = $dir\n"; +print MAKEFILE <<'EOF'; +.SECONDEXPANSION: +.SUFFIXES: +.DEFAULT: ; @echo '$@' + +$(dir)/foo $(dir)/bar: $@.x $$@.x $$$@.x $$$$@.x $$(@D).x $$(@F).x + +$(dir)/x.z $(dir)/y.z: $(dir)/%.z : $@.% $$@.% $$$@.% $$$$@.% $$(@D).% $$(@F).% + +$(dir)/biz: $$(@).x $${@}.x $${@D}.x $${@F}.x +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, "$dir/foo $dir/bar", &get_logfile); +$answer = ".x\n$dir/foo.x\nx\n\$@.x\n$dir.x\nfoo.x\n$dir/bar.x\nbar.x\n"; +&compare_output($answer, &get_logfile(1)); + +&run_make_with_options($makefile2, "$dir/x.z $dir/y.z", &get_logfile); +$answer = ".x\n$dir/x.z.x\nx\n\$@.x\n$dir.x\nx.z.x\n.y\n$dir/y.z.y\n\y\n\$@.y\n$dir.y\ny.z.y\n"; +&compare_output($answer, &get_logfile(1)); + +&run_make_with_options($makefile2, "$dir/biz", &get_logfile); +$answer = "$dir/biz.x\n$dir.x\nbiz.x\n"; +&compare_output($answer, &get_logfile(1)); + +# TEST #2 -- test for Savannah bug #12320. +# +run_make_test(' +.SUFFIXES: .b .src + +mbr.b: mbr.src + @echo $* + +mbr.src: ; @:', + '', + 'mbr'); + +# TEST #3 -- test for Savannah bug #8154 +# Make sure that nonexistent prerequisites are listed in $?, since they are +# considered reasons for the target to be rebuilt. +# +# See also Savannah bugs #16002 and #16051. + +touch('foo'); + +run_make_test(' +foo: bar ; @echo "\$$? = $?" +bar: ;', + '', + '$? = bar'); + +unlink('foo'); + +# TEST #4: ensure prereq ordering is correct when the commmand target has none +# See Savannah bug #21198 + +run_make_test(' +all : A B +all : ; @echo $@ -- $^ -- $< +all : C D +all : E F +A B C D E F G H : ; @: +', + '', "all -- A B C D E F -- A\n"); + +1; diff --git a/tests/scripts/variables/define b/tests/scripts/variables/define new file mode 100644 index 0000000..f91519e --- /dev/null +++ b/tests/scripts/variables/define @@ -0,0 +1,234 @@ +# -*-perl-*- + +$description = "Test define/endef variable assignments."; + +$details = ""; + +# TEST 0: old-style basic define/endef + +run_make_test(' +define multi +@echo hi +echo there +endef + +all: ; $(multi) +', + '', "hi\necho there\nthere\n"); + +# TEST 1: Various new-style define/endef + +run_make_test(' +FOO = foo + +define multi = +echo hi +@echo $(FOO) +endef # this is the end + +define simple := +@echo $(FOO) +endef + +append = @echo a + +define append += + +@echo b +endef + +define cond ?= # this is a conditional +@echo first +endef + +define cond ?= +@echo second +endef + +FOO = there + +all: ; $(multi) + $(simple) + $(append) + $(cond) +', + '', "echo hi\nhi\nthere\nfoo\na\nb\nfirst\n"); + +# TEST 2: define in true section of conditional (containing conditional) + +run_make_test(' +FOO = foo +NAME = def +def = +ifdef BOGUS + define $(subst e,e,$(NAME)) = + ifeq (1,1) + FOO = bar + endif + endef +endif + +$(eval $(def)) +all: ; @echo $(FOO) +', + 'BOGUS=1', "bar\n"); + +# TEST 3: define in false section of conditional (containing conditional) + +run_make_test(undef, '', "foo\n"); + +# TEST 4: nested define (supported?) + +run_make_test(' +define outer + define inner + A = B + endef +endef + +$(eval $(outer)) + +outer: ; @echo $(inner) +', + '', "A = B\n"); + +# TEST 5: NEGATIVE: Missing variable name + +run_make_test(' +NAME = +define $(NAME) = +ouch +endef +all: ; @echo ouch +', + '', "#MAKEFILE#:3: *** empty variable name. Stop.\n", 512); + +# TEST 6: NEGATIVE: extra text after define + +run_make_test(' +NAME = +define NAME = $(NAME) +ouch +endef +all: ; @echo ok +', + '', "#MAKEFILE#:3: extraneous text after `define' directive\nok\n"); + +# TEST 7: NEGATIVE: extra text after endef + +run_make_test(' +NAME = +define NAME = +ouch +endef $(NAME) +all: ; @echo ok +', + '', "#MAKEFILE#:5: extraneous text after `endef' directive\nok\n"); + +# TEST 8: NEGATIVE: missing endef + +run_make_test(' +NAME = +all: ; @echo ok +define NAME = +ouch +endef$(NAME) +', + '', "#MAKEFILE#:4: *** missing `endef', unterminated `define'. Stop.\n", 512); + +# ------------------------- +# Make sure that prefix characters apply properly to define/endef values. +# +# There's a bit of oddness here if you try to use a variable to hold the +# prefix character for a define. Even though something like this: +# +# define foo +# echo bar +# endef +# +# all: ; $(V)$(foo) +# +# (where V=@) can be seen by the user to be obviously different than this: +# +# define foo +# $(V)echo bar +# endef +# +# all: ; $(foo) +# +# and the user thinks it should behave the same as when the "@" is literal +# instead of in a variable, that can't happen because by the time make +# expands the variables for the command line and sees it begins with a "@" it +# can't know anymore whether the prefix character came before the variable +# reference or was included in the first line of the variable reference. + +# TEST #5 +# ------- + +run_make_test(' +define FOO +$(V1)echo hello +$(V2)echo world +endef +all: ; @$(FOO) +', '', 'hello +world'); + +# TEST #6 +# ------- + +run_make_test(undef, 'V1=@ V2=@', 'hello +world'); + +# TEST #7 +# ------- + +run_make_test(' +define FOO +$(V1)echo hello +$(V2)echo world +endef +all: ; $(FOO) +', 'V1=@', 'hello +echo world +world'); + +# TEST #8 +# ------- + +run_make_test(undef, 'V2=@', 'echo hello +hello +world'); + +# TEST #9 +# ------- + +run_make_test(undef, 'V1=@ V2=@', 'hello +world'); + +# TEST #10 +# ------- +# Test the basics; a "@" internally to the variable applies to only one line. +# A "@" before the variable applies to the entire variable. + +run_make_test(' +define FOO +@echo hello +echo world +endef +define BAR +echo hello +echo world +endef + +all: foo bar +foo: ; $(FOO) +bar: ; @$(BAR) +', '', 'hello +echo world +world +hello +world +'); + +1; diff --git a/tests/scripts/variables/flavors b/tests/scripts/variables/flavors new file mode 100644 index 0000000..92feed6 --- /dev/null +++ b/tests/scripts/variables/flavors @@ -0,0 +1,76 @@ +# -*-perl-*- + +$description = "Test various flavors of make variable setting."; + +$details = ""; + +# TEST 0: Recursive + +run_make_test(' +ugh = Goodbye +foo = $(bar) +bar = ${ugh} +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello\n"); + +# TEST 1: Simple + +run_make_test(' +bar = Goodbye +foo := $(bar) +bar = ${ugh} +ugh = Hello +all: ; @echo $(foo) +', + '', "Goodbye\n"); + +# TEST 2: Append to recursive + +run_make_test(' +foo = Hello +ugh = Goodbye +foo += $(bar) +bar = ${ugh} +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello Hello\n"); + +# TEST 3: Append to simple + +run_make_test(' +foo := Hello +ugh = Goodbye +bar = ${ugh} +foo += $(bar) +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello Goodbye\n"); + +# TEST 4: Conditional pre-set + +run_make_test(' +foo = Hello +ugh = Goodbye +bar = ${ugh} +foo ?= $(bar) +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello\n"); + +# TEST 5: Conditional unset + +run_make_test(' +ugh = Goodbye +bar = ${ugh} +foo ?= $(bar) +ugh = Hello +all: ; @echo $(foo) +', + '', "Hello\n"); + +1; diff --git a/tests/scripts/variables/negative b/tests/scripts/variables/negative new file mode 100644 index 0000000..16a72b8 --- /dev/null +++ b/tests/scripts/variables/negative @@ -0,0 +1,46 @@ +# -*-perl-*- + +$description = "Run some negative tests (things that should fail)."; + +# TEST #0 +# Check that non-terminated variable references are detected (and +# reported using the best filename/lineno info +run_make_test(' +foo = bar +x = $(foo +y = $x + +all: ; @echo $y +', + '', '#MAKEFILE#:3: *** unterminated variable reference. Stop.', + 512); + +# TEST #1 +# Bogus variable value passed on the command line. +run_make_test(undef, + 'x=\$\(other', + '#MAKEFILE#:4: *** unterminated variable reference. Stop.', + 512); + +# TEST #2 +# Again, but this time while reading the makefile. +run_make_test(' +foo = bar +x = $(foo +y = $x + +z := $y + +all: ; @echo $y +', + '', '#MAKEFILE#:3: *** unterminated variable reference. Stop.', + 512); + +# TEST #3 +# Bogus variable value passed on the command line. +run_make_test(undef, + 'x=\$\(other', + '#MAKEFILE#:4: *** unterminated variable reference. Stop.', + 512); + +1; diff --git a/tests/scripts/variables/private b/tests/scripts/variables/private new file mode 100644 index 0000000..b4baf5f --- /dev/null +++ b/tests/scripts/variables/private @@ -0,0 +1,78 @@ +# -*-perl-*- + +$description = "Test 'private' variables."; + +$details = ""; + +# 1: Simple verification that private variables are not inherited +&run_make_test(' +a: +F = g +a: F = a +b: private F = b + +a b c: ; @echo $@: F=$(F) +a: b +b: c +', + '', "c: F=a\nb: F=b\na: F=a\n"); + +# 2: Again, but this time we start with "b" so "a"'s variable is not in scope +&run_make_test(undef, 'b', "c: F=g\nb: F=b\n"); + +# 3: Verification with pattern-specific variables +&run_make_test(' +t.a: + +F1 = g +F2 = g +%.a: private F1 = a +%.a: F2 = a + +t.a t.b: ; @echo $@: F1=$(F1) / F2=$(F2) +t.a: t.b +', + '', "t.b: F1=g / F2=a\nt.a: F1=a / F2=a\n"); + +# 4: Test private global variables +&run_make_test(' +a: +private F = g +G := $(F) +a: +b: F = b + +a b: ; @echo $@: F=$(F) / G=$(G) +a: b +', + '', "b: F=b / G=g\na: F= / G=g\n"); + +# 5: Multiple conditions on the same variable. Test export. +delete $ENV{'_X'}; +&run_make_test(' +_X = x +a: export override private _X = a +a: ; @echo _X=$(_X) / _X=$$_X +', + '', "_X=a / _X=a"); + +# 6: Test override. +&run_make_test(undef, '_X=c', "_X=a / _X=a\n"); + +# 7: Ensure keywords still work as targets +&run_make_test(' +a: export override private foo bar +foo bar export override private: ; @echo $@ +', + '', "export\noverride\nprivate\nfoo\nbar\n"); + +# 8: Ensure keywords still work as variables +&run_make_test(' +private = g +a: private = a +a: b +a b: ; @echo $@=$(private) +', + '', "b=a\na=a\n"); + +1; diff --git a/tests/scripts/variables/special b/tests/scripts/variables/special new file mode 100644 index 0000000..a1e15c2 --- /dev/null +++ b/tests/scripts/variables/special @@ -0,0 +1,117 @@ +# -*-perl-*- + +$description = "Test special GNU make variables."; + +$details = ""; + +&run_make_test(' + +X1 := $(sort $(filter FOO BAR,$(.VARIABLES))) + +FOO := foo + +X2 := $(sort $(filter FOO BAR,$(.VARIABLES))) + +BAR := bar + +all: + @echo X1 = $(X1) + @echo X2 = $(X2) + @echo LAST = $(sort $(filter FOO BAR,$(.VARIABLES))) +', + '', "X1 =\nX2 = FOO\nLAST = BAR FOO\n"); + + + +# $makefile2 = &get_tmpfile; +# open(MAKEFILE, "> $makefile2"); + +# print MAKEFILE <<'EOF'; + +# X1 := $(sort $(.TARGETS)) + +# all: foo +# @echo X1 = $(X1) +# @echo X2 = $(X2) +# @echo LAST = $(sort $(.TARGETS)) + +# X2 := $(sort $(.TARGETS)) + +# foo: + +# EOF + +# close(MAKEFILE); + +# # TEST #2 +# # ------- + +# &run_make_with_options($makefile2, "", &get_logfile); +# $answer = "X1 =\nX2 = all\nLAST = all foo\n"; +# &compare_output($answer, &get_logfile(1)); + +# Test the .RECIPEPREFIX variable +&run_make_test(' +define foo +: foo-one \ +foo-two +: foo-three + : foo-four +endef + +orig: ; : orig-one + : orig-two \ +orig-three \ + orig-four \ + orig-five \\\\ + : orig-six + $(foo) + +.RECIPEPREFIX = > +test: ; : test-one +>: test-two \ +test-three \ +>test-four \ +> test-five \\\\ +>: test-six +>$(foo) + +.RECIPEPREFIX = +reset: ; : reset-one + : reset-two \ +reset-three \ + reset-four \ + reset-five \\\\ + : reset-six + $(foo) +', + 'orig test reset', + ': orig-one +: orig-two \ +orig-three \ +orig-four \ + orig-five \\\\ +: orig-six +: foo-one foo-two +: foo-three +: foo-four +: test-one +: test-two \ +test-three \ +test-four \ + test-five \\\\ +: test-six +: foo-one foo-two +: foo-three +: foo-four +: reset-one +: reset-two \ +reset-three \ +reset-four \ + reset-five \\\\ +: reset-six +: foo-one foo-two +: foo-three +: foo-four'); + +1; diff --git a/tests/scripts/variables/undefine b/tests/scripts/variables/undefine new file mode 100644 index 0000000..38707b8 --- /dev/null +++ b/tests/scripts/variables/undefine @@ -0,0 +1,73 @@ +# -*-perl-*- + +$description = "Test variable undefine."; + +$details = ""; + +# TEST 0: basic undefine functionality + +run_make_test(' +a = a +b := b +define c +c +endef + +$(info $(flavor a) $(flavor b) $(flavor c)) + +n := b + +undefine a +undefine $n +undefine c + +$(info $(flavor a) $(flavor b) $(flavor c)) + + +all: ;@: +', +'', "recursive simple recursive\nundefined undefined undefined"); + + +# TEST 1: override + +run_make_test(' +undefine a +override undefine b + +$(info $(flavor a) $(flavor b)) + + +all: ;@: +', +'a=a b=b', "recursive undefined"); + +1; + +# TEST 2: undefine in eval (make sure we undefine from the global var set) + +run_make_test(' +define undef +$(eval undefine $$1) +endef + +a := a +$(call undef,a) +$(info $(flavor a)) + + +all: ;@: +', +'', "undefined"); + + +# TEST 3: Missing variable name + +run_make_test(' +a = +undefine $a +all: ;@echo ouch +', +'', "#MAKEFILE#:3: *** empty variable name. Stop.\n", 512); + +1; diff --git a/tests/test_driver.pl b/tests/test_driver.pl new file mode 100644 index 0000000..dec869d --- /dev/null +++ b/tests/test_driver.pl @@ -0,0 +1,1237 @@ +#!/usr/bin/perl +# -*-perl-*- +# +# Modification history: +# Written 91-12-02 through 92-01-01 by Stephen McGee. +# Modified 92-02-11 through 92-02-22 by Chris Arthur to further generalize. +# +# Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +# 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + + +# Test driver routines used by a number of test suites, including +# those for SCS, make, roll_dir, and scan_deps (?). +# +# this routine controls the whole mess; each test suite sets up a few +# variables and then calls &toplevel, which does all the real work. + +# $Id: test_driver.pl,v 1.30 2010/07/28 05:39:50 psmith Exp $ + + +# The number of test categories we've run +$categories_run = 0; +# The number of test categroies that have passed +$categories_passed = 0; +# The total number of individual tests that have been run +$total_tests_run = 0; +# The total number of individual tests that have passed +$total_tests_passed = 0; +# The number of tests in this category that have been run +$tests_run = 0; +# The number of tests in this category that have passed +$tests_passed = 0; + + +# Yeesh. This whole test environment is such a hack! +$test_passed = 1; + + +# Timeout in seconds. If the test takes longer than this we'll fail it. +$test_timeout = 5; + +# Path to Perl +$perl_name = $^X; + +# %makeENV is the cleaned-out environment. +%makeENV = (); + +# %extraENV are any extra environment variables the tests might want to set. +# These are RESET AFTER EVERY TEST! +%extraENV = (); + +# %origENV is the caller's original environment +%origENV = %ENV; + +sub resetENV +{ + # We used to say "%ENV = ();" but this doesn't work in Perl 5.000 + # through Perl 5.004. It was fixed in Perl 5.004_01, but we don't + # want to require that here, so just delete each one individually. + foreach $v (keys %ENV) { + delete $ENV{$v}; + } + + %ENV = %makeENV; + foreach $v (keys %extraENV) { + $ENV{$v} = $extraENV{$v}; + delete $extraENV{$v}; + } +} + +sub toplevel +{ + # Pull in benign variables from the user's environment + + foreach (# UNIX-specific things + 'TZ', 'TMPDIR', 'HOME', 'USER', 'LOGNAME', 'PATH', + # Purify things + 'PURIFYOPTIONS', + # Windows NT-specific stuff + 'Path', 'SystemRoot', + # DJGPP-specific stuff + 'DJDIR', 'DJGPP', 'SHELL', 'COMSPEC', 'HOSTNAME', 'LFN', + 'FNCASE', '387', 'EMU387', 'GROUP' + ) { + $makeENV{$_} = $ENV{$_} if $ENV{$_}; + } + + # Make sure our compares are not foiled by locale differences + + $makeENV{LC_ALL} = 'C'; + + # Replace the environment with the new one + # + %origENV = %ENV; + + resetENV(); + + $| = 1; # unbuffered output + + $debug = 0; # debug flag + $profile = 0; # profiling flag + $verbose = 0; # verbose mode flag + $detail = 0; # detailed verbosity + $keep = 0; # keep temp files around + $workdir = "work"; # The directory where the test will start running + $scriptdir = "scripts"; # The directory where we find the test scripts + $tmpfilesuffix = "t"; # the suffix used on tmpfiles + $default_output_stack_level = 0; # used by attach_default_output, etc. + $default_input_stack_level = 0; # used by attach_default_input, etc. + $cwd = "."; # don't we wish we knew + $cwdslash = ""; # $cwd . $pathsep, but "" rather than "./" + + &get_osname; # sets $osname, $vos, $pathsep, and $short_filenames + + &set_defaults; # suite-defined + + &parse_command_line (@ARGV); + + print "OS name = `$osname'\n" if $debug; + + $workpath = "$cwdslash$workdir"; + $scriptpath = "$cwdslash$scriptdir"; + + &set_more_defaults; # suite-defined + + &print_banner; + + if (-d $workpath) + { + print "Clearing $workpath...\n"; + &remove_directory_tree("$workpath/") + || &error ("Couldn't wipe out $workpath\n"); + } + else + { + mkdir ($workpath, 0777) || &error ("Couldn't mkdir $workpath: $!\n"); + } + + if (!-d $scriptpath) + { + &error ("Failed to find $scriptpath containing perl test scripts.\n"); + } + + if (@TESTS) + { + print "Making work dirs...\n"; + foreach $test (@TESTS) + { + if ($test =~ /^([^\/]+)\//) + { + $dir = $1; + push (@rmdirs, $dir); + -d "$workpath/$dir" + || mkdir ("$workpath/$dir", 0777) + || &error ("Couldn't mkdir $workpath/$dir: $!\n"); + } + } + } + else + { + print "Finding tests...\n"; + opendir (SCRIPTDIR, $scriptpath) + || &error ("Couldn't opendir $scriptpath: $!\n"); + @dirs = grep (!/^(\..*|CVS|RCS)$/, readdir (SCRIPTDIR) ); + closedir (SCRIPTDIR); + foreach $dir (@dirs) + { + next if ($dir =~ /^(\..*|CVS|RCS)$/ || ! -d "$scriptpath/$dir"); + push (@rmdirs, $dir); + mkdir ("$workpath/$dir", 0777) + || &error ("Couldn't mkdir $workpath/$dir: $!\n"); + opendir (SCRIPTDIR, "$scriptpath/$dir") + || &error ("Couldn't opendir $scriptpath/$dir: $!\n"); + @files = grep (!/^(\..*|CVS|RCS|.*~)$/, readdir (SCRIPTDIR) ); + closedir (SCRIPTDIR); + foreach $test (@files) + { + -d $test and next; + push (@TESTS, "$dir/$test"); + } + } + } + + if (@TESTS == 0) + { + &error ("\nNo tests in $scriptpath, and none were specified.\n"); + } + + print "\n"; + + &run_each_test; + + foreach $dir (@rmdirs) + { + rmdir ("$workpath/$dir"); + } + + $| = 1; + + $categories_failed = $categories_run - $categories_passed; + $total_tests_failed = $total_tests_run - $total_tests_passed; + + if ($total_tests_failed) + { + print "\n$total_tests_failed Test"; + print "s" unless $total_tests_failed == 1; + print " in $categories_failed Categor"; + print ($categories_failed == 1 ? "y" : "ies"); + print " Failed (See .$diffext files in $workdir dir for details) :-(\n\n"; + return 0; + } + else + { + print "\n$total_tests_passed Test"; + print "s" unless $total_tests_passed == 1; + print " in $categories_passed Categor"; + print ($categories_passed == 1 ? "y" : "ies"); + print " Complete ... No Failures :-)\n\n"; + return 1; + } +} + +sub get_osname +{ + # Set up an initial value. In perl5 we can do it the easy way. + $osname = defined($^O) ? $^O : ''; + + # Find a path to Perl + + # See if the filesystem supports long file names with multiple + # dots. DOS doesn't. + $short_filenames = 0; + (open (TOUCHFD, "> fancy.file.name") && close (TOUCHFD)) + || ($short_filenames = 1); + unlink ("fancy.file.name") || ($short_filenames = 1); + + if (! $short_filenames) { + # Thanks go to meyering@cs.utexas.edu (Jim Meyering) for suggesting a + # better way of doing this. (We used to test for existence of a /mnt + # dir, but that apparently fails on an SGI Indigo (whatever that is).) + # Because perl on VOS translates /'s to >'s, we need to test for + # VOSness rather than testing for Unixness (ie, try > instead of /). + + mkdir (".ostest", 0777) || &error ("Couldn't create .ostest: $!\n", 1); + open (TOUCHFD, "> .ostest>ick") && close (TOUCHFD); + chdir (".ostest") || &error ("Couldn't chdir to .ostest: $!\n", 1); + } + + if (! $short_filenames && -f "ick") + { + $osname = "vos"; + $vos = 1; + $pathsep = ">"; + } + else + { + # the following is regrettably knarly, but it seems to be the only way + # to not get ugly error messages if uname can't be found. + # Hmmm, BSD/OS 2.0's uname -a is excessively verbose. Let's try it + # with switches first. + eval "chop (\$osname = `sh -c 'uname -nmsr 2>&1'`)"; + if ($osname =~ /not found/i) + { + $osname = "(something posixy with no uname)"; + } + elsif ($@ ne "" || $?) + { + eval "chop (\$osname = `sh -c 'uname -a 2>&1'`)"; + if ($@ ne "" || $?) + { + $osname = "(something posixy)"; + } + } + $vos = 0; + $pathsep = "/"; + } + + if (! $short_filenames) { + chdir ("..") || &error ("Couldn't chdir to ..: $!\n", 1); + unlink (".ostest>ick"); + rmdir (".ostest") || &error ("Couldn't rmdir .ostest: $!\n", 1); + } +} + +sub parse_command_line +{ + @argv = @_; + + # use @ARGV if no args were passed in + + if (@argv == 0) + { + @argv = @ARGV; + } + + # look at each option; if we don't recognize it, maybe the suite-specific + # command line parsing code will... + + while (@argv) + { + $option = shift @argv; + if ($option =~ /^-debug$/i) + { + print "\nDEBUG ON\n"; + $debug = 1; + } + elsif ($option =~ /^-usage$/i) + { + &print_usage; + exit 0; + } + elsif ($option =~ /^-(h|help)$/i) + { + &print_help; + exit 0; + } + elsif ($option =~ /^-profile$/i) + { + $profile = 1; + } + elsif ($option =~ /^-verbose$/i) + { + $verbose = 1; + } + elsif ($option =~ /^-detail$/i) + { + $detail = 1; + $verbose = 1; + } + elsif ($option =~ /^-keep$/i) + { + $keep = 1; + } + elsif (&valid_option($option)) + { + # The suite-defined subroutine takes care of the option + } + elsif ($option =~ /^-/) + { + print "Invalid option: $option\n"; + &print_usage; + exit 0; + } + else # must be the name of a test + { + $option =~ s/\.pl$//; + push(@TESTS,$option); + } + } +} + +sub max +{ + local($num) = shift @_; + local($newnum); + + while (@_) + { + $newnum = shift @_; + if ($newnum > $num) + { + $num = $newnum; + } + } + + return $num; +} + +sub print_centered +{ + local($width, $string) = @_; + local($pad); + + if (length ($string)) + { + $pad = " " x ( ($width - length ($string) + 1) / 2); + print "$pad$string"; + } +} + +sub print_banner +{ + local($info); + local($line); + local($len); + + $info = "Running tests for $testee on $osname\n"; # $testee is suite-defined + $len = &max (length ($line), length ($testee_version), + length ($banner_info), 73) + 5; + $line = ("-" x $len) . "\n"; + if ($len < 78) + { + $len = 78; + } + + &print_centered ($len, $line); + &print_centered ($len, $info); + &print_centered ($len, $testee_version); # suite-defined + &print_centered ($len, $banner_info); # suite-defined + &print_centered ($len, $line); + print "\n"; +} + +sub run_each_test +{ + $categories_run = 0; + + foreach $testname (sort @TESTS) + { + ++$categories_run; + $suite_passed = 1; # reset by test on failure + $num_of_logfiles = 0; + $num_of_tmpfiles = 0; + $description = ""; + $details = ""; + $old_makefile = undef; + $testname =~ s/^$scriptpath$pathsep//; + $perl_testname = "$scriptpath$pathsep$testname"; + $testname =~ s/(\.pl|\.perl)$//; + $testpath = "$workpath$pathsep$testname"; + # Leave enough space in the extensions to append a number, even + # though it needs to fit into 8+3 limits. + if ($short_filenames) { + $logext = 'l'; + $diffext = 'd'; + $baseext = 'b'; + $runext = 'r'; + $extext = ''; + } else { + $logext = 'log'; + $diffext = 'diff'; + $baseext = 'base'; + $runext = 'run'; + $extext = '.'; + } + $log_filename = "$testpath.$logext"; + $diff_filename = "$testpath.$diffext"; + $base_filename = "$testpath.$baseext"; + $run_filename = "$testpath.$runext"; + $tmp_filename = "$testpath.$tmpfilesuffix"; + + &setup_for_test; # suite-defined + + $output = "........................................................ "; + + substr($output,0,length($testname)) = "$testname "; + + print $output; + + # Run the actual test! + $tests_run = 0; + $tests_passed = 0; + + $code = do $perl_testname; + + $total_tests_run += $tests_run; + $total_tests_passed += $tests_passed; + + # How did it go? + if (!defined($code)) + { + $suite_passed = 0; + if (length ($@)) { + warn "\n*** Test died ($testname): $@\n"; + } else { + warn "\n*** Couldn't run $perl_testname\n"; + } + } + elsif ($code == -1) { + $suite_passed = 0; + } + elsif ($code != 1 && $code != -1) { + $suite_passed = 0; + warn "\n*** Test returned $code\n"; + } + + if ($suite_passed) { + ++$categories_passed; + $status = "ok ($tests_passed passed)"; + for ($i = $num_of_tmpfiles; $i; $i--) + { + &rmfiles ($tmp_filename . &num_suffix ($i) ); + } + + for ($i = $num_of_logfiles ? $num_of_logfiles : 1; $i; $i--) + { + &rmfiles ($log_filename . &num_suffix ($i) ); + &rmfiles ($base_filename . &num_suffix ($i) ); + } + } + elsif (!defined $code || $code > 0) { + $status = "FAILED ($tests_passed/$tests_run passed)"; + } + elsif ($code < 0) { + $status = "N/A"; + --$categories_run; + } + + # If the verbose option has been specified, then a short description + # of each test is printed before displaying the results of each test + # describing WHAT is being tested. + + if ($verbose) + { + if ($detail) + { + print "\nWHAT IS BEING TESTED\n"; + print "--------------------"; + } + print "\n\n$description\n\n"; + } + + # If the detail option has been specified, then the details of HOW + # the test is testing what it says it is testing in the verbose output + # will be displayed here before the results of the test are displayed. + + if ($detail) + { + print "\nHOW IT IS TESTED\n"; + print "----------------"; + print "\n\n$details\n\n"; + } + + print "$status\n"; + } +} + +# If the keep flag is not set, this subroutine deletes all filenames that +# are sent to it. + +sub rmfiles +{ + local(@files) = @_; + + if (!$keep) + { + return (unlink @files); + } + + return 1; +} + +sub print_standard_usage +{ + local($plname,@moreusage) = @_; + local($line); + + print "usage:\t$plname [testname] [-verbose] [-detail] [-keep]\n"; + print "\t\t\t[-profile] [-usage] [-help] [-debug]\n"; + foreach (@moreusage) { + print "\t\t\t$_\n"; + } +} + +sub print_standard_help +{ + local(@morehelp) = @_; + local($line); + local($tline); + local($t) = " "; + + $line = "Test Driver For $testee"; + print "$line\n"; + $line = "=" x length ($line); + print "$line\n"; + + &print_usage; + + print "\ntestname\n" + . "${t}You may, if you wish, run only ONE test if you know the name\n" + . "${t}of that test and specify this name anywhere on the command\n" + . "${t}line. Otherwise ALL existing tests in the scripts directory\n" + . "${t}will be run.\n" + . "-verbose\n" + . "${t}If this option is given, a description of every test is\n" + . "${t}displayed before the test is run. (Not all tests may have\n" + . "${t}descriptions at this time)\n" + . "-detail\n" + . "${t}If this option is given, a detailed description of every\n" + . "${t}test is displayed before the test is run. (Not all tests\n" + . "${t}have descriptions at this time)\n" + . "-profile\n" + . "${t}If this option is given, then the profile file\n" + . "${t}is added to other profiles every time $testee is run.\n" + . "${t}This option only works on VOS at this time.\n" + . "-keep\n" + . "${t}You may give this option if you DO NOT want ANY\n" + . "${t}of the files generated by the tests to be deleted. \n" + . "${t}Without this option, all files generated by the test will\n" + . "${t}be deleted IF THE TEST PASSES.\n" + . "-debug\n" + . "${t}Use this option if you would like to see all of the system\n" + . "${t}calls issued and their return status while running the tests\n" + . "${t}This can be helpful if you're having a problem adding a test\n" + . "${t}to the suite, or if the test fails!\n"; + + foreach $line (@morehelp) + { + $tline = $line; + if (substr ($tline, 0, 1) eq "\t") + { + substr ($tline, 0, 1) = $t; + } + print "$tline\n"; + } +} + +####################################################################### +########### Generic Test Driver Subroutines ########### +####################################################################### + +sub get_caller +{ + local($depth); + local($package); + local($filename); + local($linenum); + + $depth = defined ($_[0]) ? $_[0] : 1; + ($package, $filename, $linenum) = caller ($depth + 1); + return "$filename: $linenum"; +} + +sub error +{ + local($message) = $_[0]; + local($caller) = &get_caller (1); + + if (defined ($_[1])) + { + $caller = &get_caller ($_[1] + 1) . " -> $caller"; + } + + die "$caller: $message"; +} + +sub compare_output +{ + local($answer,$logfile) = @_; + local($slurp, $answer_matched) = ('', 0); + + print "Comparing Output ........ " if $debug; + + $slurp = &read_file_into_string ($logfile); + + # For make, get rid of any time skew error before comparing--too bad this + # has to go into the "generic" driver code :-/ + $slurp =~ s/^.*modification time .*in the future.*\n//gm; + $slurp =~ s/^.*Clock skew detected.*\n//gm; + + ++$tests_run; + + if ($slurp eq $answer) { + $answer_matched = 1; + } else { + # See if it is a slash or CRLF problem + local ($answer_mod, $slurp_mod) = ($answer, $slurp); + + $answer_mod =~ tr,\\,/,; + $answer_mod =~ s,\r\n,\n,gs; + + $slurp_mod =~ tr,\\,/,; + $slurp_mod =~ s,\r\n,\n,gs; + + $answer_matched = ($slurp_mod eq $answer_mod); + + # If it still doesn't match, see if the answer might be a regex. + if (!$answer_matched && $answer =~ m,^/(.+)/$,) { + $answer_matched = ($slurp =~ /$1/); + if (!$answer_matched && $answer_mod =~ m,^/(.+)/$,) { + $answer_matched = ($slurp_mod =~ /$1/); + } + } + } + + if ($answer_matched && $test_passed) + { + print "ok\n" if $debug; + ++$tests_passed; + return 1; + } + + if (! $answer_matched) { + print "DIFFERENT OUTPUT\n" if $debug; + + &create_file (&get_basefile, $answer); + &create_file (&get_runfile, $command_string); + + print "\nCreating Difference File ...\n" if $debug; + + # Create the difference file + + local($command) = "diff -c " . &get_basefile . " " . $logfile; + &run_command_with_output(&get_difffile,$command); + } else { + &rmfiles (); + } + + $suite_passed = 0; + return 0; +} + +sub read_file_into_string +{ + local($filename) = @_; + local($oldslash) = $/; + + undef $/; + + open (RFISFILE, $filename) || return ""; + local ($slurp) = ; + close (RFISFILE); + + $/ = $oldslash; + + return $slurp; +} + +sub attach_default_output +{ + local ($filename) = @_; + local ($code); + + if ($vos) + { + $code = system "++attach_default_output_hack $filename"; + $code == -2 || &error ("adoh death\n", 1); + return 1; + } + + open ("SAVEDOS" . $default_output_stack_level . "out", ">&STDOUT") + || &error ("ado: $! duping STDOUT\n", 1); + open ("SAVEDOS" . $default_output_stack_level . "err", ">&STDERR") + || &error ("ado: $! duping STDERR\n", 1); + + open (STDOUT, "> " . $filename) + || &error ("ado: $filename: $!\n", 1); + open (STDERR, ">&STDOUT") + || &error ("ado: $filename: $!\n", 1); + + $default_output_stack_level++; +} + +# close the current stdout/stderr, and restore the previous ones from +# the "stack." + +sub detach_default_output +{ + local ($code); + + if ($vos) + { + $code = system "++detach_default_output_hack"; + $code == -2 || &error ("ddoh death\n", 1); + return 1; + } + + if (--$default_output_stack_level < 0) + { + &error ("default output stack has flown under!\n", 1); + } + + close (STDOUT); + close (STDERR); + + open (STDOUT, ">&SAVEDOS" . $default_output_stack_level . "out") + || &error ("ddo: $! duping STDOUT\n", 1); + open (STDERR, ">&SAVEDOS" . $default_output_stack_level . "err") + || &error ("ddo: $! duping STDERR\n", 1); + + close ("SAVEDOS" . $default_output_stack_level . "out") + || &error ("ddo: $! closing SCSDOSout\n", 1); + close ("SAVEDOS" . $default_output_stack_level . "err") + || &error ("ddo: $! closing SAVEDOSerr\n", 1); +} + +# This runs a command without any debugging info. +sub _run_command +{ + my $code; + + # We reset this before every invocation. On Windows I think there is only + # one environment, not one per process, so I think that variables set in + # test scripts might leak into subsequent tests if this isn't reset--??? + resetENV(); + + eval { + local $SIG{ALRM} = sub { die "timeout\n"; }; + alarm $test_timeout; + $code = system(@_); + alarm 0; + }; + if ($@) { + # The eval failed. If it wasn't SIGALRM then die. + $@ eq "timeout\n" or die; + + # Timed out. Resend the alarm to our process group to kill the children. + $SIG{ALRM} = 'IGNORE'; + kill -14, $$; + $code = 14; + } + + return $code; +} + +# run one command (passed as a list of arg 0 - n), returning 0 on success +# and nonzero on failure. + +sub run_command +{ + print "\nrun_command: @_\n" if $debug; + my $code = _run_command(@_); + print "run_command returned $code.\n" if $debug; + + return $code; +} + +# run one command (passed as a list of arg 0 - n, with arg 0 being the +# second arg to this routine), returning 0 on success and non-zero on failure. +# The first arg to this routine is a filename to connect to the stdout +# & stderr of the child process. + +sub run_command_with_output +{ + my $filename = shift; + + print "\nrun_command_with_output($filename,$runname): @_\n" if $debug; + &attach_default_output ($filename); + my $code = _run_command(@_); + &detach_default_output; + print "run_command_with_output returned $code.\n" if $debug; + + return $code; +} + +# performs the equivalent of an "rm -rf" on the first argument. Like +# rm, if the path ends in /, leaves the (now empty) directory; otherwise +# deletes it, too. + +sub remove_directory_tree +{ + local ($targetdir) = @_; + local ($nuketop) = 1; + local ($ch); + + $ch = substr ($targetdir, length ($targetdir) - 1); + if ($ch eq "/" || $ch eq $pathsep) + { + $targetdir = substr ($targetdir, 0, length ($targetdir) - 1); + $nuketop = 0; + } + + if (! -e $targetdir) + { + return 1; + } + + &remove_directory_tree_inner ("RDT00", $targetdir) || return 0; + if ($nuketop) + { + rmdir $targetdir || return 0; + } + + return 1; +} + +sub remove_directory_tree_inner +{ + local ($dirhandle, $targetdir) = @_; + local ($object); + local ($subdirhandle); + + opendir ($dirhandle, $targetdir) || return 0; + $subdirhandle = $dirhandle; + $subdirhandle++; + while ($object = readdir ($dirhandle)) + { + if ($object =~ /^(\.\.?|CVS|RCS)$/) + { + next; + } + + $object = "$targetdir$pathsep$object"; + lstat ($object); + + if (-d _ && &remove_directory_tree_inner ($subdirhandle, $object)) + { + rmdir $object || return 0; + } + else + { + unlink $object || return 0; + } + } + closedir ($dirhandle); + return 1; +} + +# We used to use this behavior for this function: +# +#sub touch +#{ +# local (@filenames) = @_; +# local ($now) = time; +# local ($file); +# +# foreach $file (@filenames) +# { +# utime ($now, $now, $file) +# || (open (TOUCHFD, ">> $file") && close (TOUCHFD)) +# || &error ("Couldn't touch $file: $!\n", 1); +# } +# return 1; +#} +# +# But this behaves badly on networked filesystems where the time is +# skewed, because it sets the time of the file based on the _local_ +# host. Normally when you modify a file, it's the _remote_ host that +# determines the modtime, based on _its_ clock. So, instead, now we open +# the file and write something into it to force the remote host to set +# the modtime correctly according to its clock. +# + +sub touch +{ + local ($file); + + foreach $file (@_) { + (open(T, ">> $file") && print(T "\n") && close(T)) + || &error("Couldn't touch $file: $!\n", 1); + } +} + +# Touch with a time offset. To DTRT, call touch() then use stat() to get the +# access/mod time for each file and apply the offset. + +sub utouch +{ + local ($off) = shift; + local ($file); + + &touch(@_); + + local (@s) = stat($_[0]); + + utime($s[8]+$off, $s[9]+$off, @_); +} + +# open a file, write some stuff to it, and close it. + +sub create_file +{ + local ($filename, @lines) = @_; + + open (CF, "> $filename") || &error ("Couldn't open $filename: $!\n", 1); + foreach $line (@lines) + { + print CF $line; + } + close (CF); +} + +# create a directory tree described by an associative array, wherein each +# key is a relative pathname (using slashes) and its associated value is +# one of: +# DIR indicates a directory +# FILE:contents indicates a file, which should contain contents +\n +# LINK:target indicates a symlink, pointing to $basedir/target +# The first argument is the dir under which the structure will be created +# (the dir will be made and/or cleaned if necessary); the second argument +# is the associative array. + +sub create_dir_tree +{ + local ($basedir, %dirtree) = @_; + local ($path); + + &remove_directory_tree ("$basedir"); + mkdir ($basedir, 0777) || &error ("Couldn't mkdir $basedir: $!\n", 1); + + foreach $path (sort keys (%dirtree)) + { + if ($dirtree {$path} =~ /^DIR$/) + { + mkdir ("$basedir/$path", 0777) + || &error ("Couldn't mkdir $basedir/$path: $!\n", 1); + } + elsif ($dirtree {$path} =~ /^FILE:(.*)$/) + { + &create_file ("$basedir/$path", $1 . "\n"); + } + elsif ($dirtree {$path} =~ /^LINK:(.*)$/) + { + symlink ("$basedir/$1", "$basedir/$path") + || &error ("Couldn't symlink $basedir/$path -> $basedir/$1: $!\n", 1); + } + else + { + &error ("Bogus dirtree type: \"$dirtree{$path}\"\n", 1); + } + } + if ($just_setup_tree) + { + die "Tree is setup...\n"; + } +} + +# compare a directory tree with an associative array in the format used +# by create_dir_tree, above. +# The first argument is the dir under which the structure should be found; +# the second argument is the associative array. + +sub compare_dir_tree +{ + local ($basedir, %dirtree) = @_; + local ($path); + local ($i); + local ($bogus) = 0; + local ($contents); + local ($target); + local ($fulltarget); + local ($found); + local (@files); + local (@allfiles); + + opendir (DIR, $basedir) || &error ("Couldn't open $basedir: $!\n", 1); + @allfiles = grep (!/^(\.\.?|CVS|RCS)$/, readdir (DIR) ); + closedir (DIR); + if ($debug) + { + print "dirtree: (%dirtree)\n$basedir: (@allfiles)\n"; + } + + foreach $path (sort keys (%dirtree)) + { + if ($debug) + { + print "Checking $path ($dirtree{$path}).\n"; + } + + $found = 0; + foreach $i (0 .. $#allfiles) + { + if ($allfiles[$i] eq $path) + { + splice (@allfiles, $i, 1); # delete it + if ($debug) + { + print " Zapped $path; files now (@allfiles).\n"; + } + lstat ("$basedir/$path"); + $found = 1; + last; + } + } + + if (!$found) + { + print "compare_dir_tree: $path does not exist.\n"; + $bogus = 1; + next; + } + + if ($dirtree {$path} =~ /^DIR$/) + { + if (-d _ && opendir (DIR, "$basedir/$path") ) + { + @files = readdir (DIR); + closedir (DIR); + @files = grep (!/^(\.\.?|CVS|RCS)$/ && ($_ = "$path/$_"), @files); + push (@allfiles, @files); + if ($debug) + { + print " Read in $path; new files (@files).\n"; + } + } + else + { + print "compare_dir_tree: $path is not a dir.\n"; + $bogus = 1; + } + } + elsif ($dirtree {$path} =~ /^FILE:(.*)$/) + { + if (-l _ || !-f _) + { + print "compare_dir_tree: $path is not a file.\n"; + $bogus = 1; + next; + } + + if ($1 ne "*") + { + $contents = &read_file_into_string ("$basedir/$path"); + if ($contents ne "$1\n") + { + print "compare_dir_tree: $path contains wrong stuff." + . " Is:\n$contentsShould be:\n$1\n"; + $bogus = 1; + } + } + } + elsif ($dirtree {$path} =~ /^LINK:(.*)$/) + { + $target = $1; + if (!-l _) + { + print "compare_dir_tree: $path is not a link.\n"; + $bogus = 1; + next; + } + + $contents = readlink ("$basedir/$path"); + $contents =~ tr/>/\//; + $fulltarget = "$basedir/$target"; + $fulltarget =~ tr/>/\//; + if (!($contents =~ /$fulltarget$/)) + { + if ($debug) + { + $target = $fulltarget; + } + print "compare_dir_tree: $path should be link to $target, " + . "not $contents.\n"; + $bogus = 1; + } + } + else + { + &error ("Bogus dirtree type: \"$dirtree{$path}\"\n", 1); + } + } + + if ($debug) + { + print "leftovers: (@allfiles).\n"; + } + + foreach $file (@allfiles) + { + print "compare_dir_tree: $file should not exist.\n"; + $bogus = 1; + } + + return !$bogus; +} + +# this subroutine generates the numeric suffix used to keep tmp filenames, +# log filenames, etc., unique. If the number passed in is 1, then a null +# string is returned; otherwise, we return ".n", where n + 1 is the number +# we were given. + +sub num_suffix +{ + local($num) = @_; + + if (--$num > 0) { + return "$extext$num"; + } + + return ""; +} + +# This subroutine returns a log filename with a number appended to +# the end corresponding to how many logfiles have been created in the +# current running test. An optional parameter may be passed (0 or 1). +# If a 1 is passed, then it does NOT increment the logfile counter +# and returns the name of the latest logfile. If either no parameter +# is passed at all or a 0 is passed, then the logfile counter is +# incremented and the new name is returned. + +sub get_logfile +{ + local($no_increment) = @_; + + $num_of_logfiles += !$no_increment; + + return ($log_filename . &num_suffix ($num_of_logfiles)); +} + +# This subroutine returns a base (answer) filename with a number +# appended to the end corresponding to how many logfiles (and thus +# base files) have been created in the current running test. +# NO PARAMETERS ARE PASSED TO THIS SUBROUTINE. + +sub get_basefile +{ + return ($base_filename . &num_suffix ($num_of_logfiles)); +} + +# This subroutine returns a difference filename with a number appended +# to the end corresponding to how many logfiles (and thus diff files) +# have been created in the current running test. + +sub get_difffile +{ + return ($diff_filename . &num_suffix ($num_of_logfiles)); +} + +# This subroutine returns a command filename with a number appended +# to the end corresponding to how many logfiles (and thus command files) +# have been created in the current running test. + +sub get_runfile +{ + return ($run_filename . &num_suffix ($num_of_logfiles)); +} + +# just like logfile, only a generic tmp filename for use by the test. +# they are automatically cleaned up unless -keep was used, or the test fails. +# Pass an argument of 1 to return the same filename as the previous call. + +sub get_tmpfile +{ + local($no_increment) = @_; + + $num_of_tmpfiles += !$no_increment; + + return ($tmp_filename . &num_suffix ($num_of_tmpfiles)); +} + +1; diff --git a/variable.c b/variable.c new file mode 100644 index 0000000..915be20 --- /dev/null +++ b/variable.c @@ -0,0 +1,1682 @@ +/* Internals of variables for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" + +#include + +#include "dep.h" +#include "filedef.h" +#include "job.h" +#include "commands.h" +#include "variable.h" +#include "rule.h" +#ifdef WINDOWS32 +#include "pathstuff.h" +#endif +#include "hash.h" + +/* Chain of all pattern-specific variables. */ + +static struct pattern_var *pattern_vars; + +/* Pointer to the last struct in the pack of a specific size, from 1 to 255.*/ + +static struct pattern_var *last_pattern_vars[256]; + +/* Create a new pattern-specific variable struct. The new variable is + inserted into the PATTERN_VARS list in the shortest patterns first + order to support the shortest stem matching (the variables are + matched in the reverse order so the ones with the longest pattern + will be considered first). Variables with the same pattern length + are inserted in the definition order. */ + +struct pattern_var * +create_pattern_var (const char *target, const char *suffix) +{ + register unsigned int len = strlen (target); + register struct pattern_var *p = xmalloc (sizeof (struct pattern_var)); + + if (pattern_vars != 0) + { + if (len < 256 && last_pattern_vars[len] != 0) + { + p->next = last_pattern_vars[len]->next; + last_pattern_vars[len]->next = p; + } + else + { + /* Find the position where we can insert this variable. */ + register struct pattern_var **v; + + for (v = &pattern_vars; ; v = &(*v)->next) + { + /* Insert at the end of the pack so that patterns with the + same length appear in the order they were defined .*/ + + if (*v == 0 || (*v)->len > len) + { + p->next = *v; + *v = p; + break; + } + } + } + } + else + { + pattern_vars = p; + p->next = 0; + } + + p->target = target; + p->len = len; + p->suffix = suffix + 1; + + if (len < 256) + last_pattern_vars[len] = p; + + return p; +} + +/* Look up a target in the pattern-specific variable list. */ + +static struct pattern_var * +lookup_pattern_var (struct pattern_var *start, const char *target) +{ + struct pattern_var *p; + unsigned int targlen = strlen(target); + + for (p = start ? start->next : pattern_vars; p != 0; p = p->next) + { + const char *stem; + unsigned int stemlen; + + if (p->len > targlen) + /* It can't possibly match. */ + continue; + + /* From the lengths of the filename and the pattern parts, + find the stem: the part of the filename that matches the %. */ + stem = target + (p->suffix - p->target - 1); + stemlen = targlen - p->len + 1; + + /* Compare the text in the pattern before the stem, if any. */ + if (stem > target && !strneq (p->target, target, stem - target)) + continue; + + /* Compare the text in the pattern after the stem, if any. + We could test simply using streq, but this way we compare the + first two characters immediately. This saves time in the very + common case where the first character matches because it is a + period. */ + if (*p->suffix == stem[stemlen] + && (*p->suffix == '\0' || streq (&p->suffix[1], &stem[stemlen+1]))) + break; + } + + return p; +} + +/* Hash table of all global variable definitions. */ + +static unsigned long +variable_hash_1 (const void *keyv) +{ + struct variable const *key = (struct variable const *) keyv; + return_STRING_N_HASH_1 (key->name, key->length); +} + +static unsigned long +variable_hash_2 (const void *keyv) +{ + struct variable const *key = (struct variable const *) keyv; + return_STRING_N_HASH_2 (key->name, key->length); +} + +static int +variable_hash_cmp (const void *xv, const void *yv) +{ + struct variable const *x = (struct variable const *) xv; + struct variable const *y = (struct variable const *) yv; + int result = x->length - y->length; + if (result) + return result; + return_STRING_N_COMPARE (x->name, y->name, x->length); +} + +#ifndef VARIABLE_BUCKETS +#define VARIABLE_BUCKETS 523 +#endif +#ifndef PERFILE_VARIABLE_BUCKETS +#define PERFILE_VARIABLE_BUCKETS 23 +#endif +#ifndef SMALL_SCOPE_VARIABLE_BUCKETS +#define SMALL_SCOPE_VARIABLE_BUCKETS 13 +#endif + +static struct variable_set global_variable_set; +static struct variable_set_list global_setlist + = { 0, &global_variable_set, 0 }; +struct variable_set_list *current_variable_set_list = &global_setlist; + +/* Implement variables. */ + +void +init_hash_global_variable_set (void) +{ + hash_init (&global_variable_set.table, VARIABLE_BUCKETS, + variable_hash_1, variable_hash_2, variable_hash_cmp); +} + +/* Define variable named NAME with value VALUE in SET. VALUE is copied. + LENGTH is the length of NAME, which does not need to be null-terminated. + ORIGIN specifies the origin of the variable (makefile, command line + or environment). + If RECURSIVE is nonzero a flag is set in the variable saying + that it should be recursively re-expanded. */ + +struct variable * +define_variable_in_set (const char *name, unsigned int length, + const char *value, enum variable_origin origin, + int recursive, struct variable_set *set, + const struct floc *flocp) +{ + struct variable *v; + struct variable **var_slot; + struct variable var_key; + + if (set == NULL) + set = &global_variable_set; + + var_key.name = (char *) name; + var_key.length = length; + var_slot = (struct variable **) hash_find_slot (&set->table, &var_key); + + if (env_overrides && origin == o_env) + origin = o_env_override; + + v = *var_slot; + if (! HASH_VACANT (v)) + { + if (env_overrides && v->origin == o_env) + /* V came from in the environment. Since it was defined + before the switches were parsed, it wasn't affected by -e. */ + v->origin = o_env_override; + + /* A variable of this name is already defined. + If the old definition is from a stronger source + than this one, don't redefine it. */ + if ((int) origin >= (int) v->origin) + { + if (v->value != 0) + free (v->value); + v->value = xstrdup (value); + if (flocp != 0) + v->fileinfo = *flocp; + else + v->fileinfo.filenm = 0; + v->origin = origin; + v->recursive = recursive; + } + return v; + } + + /* Create a new variable definition and add it to the hash table. */ + + v = xmalloc (sizeof (struct variable)); + v->name = xstrndup (name, length); + v->length = length; + hash_insert_at (&set->table, v, var_slot); + v->value = xstrdup (value); + if (flocp != 0) + v->fileinfo = *flocp; + else + v->fileinfo.filenm = 0; + v->origin = origin; + v->recursive = recursive; + v->special = 0; + v->expanding = 0; + v->exp_count = 0; + v->per_target = 0; + v->append = 0; + v->private_var = 0; + v->export = v_default; + + v->exportable = 1; + if (*name != '_' && (*name < 'A' || *name > 'Z') + && (*name < 'a' || *name > 'z')) + v->exportable = 0; + else + { + for (++name; *name != '\0'; ++name) + if (*name != '_' && (*name < 'a' || *name > 'z') + && (*name < 'A' || *name > 'Z') && !ISDIGIT(*name)) + break; + + if (*name != '\0') + v->exportable = 0; + } + + return v; +} + + +/* Undefine variable named NAME in SET. LENGTH is the length of NAME, which + does not need to be null-terminated. ORIGIN specifies the origin of the + variable (makefile, command line or environment). */ + +static void +free_variable_name_and_value (const void *item); + +void +undefine_variable_in_set (const char *name, unsigned int length, + enum variable_origin origin, + struct variable_set *set) +{ + struct variable *v; + struct variable **var_slot; + struct variable var_key; + + if (set == NULL) + set = &global_variable_set; + + var_key.name = (char *) name; + var_key.length = length; + var_slot = (struct variable **) hash_find_slot (&set->table, &var_key); + + if (env_overrides && origin == o_env) + origin = o_env_override; + + v = *var_slot; + if (! HASH_VACANT (v)) + { + if (env_overrides && v->origin == o_env) + /* V came from in the environment. Since it was defined + before the switches were parsed, it wasn't affected by -e. */ + v->origin = o_env_override; + + /* If the definition is from a stronger source than this one, don't + undefine it. */ + if ((int) origin >= (int) v->origin) + { + hash_delete_at (&set->table, var_slot); + free_variable_name_and_value (v); + } + } +} + +/* If the variable passed in is "special", handle its special nature. + Currently there are two such variables, both used for introspection: + .VARIABLES expands to a list of all the variables defined in this instance + of make. + .TARGETS expands to a list of all the targets defined in this + instance of make. + Returns the variable reference passed in. */ + +#define EXPANSION_INCREMENT(_l) ((((_l) / 500) + 1) * 500) + +static struct variable * +lookup_special_var (struct variable *var) +{ + static unsigned long last_var_count = 0; + + + /* This one actually turns out to be very hard, due to the way the parser + records targets. The way it works is that target information is collected + internally until make knows the target is completely specified. It unitl + it sees that some new construct (a new target or variable) is defined that + it knows the previous one is done. In short, this means that if you do + this: + + all: + + TARGS := $(.TARGETS) + + then $(TARGS) won't contain "all", because it's not until after the + variable is created that the previous target is completed. + + Changing this would be a major pain. I think a less complex way to do it + would be to pre-define the target files as soon as the first line is + parsed, then come back and do the rest of the definition as now. That + would allow $(.TARGETS) to be correct without a major change to the way + the parser works. + + if (streq (var->name, ".TARGETS")) + var->value = build_target_list (var->value); + else + */ + + if (streq (var->name, ".VARIABLES") + && global_variable_set.table.ht_fill != last_var_count) + { + unsigned long max = EXPANSION_INCREMENT (strlen (var->value)); + unsigned long len; + char *p; + struct variable **vp = (struct variable **) global_variable_set.table.ht_vec; + struct variable **end = &vp[global_variable_set.table.ht_size]; + + /* Make sure we have at least MAX bytes in the allocated buffer. */ + var->value = xrealloc (var->value, max); + + /* Walk through the hash of variables, constructing a list of names. */ + p = var->value; + len = 0; + for (; vp < end; ++vp) + if (!HASH_VACANT (*vp)) + { + struct variable *v = *vp; + int l = v->length; + + len += l + 1; + if (len > max) + { + unsigned long off = p - var->value; + + max += EXPANSION_INCREMENT (l + 1); + var->value = xrealloc (var->value, max); + p = &var->value[off]; + } + + memcpy (p, v->name, l); + p += l; + *(p++) = ' '; + } + *(p-1) = '\0'; + + /* Remember how many variables are in our current count. Since we never + remove variables from the list, this is a reliable way to know whether + the list is up to date or needs to be recomputed. */ + + last_var_count = global_variable_set.table.ht_fill; + } + + return var; +} + + +/* Lookup a variable whose name is a string starting at NAME + and with LENGTH chars. NAME need not be null-terminated. + Returns address of the `struct variable' containing all info + on the variable, or nil if no such variable is defined. */ + +struct variable * +lookup_variable (const char *name, unsigned int length) +{ + const struct variable_set_list *setlist; + struct variable var_key; + int is_parent = 0; + + var_key.name = (char *) name; + var_key.length = length; + + for (setlist = current_variable_set_list; + setlist != 0; setlist = setlist->next) + { + const struct variable_set *set = setlist->set; + struct variable *v; + + v = (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key); + if (v && (!is_parent || !v->private_var)) + return v->special ? lookup_special_var (v) : v; + + is_parent |= setlist->next_is_parent; + } + +#ifdef VMS + /* since we don't read envp[] on startup, try to get the + variable via getenv() here. */ + { + char *vname = alloca (length + 1); + char *value; + strncpy (vname, name, length); + vname[length] = 0; + value = getenv (vname); + if (value != 0) + { + char *sptr; + int scnt; + + sptr = value; + scnt = 0; + + while ((sptr = strchr (sptr, '$'))) + { + scnt++; + sptr++; + } + + if (scnt > 0) + { + char *nvalue; + char *nptr; + + nvalue = alloca (strlen (value) + scnt + 1); + sptr = value; + nptr = nvalue; + + while (*sptr) + { + if (*sptr == '$') + { + *nptr++ = '$'; + *nptr++ = '$'; + } + else + { + *nptr++ = *sptr; + } + sptr++; + } + + *nptr = '\0'; + return define_variable (vname, length, nvalue, o_env, 1); + + } + + return define_variable (vname, length, value, o_env, 1); + } + } +#endif /* VMS */ + + return 0; +} + +/* Lookup a variable whose name is a string starting at NAME + and with LENGTH chars in set SET. NAME need not be null-terminated. + Returns address of the `struct variable' containing all info + on the variable, or nil if no such variable is defined. */ + +struct variable * +lookup_variable_in_set (const char *name, unsigned int length, + const struct variable_set *set) +{ + struct variable var_key; + + var_key.name = (char *) name; + var_key.length = length; + + return (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key); +} + +/* Initialize FILE's variable set list. If FILE already has a variable set + list, the topmost variable set is left intact, but the the rest of the + chain is replaced with FILE->parent's setlist. If FILE is a double-colon + rule, then we will use the "root" double-colon target's variable set as the + parent of FILE's variable set. + + If we're READING a makefile, don't do the pattern variable search now, + since the pattern variable might not have been defined yet. */ + +void +initialize_file_variables (struct file *file, int reading) +{ + struct variable_set_list *l = file->variables; + + if (l == 0) + { + l = (struct variable_set_list *) + xmalloc (sizeof (struct variable_set_list)); + l->set = xmalloc (sizeof (struct variable_set)); + hash_init (&l->set->table, PERFILE_VARIABLE_BUCKETS, + variable_hash_1, variable_hash_2, variable_hash_cmp); + file->variables = l; + } + + /* If this is a double-colon, then our "parent" is the "root" target for + this double-colon rule. Since that rule has the same name, parent, + etc. we can just use its variables as the "next" for ours. */ + + if (file->double_colon && file->double_colon != file) + { + initialize_file_variables (file->double_colon, reading); + l->next = file->double_colon->variables; + l->next_is_parent = 0; + return; + } + + if (file->parent == 0) + l->next = &global_setlist; + else + { + initialize_file_variables (file->parent, reading); + l->next = file->parent->variables; + } + l->next_is_parent = 1; + + /* If we're not reading makefiles and we haven't looked yet, see if + we can find pattern variables for this target. */ + + if (!reading && !file->pat_searched) + { + struct pattern_var *p; + + p = lookup_pattern_var (0, file->name); + if (p != 0) + { + struct variable_set_list *global = current_variable_set_list; + + /* We found at least one. Set up a new variable set to accumulate + all the pattern variables that match this target. */ + + file->pat_variables = create_new_variable_set (); + current_variable_set_list = file->pat_variables; + + do + { + /* We found one, so insert it into the set. */ + + struct variable *v; + + if (p->variable.flavor == f_simple) + { + v = define_variable_loc ( + p->variable.name, strlen (p->variable.name), + p->variable.value, p->variable.origin, + 0, &p->variable.fileinfo); + + v->flavor = f_simple; + } + else + { + v = do_variable_definition ( + &p->variable.fileinfo, p->variable.name, + p->variable.value, p->variable.origin, + p->variable.flavor, 1); + } + + /* Also mark it as a per-target and copy export status. */ + v->per_target = p->variable.per_target; + v->export = p->variable.export; + v->private_var = p->variable.private_var; + } + while ((p = lookup_pattern_var (p, file->name)) != 0); + + current_variable_set_list = global; + } + file->pat_searched = 1; + } + + /* If we have a pattern variable match, set it up. */ + + if (file->pat_variables != 0) + { + file->pat_variables->next = l->next; + file->pat_variables->next_is_parent = l->next_is_parent; + l->next = file->pat_variables; + l->next_is_parent = 0; + } +} + +/* Pop the top set off the current variable set list, + and free all its storage. */ + +struct variable_set_list * +create_new_variable_set (void) +{ + register struct variable_set_list *setlist; + register struct variable_set *set; + + set = xmalloc (sizeof (struct variable_set)); + hash_init (&set->table, SMALL_SCOPE_VARIABLE_BUCKETS, + variable_hash_1, variable_hash_2, variable_hash_cmp); + + setlist = (struct variable_set_list *) + xmalloc (sizeof (struct variable_set_list)); + setlist->set = set; + setlist->next = current_variable_set_list; + setlist->next_is_parent = 0; + + return setlist; +} + +static void +free_variable_name_and_value (const void *item) +{ + struct variable *v = (struct variable *) item; + free (v->name); + free (v->value); +} + +void +free_variable_set (struct variable_set_list *list) +{ + hash_map (&list->set->table, free_variable_name_and_value); + hash_free (&list->set->table, 1); + free (list->set); + free (list); +} + +/* Create a new variable set and push it on the current setlist. + If we're pushing a global scope (that is, the current scope is the global + scope) then we need to "push" it the other way: file variable sets point + directly to the global_setlist so we need to replace that with the new one. + */ + +struct variable_set_list * +push_new_variable_scope (void) +{ + current_variable_set_list = create_new_variable_set(); + if (current_variable_set_list->next == &global_setlist) + { + /* It was the global, so instead of new -> &global we want to replace + &global with the new one and have &global -> new, with current still + pointing to &global */ + struct variable_set *set = current_variable_set_list->set; + current_variable_set_list->set = global_setlist.set; + global_setlist.set = set; + current_variable_set_list->next = global_setlist.next; + global_setlist.next = current_variable_set_list; + current_variable_set_list = &global_setlist; + } + return (current_variable_set_list); +} + +void +pop_variable_scope (void) +{ + struct variable_set_list *setlist; + struct variable_set *set; + + /* Can't call this if there's no scope to pop! */ + assert(current_variable_set_list->next != NULL); + + if (current_variable_set_list != &global_setlist) + { + /* We're not pointing to the global setlist, so pop this one. */ + setlist = current_variable_set_list; + set = setlist->set; + current_variable_set_list = setlist->next; + } + else + { + /* This set is the one in the global_setlist, but there is another global + set beyond that. We want to copy that set to global_setlist, then + delete what used to be in global_setlist. */ + setlist = global_setlist.next; + set = global_setlist.set; + global_setlist.set = setlist->set; + global_setlist.next = setlist->next; + global_setlist.next_is_parent = setlist->next_is_parent; + } + + /* Free the one we no longer need. */ + free (setlist); + hash_map (&set->table, free_variable_name_and_value); + hash_free (&set->table, 1); + free (set); +} + +/* Merge FROM_SET into TO_SET, freeing unused storage in FROM_SET. */ + +static void +merge_variable_sets (struct variable_set *to_set, + struct variable_set *from_set) +{ + struct variable **from_var_slot = (struct variable **) from_set->table.ht_vec; + struct variable **from_var_end = from_var_slot + from_set->table.ht_size; + + for ( ; from_var_slot < from_var_end; from_var_slot++) + if (! HASH_VACANT (*from_var_slot)) + { + struct variable *from_var = *from_var_slot; + struct variable **to_var_slot + = (struct variable **) hash_find_slot (&to_set->table, *from_var_slot); + if (HASH_VACANT (*to_var_slot)) + hash_insert_at (&to_set->table, from_var, to_var_slot); + else + { + /* GKM FIXME: delete in from_set->table */ + free (from_var->value); + free (from_var); + } + } +} + +/* Merge SETLIST1 into SETLIST0, freeing unused storage in SETLIST1. */ + +void +merge_variable_set_lists (struct variable_set_list **setlist0, + struct variable_set_list *setlist1) +{ + struct variable_set_list *to = *setlist0; + struct variable_set_list *last0 = 0; + + /* If there's nothing to merge, stop now. */ + if (!setlist1) + return; + + /* This loop relies on the fact that all setlists terminate with the global + setlist (before NULL). If that's not true, arguably we SHOULD die. */ + if (to) + while (setlist1 != &global_setlist && to != &global_setlist) + { + struct variable_set_list *from = setlist1; + setlist1 = setlist1->next; + + merge_variable_sets (to->set, from->set); + + last0 = to; + to = to->next; + } + + if (setlist1 != &global_setlist) + { + if (last0 == 0) + *setlist0 = setlist1; + else + last0->next = setlist1; + } +} + +/* Define the automatic variables, and record the addresses + of their structures so we can change their values quickly. */ + +void +define_automatic_variables (void) +{ +#if defined(WINDOWS32) || defined(__EMX__) + extern char* default_shell; +#else + extern char default_shell[]; +#endif + register struct variable *v; + char buf[200]; + + sprintf (buf, "%u", makelevel); + define_variable_cname (MAKELEVEL_NAME, buf, o_env, 0); + + sprintf (buf, "%s%s%s", + version_string, + (remote_description == 0 || remote_description[0] == '\0') + ? "" : "-", + (remote_description == 0 || remote_description[0] == '\0') + ? "" : remote_description); + define_variable_cname ("MAKE_VERSION", buf, o_default, 0); + +#ifdef __MSDOS__ + /* Allow to specify a special shell just for Make, + and use $COMSPEC as the default $SHELL when appropriate. */ + { + static char shell_str[] = "SHELL"; + const int shlen = sizeof (shell_str) - 1; + struct variable *mshp = lookup_variable ("MAKESHELL", 9); + struct variable *comp = lookup_variable ("COMSPEC", 7); + + /* $(MAKESHELL) overrides $(SHELL) even if -e is in effect. */ + if (mshp) + (void) define_variable (shell_str, shlen, + mshp->value, o_env_override, 0); + else if (comp) + { + /* $(COMSPEC) shouldn't override $(SHELL). */ + struct variable *shp = lookup_variable (shell_str, shlen); + + if (!shp) + (void) define_variable (shell_str, shlen, comp->value, o_env, 0); + } + } +#elif defined(__EMX__) + { + static char shell_str[] = "SHELL"; + const int shlen = sizeof (shell_str) - 1; + struct variable *shell = lookup_variable (shell_str, shlen); + struct variable *replace = lookup_variable ("MAKESHELL", 9); + + /* if $MAKESHELL is defined in the environment assume o_env_override */ + if (replace && *replace->value && replace->origin == o_env) + replace->origin = o_env_override; + + /* if $MAKESHELL is not defined use $SHELL but only if the variable + did not come from the environment */ + if (!replace || !*replace->value) + if (shell && *shell->value && (shell->origin == o_env + || shell->origin == o_env_override)) + { + /* overwrite whatever we got from the environment */ + free(shell->value); + shell->value = xstrdup (default_shell); + shell->origin = o_default; + } + + /* Some people do not like cmd to be used as the default + if $SHELL is not defined in the Makefile. + With -DNO_CMD_DEFAULT you can turn off this behaviour */ +# ifndef NO_CMD_DEFAULT + /* otherwise use $COMSPEC */ + if (!replace || !*replace->value) + replace = lookup_variable ("COMSPEC", 7); + + /* otherwise use $OS2_SHELL */ + if (!replace || !*replace->value) + replace = lookup_variable ("OS2_SHELL", 9); +# else +# warning NO_CMD_DEFAULT: GNU make will not use CMD.EXE as default shell +# endif + + if (replace && *replace->value) + /* overwrite $SHELL */ + (void) define_variable (shell_str, shlen, replace->value, + replace->origin, 0); + else + /* provide a definition if there is none */ + (void) define_variable (shell_str, shlen, default_shell, + o_default, 0); + } + +#endif + + /* This won't override any definition, but it will provide one if there + isn't one there. */ + v = define_variable_cname ("SHELL", default_shell, o_default, 0); +#ifdef __MSDOS__ + v->export = v_export; /* Export always SHELL. */ +#endif + + /* On MSDOS we do use SHELL from environment, since it isn't a standard + environment variable on MSDOS, so whoever sets it, does that on purpose. + On OS/2 we do not use SHELL from environment but we have already handled + that problem above. */ +#if !defined(__MSDOS__) && !defined(__EMX__) + /* Don't let SHELL come from the environment. */ + if (*v->value == '\0' || v->origin == o_env || v->origin == o_env_override) + { + free (v->value); + v->origin = o_file; + v->value = xstrdup (default_shell); + } +#endif + + /* Make sure MAKEFILES gets exported if it is set. */ + v = define_variable_cname ("MAKEFILES", "", o_default, 0); + v->export = v_ifset; + + /* Define the magic D and F variables in terms of + the automatic variables they are variations of. */ + +#ifdef VMS + define_variable_cname ("@D", "$(dir $@)", o_automatic, 1); + define_variable_cname ("%D", "$(dir $%)", o_automatic, 1); + define_variable_cname ("*D", "$(dir $*)", o_automatic, 1); + define_variable_cname ("variables; + + hash_init (&table, VARIABLE_BUCKETS, + variable_hash_1, variable_hash_2, variable_hash_cmp); + + /* Run through all the variable sets in the list, + accumulating variables in TABLE. */ + for (s = set_list; s != 0; s = s->next) + { + struct variable_set *set = s->set; + v_slot = (struct variable **) set->table.ht_vec; + v_end = v_slot + set->table.ht_size; + for ( ; v_slot < v_end; v_slot++) + if (! HASH_VACANT (*v_slot)) + { + struct variable **new_slot; + struct variable *v = *v_slot; + + /* If this is a per-target variable and it hasn't been touched + already then look up the global version and take its export + value. */ + if (v->per_target && v->export == v_default) + { + struct variable *gv; + + gv = lookup_variable_in_set (v->name, strlen(v->name), + &global_variable_set); + if (gv) + v->export = gv->export; + } + + switch (v->export) + { + case v_default: + if (v->origin == o_default || v->origin == o_automatic) + /* Only export default variables by explicit request. */ + continue; + + /* The variable doesn't have a name that can be exported. */ + if (! v->exportable) + continue; + + if (! export_all_variables + && v->origin != o_command + && v->origin != o_env && v->origin != o_env_override) + continue; + break; + + case v_export: + break; + + case v_noexport: + { + /* If this is the SHELL variable and it's not exported, + then add the value from our original environment, if + the original environment defined a value for SHELL. */ + extern struct variable shell_var; + if (streq (v->name, "SHELL") && shell_var.value) + { + v = &shell_var; + break; + } + continue; + } + + case v_ifset: + if (v->origin == o_default) + continue; + break; + } + + new_slot = (struct variable **) hash_find_slot (&table, v); + if (HASH_VACANT (*new_slot)) + hash_insert_at (&table, v, new_slot); + } + } + + makelevel_key.name = MAKELEVEL_NAME; + makelevel_key.length = MAKELEVEL_LENGTH; + hash_delete (&table, &makelevel_key); + + result = result_0 = xmalloc ((table.ht_fill + 2) * sizeof (char *)); + + v_slot = (struct variable **) table.ht_vec; + v_end = v_slot + table.ht_size; + for ( ; v_slot < v_end; v_slot++) + if (! HASH_VACANT (*v_slot)) + { + struct variable *v = *v_slot; + + /* If V is recursively expanded and didn't come from the environment, + expand its value. If it came from the environment, it should + go back into the environment unchanged. */ + if (v->recursive + && v->origin != o_env && v->origin != o_env_override) + { + char *value = recursively_expand_for_file (v, file); +#ifdef WINDOWS32 + if (strcmp(v->name, "Path") == 0 || + strcmp(v->name, "PATH") == 0) + convert_Path_to_windows32(value, ';'); +#endif + *result++ = xstrdup (concat (3, v->name, "=", value)); + free (value); + } + else + { +#ifdef WINDOWS32 + if (strcmp(v->name, "Path") == 0 || + strcmp(v->name, "PATH") == 0) + convert_Path_to_windows32(v->value, ';'); +#endif + *result++ = xstrdup (concat (3, v->name, "=", v->value)); + } + } + + *result = xmalloc (100); + sprintf (*result, "%s=%u", MAKELEVEL_NAME, makelevel + 1); + *++result = 0; + + hash_free (&table, 0); + + return result_0; +} + +static struct variable * +set_special_var (struct variable *var) +{ + if (streq (var->name, RECIPEPREFIX_NAME)) + { + /* The user is resetting the command introduction prefix. This has to + happen immediately, so that subsequent rules are interpreted + properly. */ + cmd_prefix = var->value[0]=='\0' ? RECIPEPREFIX_DEFAULT : var->value[0]; + } + + return var; +} + +/* Given a variable, a value, and a flavor, define the variable. + See the try_variable_definition() function for details on the parameters. */ + +struct variable * +do_variable_definition (const struct floc *flocp, const char *varname, + const char *value, enum variable_origin origin, + enum variable_flavor flavor, int target_var) +{ + const char *p; + char *alloc_value = NULL; + struct variable *v; + int append = 0; + int conditional = 0; + + /* Calculate the variable's new value in VALUE. */ + + switch (flavor) + { + default: + case f_bogus: + /* Should not be possible. */ + abort (); + case f_simple: + /* A simple variable definition "var := value". Expand the value. + We have to allocate memory since otherwise it'll clobber the + variable buffer, and we may still need that if we're looking at a + target-specific variable. */ + p = alloc_value = allocated_variable_expand (value); + break; + case f_conditional: + /* A conditional variable definition "var ?= value". + The value is set IFF the variable is not defined yet. */ + v = lookup_variable (varname, strlen (varname)); + if (v) + return v->special ? set_special_var (v) : v; + + conditional = 1; + flavor = f_recursive; + /* FALLTHROUGH */ + case f_recursive: + /* A recursive variable definition "var = value". + The value is used verbatim. */ + p = value; + break; + case f_append: + { + /* If we have += but we're in a target variable context, we want to + append only with other variables in the context of this target. */ + if (target_var) + { + append = 1; + v = lookup_variable_in_set (varname, strlen (varname), + current_variable_set_list->set); + + /* Don't append from the global set if a previous non-appending + target-specific variable definition exists. */ + if (v && !v->append) + append = 0; + } + else + v = lookup_variable (varname, strlen (varname)); + + if (v == 0) + { + /* There was no old value. + This becomes a normal recursive definition. */ + p = value; + flavor = f_recursive; + } + else + { + /* Paste the old and new values together in VALUE. */ + + unsigned int oldlen, vallen; + const char *val; + char *tp = NULL; + + val = value; + if (v->recursive) + /* The previous definition of the variable was recursive. + The new value is the unexpanded old and new values. */ + flavor = f_recursive; + else + /* The previous definition of the variable was simple. + The new value comes from the old value, which was expanded + when it was set; and from the expanded new value. Allocate + memory for the expansion as we may still need the rest of the + buffer if we're looking at a target-specific variable. */ + val = tp = allocated_variable_expand (val); + + oldlen = strlen (v->value); + vallen = strlen (val); + p = alloc_value = xmalloc (oldlen + 1 + vallen + 1); + memcpy (alloc_value, v->value, oldlen); + alloc_value[oldlen] = ' '; + memcpy (&alloc_value[oldlen + 1], val, vallen + 1); + + if (tp) + free (tp); + } + } + } + +#ifdef __MSDOS__ + /* Many Unix Makefiles include a line saying "SHELL=/bin/sh", but + non-Unix systems don't conform to this default configuration (in + fact, most of them don't even have `/bin'). On the other hand, + $SHELL in the environment, if set, points to the real pathname of + the shell. + Therefore, we generally won't let lines like "SHELL=/bin/sh" from + the Makefile override $SHELL from the environment. But first, we + look for the basename of the shell in the directory where SHELL= + points, and along the $PATH; if it is found in any of these places, + we define $SHELL to be the actual pathname of the shell. Thus, if + you have bash.exe installed as d:/unix/bash.exe, and d:/unix is on + your $PATH, then SHELL=/usr/local/bin/bash will have the effect of + defining SHELL to be "d:/unix/bash.exe". */ + if ((origin == o_file || origin == o_override) + && strcmp (varname, "SHELL") == 0) + { + PATH_VAR (shellpath); + extern char * __dosexec_find_on_path (const char *, char *[], char *); + + /* See if we can find "/bin/sh.exe", "/bin/sh.com", etc. */ + if (__dosexec_find_on_path (p, NULL, shellpath)) + { + char *tp; + + for (tp = shellpath; *tp; tp++) + if (*tp == '\\') + *tp = '/'; + + v = define_variable_loc (varname, strlen (varname), + shellpath, origin, flavor == f_recursive, + flocp); + } + else + { + const char *shellbase, *bslash; + struct variable *pathv = lookup_variable ("PATH", 4); + char *path_string; + char *fake_env[2]; + size_t pathlen = 0; + + shellbase = strrchr (p, '/'); + bslash = strrchr (p, '\\'); + if (!shellbase || bslash > shellbase) + shellbase = bslash; + if (!shellbase && p[1] == ':') + shellbase = p + 1; + if (shellbase) + shellbase++; + else + shellbase = p; + + /* Search for the basename of the shell (with standard + executable extensions) along the $PATH. */ + if (pathv) + pathlen = strlen (pathv->value); + path_string = xmalloc (5 + pathlen + 2 + 1); + /* On MSDOS, current directory is considered as part of $PATH. */ + sprintf (path_string, "PATH=.;%s", pathv ? pathv->value : ""); + fake_env[0] = path_string; + fake_env[1] = 0; + if (__dosexec_find_on_path (shellbase, fake_env, shellpath)) + { + char *tp; + + for (tp = shellpath; *tp; tp++) + if (*tp == '\\') + *tp = '/'; + + v = define_variable_loc (varname, strlen (varname), + shellpath, origin, + flavor == f_recursive, flocp); + } + else + v = lookup_variable (varname, strlen (varname)); + + free (path_string); + } + } + else +#endif /* __MSDOS__ */ +#ifdef WINDOWS32 + if ((origin == o_file || origin == o_override || origin == o_command) + && streq (varname, "SHELL")) + { + extern char *default_shell; + + /* Call shell locator function. If it returns TRUE, then + set no_default_sh_exe to indicate sh was found and + set new value for SHELL variable. */ + + if (find_and_set_default_shell (p)) + { + v = define_variable_in_set (varname, strlen (varname), default_shell, + origin, flavor == f_recursive, + (target_var + ? current_variable_set_list->set + : NULL), + flocp); + no_default_sh_exe = 0; + } + else + { + char *tp = alloc_value; + + alloc_value = allocated_variable_expand (p); + + if (find_and_set_default_shell (alloc_value)) + { + v = define_variable_in_set (varname, strlen (varname), p, + origin, flavor == f_recursive, + (target_var + ? current_variable_set_list->set + : NULL), + flocp); + no_default_sh_exe = 0; + } + else + v = lookup_variable (varname, strlen (varname)); + + if (tp) + free (tp); + } + } + else +#endif + + /* If we are defining variables inside an $(eval ...), we might have a + different variable context pushed, not the global context (maybe we're + inside a $(call ...) or something. Since this function is only ever + invoked in places where we want to define globally visible variables, + make sure we define this variable in the global set. */ + + v = define_variable_in_set (varname, strlen (varname), p, + origin, flavor == f_recursive, + (target_var + ? current_variable_set_list->set : NULL), + flocp); + v->append = append; + v->conditional = conditional; + + if (alloc_value) + free (alloc_value); + + return v->special ? set_special_var (v) : v; +} + +/* Parse P (a null-terminated string) as a variable definition. + + If it is not a variable definition, return NULL. + + If it is a variable definition, return a pointer to the char after the + assignment token and set *FLAVOR to the type of variable assignment. */ + +char * +parse_variable_definition (const char *p, enum variable_flavor *flavor) +{ + int wspace = 0; + + p = next_token (p); + + while (1) + { + int c = *p++; + + /* If we find a comment or EOS, it's not a variable definition. */ + if (c == '\0' || c == '#') + return NULL; + + if (c == '$') + { + /* This begins a variable expansion reference. Make sure we don't + treat chars inside the reference as assignment tokens. */ + char closeparen; + int count; + c = *p++; + if (c == '(') + closeparen = ')'; + else if (c == '{') + closeparen = '}'; + else + /* '$$' or '$X'. Either way, nothing special to do here. */ + continue; + + /* P now points past the opening paren or brace. + Count parens or braces until it is matched. */ + count = 0; + for (; *p != '\0'; ++p) + { + if (*p == c) + ++count; + else if (*p == closeparen && --count < 0) + { + ++p; + break; + } + } + continue; + } + + /* If we find whitespace skip it, and remember we found it. */ + if (isblank ((unsigned char)c)) + { + wspace = 1; + p = next_token (p); + c = *p; + if (c == '\0') + return NULL; + ++p; + } + + + if (c == '=') + { + *flavor = f_recursive; + return (char *)p; + } + + /* Match assignment variants (:=, +=, ?=) */ + if (*p == '=') + { + switch (c) + { + case ':': + *flavor = f_simple; + break; + case '+': + *flavor = f_append; + break; + case '?': + *flavor = f_conditional; + break; + default: + /* If we skipped whitespace, non-assignments means no var. */ + if (wspace) + return NULL; + + /* Might be assignment, or might be $= or #=. Check. */ + continue; + } + return (char *)++p; + } + else if (c == ':') + /* A colon other than := is a rule line, not a variable defn. */ + return NULL; + + /* If we skipped whitespace, non-assignments means no var. */ + if (wspace) + return NULL; + } + + return (char *)p; +} + +/* Try to interpret LINE (a null-terminated string) as a variable definition. + + If LINE was recognized as a variable definition, a pointer to its `struct + variable' is returned. If LINE is not a variable definition, NULL is + returned. */ + +struct variable * +assign_variable_definition (struct variable *v, char *line) +{ + char *beg; + char *end; + enum variable_flavor flavor; + char *name; + + beg = next_token (line); + line = parse_variable_definition (beg, &flavor); + if (!line) + return NULL; + + end = line - (flavor == f_recursive ? 1 : 2); + while (end > beg && isblank ((unsigned char)end[-1])) + --end; + line = next_token (line); + v->value = line; + v->flavor = flavor; + + /* Expand the name, so "$(foo)bar = baz" works. */ + name = alloca (end - beg + 1); + memcpy (name, beg, end - beg); + name[end - beg] = '\0'; + v->name = allocated_variable_expand (name); + + if (v->name[0] == '\0') + fatal (&v->fileinfo, _("empty variable name")); + + return v; +} + +/* Try to interpret LINE (a null-terminated string) as a variable definition. + + ORIGIN may be o_file, o_override, o_env, o_env_override, + or o_command specifying that the variable definition comes + from a makefile, an override directive, the environment with + or without the -e switch, or the command line. + + See the comments for assign_variable_definition(). + + If LINE was recognized as a variable definition, a pointer to its `struct + variable' is returned. If LINE is not a variable definition, NULL is + returned. */ + +struct variable * +try_variable_definition (const struct floc *flocp, char *line, + enum variable_origin origin, int target_var) +{ + struct variable v; + struct variable *vp; + + if (flocp != 0) + v.fileinfo = *flocp; + else + v.fileinfo.filenm = 0; + + if (!assign_variable_definition (&v, line)) + return 0; + + vp = do_variable_definition (flocp, v.name, v.value, + origin, v.flavor, target_var); + + free (v.name); + + return vp; +} + +/* Print information for variable V, prefixing it with PREFIX. */ + +static void +print_variable (const void *item, void *arg) +{ + const struct variable *v = item; + const char *prefix = arg; + const char *origin; + + switch (v->origin) + { + case o_default: + origin = _("default"); + break; + case o_env: + origin = _("environment"); + break; + case o_file: + origin = _("makefile"); + break; + case o_env_override: + origin = _("environment under -e"); + break; + case o_command: + origin = _("command line"); + break; + case o_override: + origin = _("`override' directive"); + break; + case o_automatic: + origin = _("automatic"); + break; + case o_invalid: + default: + abort (); + } + fputs ("# ", stdout); + fputs (origin, stdout); + if (v->private_var) + fputs (" private", stdout); + if (v->fileinfo.filenm) + printf (_(" (from `%s', line %lu)"), + v->fileinfo.filenm, v->fileinfo.lineno); + putchar ('\n'); + fputs (prefix, stdout); + + /* Is this a `define'? */ + if (v->recursive && strchr (v->value, '\n') != 0) + printf ("define %s\n%s\nendef\n", v->name, v->value); + else + { + char *p; + + printf ("%s %s= ", v->name, v->recursive ? v->append ? "+" : "" : ":"); + + /* Check if the value is just whitespace. */ + p = next_token (v->value); + if (p != v->value && *p == '\0') + /* All whitespace. */ + printf ("$(subst ,,%s)", v->value); + else if (v->recursive) + fputs (v->value, stdout); + else + /* Double up dollar signs. */ + for (p = v->value; *p != '\0'; ++p) + { + if (*p == '$') + putchar ('$'); + putchar (*p); + } + putchar ('\n'); + } +} + + +/* Print all the variables in SET. PREFIX is printed before + the actual variable definitions (everything else is comments). */ + +void +print_variable_set (struct variable_set *set, char *prefix) +{ + hash_map_arg (&set->table, print_variable, prefix); + + fputs (_("# variable set hash-table stats:\n"), stdout); + fputs ("# ", stdout); + hash_print_stats (&set->table, stdout); + putc ('\n', stdout); +} + +/* Print the data base of variables. */ + +void +print_variable_data_base (void) +{ + puts (_("\n# Variables\n")); + + print_variable_set (&global_variable_set, ""); + + puts (_("\n# Pattern-specific Variable Values")); + + { + struct pattern_var *p; + int rules = 0; + + for (p = pattern_vars; p != 0; p = p->next) + { + ++rules; + printf ("\n%s :\n", p->target); + print_variable (&p->variable, "# "); + } + + if (rules == 0) + puts (_("\n# No pattern-specific variable values.")); + else + printf (_("\n# %u pattern-specific variable values"), rules); + } +} + + +/* Print all the local variables of FILE. */ + +void +print_file_variables (const struct file *file) +{ + if (file->variables != 0) + print_variable_set (file->variables->set, "# "); +} + +#ifdef WINDOWS32 +void +sync_Path_environment (void) +{ + char *path = allocated_variable_expand ("$(PATH)"); + static char *environ_path = NULL; + + if (!path) + return; + + /* + * If done this before, don't leak memory unnecessarily. + * Free the previous entry before allocating new one. + */ + if (environ_path) + free (environ_path); + + /* + * Create something WINDOWS32 world can grok + */ + convert_Path_to_windows32 (path, ';'); + environ_path = xstrdup (concat (3, "PATH", "=", path)); + putenv (environ_path); + free (path); +} +#endif diff --git a/variable.h b/variable.h new file mode 100644 index 0000000..c215867 --- /dev/null +++ b/variable.h @@ -0,0 +1,231 @@ +/* Definitions for using variables in GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "hash.h" + +/* Codes in a variable definition saying where the definition came from. + Increasing numeric values signify less-overridable definitions. */ +enum variable_origin + { + o_default, /* Variable from the default set. */ + o_env, /* Variable from environment. */ + o_file, /* Variable given in a makefile. */ + o_env_override, /* Variable from environment, if -e. */ + o_command, /* Variable given by user. */ + o_override, /* Variable from an `override' directive. */ + o_automatic, /* Automatic variable -- cannot be set. */ + o_invalid /* Core dump time. */ + }; + +enum variable_flavor + { + f_bogus, /* Bogus (error) */ + f_simple, /* Simple definition (:=) */ + f_recursive, /* Recursive definition (=) */ + f_append, /* Appending definition (+=) */ + f_conditional /* Conditional definition (?=) */ + }; + +/* Structure that represents one variable definition. + Each bucket of the hash table is a chain of these, + chained through `next'. */ + +#define EXP_COUNT_BITS 15 /* This gets all the bitfields into 32 bits */ +#define EXP_COUNT_MAX ((1<1, allow this many self-referential + expansions. */ + enum variable_flavor + flavor ENUM_BITFIELD (3); /* Variable flavor. */ + enum variable_origin + origin ENUM_BITFIELD (3); /* Variable origin. */ + enum variable_export + { + v_export, /* Export this variable. */ + v_noexport, /* Don't export this variable. */ + v_ifset, /* Export it if it has a non-default value. */ + v_default /* Decide in target_environment. */ + } export ENUM_BITFIELD (2); + }; + +/* Structure that represents a variable set. */ + +struct variable_set + { + struct hash_table table; /* Hash table of variables. */ + }; + +/* Structure that represents a list of variable sets. */ + +struct variable_set_list + { + struct variable_set_list *next; /* Link in the chain. */ + struct variable_set *set; /* Variable set. */ + int next_is_parent; /* True if next is a parent target. */ + }; + +/* Structure used for pattern-specific variables. */ + +struct pattern_var + { + struct pattern_var *next; + const char *suffix; + const char *target; + unsigned int len; + struct variable variable; + }; + +extern char *variable_buffer; +extern struct variable_set_list *current_variable_set_list; +extern struct variable *default_goal_var; + +/* expand.c */ +char *variable_buffer_output (char *ptr, const char *string, unsigned int length); +char *variable_expand (const char *line); +char *variable_expand_for_file (const char *line, struct file *file); +char *allocated_variable_expand_for_file (const char *line, struct file *file); +#define allocated_variable_expand(line) \ + allocated_variable_expand_for_file (line, (struct file *) 0) +char *expand_argument (const char *str, const char *end); +char *variable_expand_string (char *line, const char *string, long length); +void install_variable_buffer (char **bufp, unsigned int *lenp); +void restore_variable_buffer (char *buf, unsigned int len); + +/* function.c */ +int handle_function (char **op, const char **stringp); +int pattern_matches (const char *pattern, const char *percent, const char *str); +char *subst_expand (char *o, const char *text, const char *subst, + const char *replace, unsigned int slen, unsigned int rlen, + int by_word); +char *patsubst_expand_pat (char *o, const char *text, const char *pattern, + const char *replace, const char *pattern_percent, + const char *replace_percent); +char *patsubst_expand (char *o, const char *text, char *pattern, char *replace); + +/* expand.c */ +char *recursively_expand_for_file (struct variable *v, struct file *file); +#define recursively_expand(v) recursively_expand_for_file (v, NULL) + +/* variable.c */ +struct variable_set_list *create_new_variable_set (void); +void free_variable_set (struct variable_set_list *); +struct variable_set_list *push_new_variable_scope (void); +void pop_variable_scope (void); +void define_automatic_variables (void); +void initialize_file_variables (struct file *file, int reading); +void print_file_variables (const struct file *file); +void print_variable_set (struct variable_set *set, char *prefix); +void merge_variable_set_lists (struct variable_set_list **to_list, + struct variable_set_list *from_list); +struct variable *do_variable_definition (const struct floc *flocp, + const char *name, const char *value, + enum variable_origin origin, + enum variable_flavor flavor, + int target_var); +char *parse_variable_definition (const char *line, + enum variable_flavor *flavor); +struct variable *assign_variable_definition (struct variable *v, char *line); +struct variable *try_variable_definition (const struct floc *flocp, char *line, + enum variable_origin origin, + int target_var); +void init_hash_global_variable_set (void); +void hash_init_function_table (void); +struct variable *lookup_variable (const char *name, unsigned int length); +struct variable *lookup_variable_in_set (const char *name, unsigned int length, + const struct variable_set *set); + +struct variable *define_variable_in_set (const char *name, unsigned int length, + const char *value, + enum variable_origin origin, + int recursive, + struct variable_set *set, + const struct floc *flocp); + +/* Define a variable in the current variable set. */ + +#define define_variable(n,l,v,o,r) \ + define_variable_in_set((n),(l),(v),(o),(r),\ + current_variable_set_list->set,NILF) + +/* Define a variable with a constant name in the current variable set. */ + +#define define_variable_cname(n,v,o,r) \ + define_variable_in_set((n),(sizeof (n) - 1),(v),(o),(r),\ + current_variable_set_list->set,NILF) + +/* Define a variable with a location in the current variable set. */ + +#define define_variable_loc(n,l,v,o,r,f) \ + define_variable_in_set((n),(l),(v),(o),(r),\ + current_variable_set_list->set,(f)) + +/* Define a variable with a location in the global variable set. */ + +#define define_variable_global(n,l,v,o,r,f) \ + define_variable_in_set((n),(l),(v),(o),(r),NULL,(f)) + +/* Define a variable in FILE's variable set. */ + +#define define_variable_for_file(n,l,v,o,r,f) \ + define_variable_in_set((n),(l),(v),(o),(r),(f)->variables->set,NILF) + +void undefine_variable_in_set (const char *name, unsigned int length, + enum variable_origin origin, + struct variable_set *set); + +/* Remove variable from the current variable set. */ + +#define undefine_variable_global(n,l,o) \ + undefine_variable_in_set((n),(l),(o),NULL) + +/* Warn that NAME is an undefined variable. */ + +#define warn_undefined(n,l) do{\ + if (warn_undefined_variables_flag) \ + error (reading_file, \ + _("warning: undefined variable `%.*s'"), \ + (int)(l), (n)); \ + }while(0) + +char **target_environment (struct file *file); + +struct pattern_var *create_pattern_var (const char *target, + const char *suffix); + +extern int export_all_variables; + +#define MAKELEVEL_NAME "MAKELEVEL" +#define MAKELEVEL_LENGTH (sizeof (MAKELEVEL_NAME) - 1) diff --git a/version.c b/version.c new file mode 100644 index 0000000..a770e22 --- /dev/null +++ b/version.c @@ -0,0 +1,35 @@ +/* Record version and build host architecture for GNU make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +/* We use instead of "config.h" so that a compilation + using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h + (which it would do because make.h was found in $srcdir). */ +#include + +#ifndef MAKE_HOST +# define MAKE_HOST "unknown" +#endif + +char *version_string = VERSION; +char *make_host = MAKE_HOST; + +/* + Local variables: + version-control: never + End: + */ diff --git a/vmsdir.h b/vmsdir.h new file mode 100644 index 0000000..cb17818 --- /dev/null +++ b/vmsdir.h @@ -0,0 +1,77 @@ +/* dirent.h for vms +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef VMSDIR_H +#define VMSDIR_H + +#include + +#define MAXNAMLEN 255 + +#ifndef __DECC +#if !defined (__GNUC__) && !defined (__ALPHA) +typedef unsigned long u_long; +typedef unsigned short u_short; +#endif +#endif + +struct direct +{ + off_t d_off; + u_long d_fileno; + u_short d_reclen; + u_short d_namlen; + char d_name[MAXNAMLEN + 1]; +}; + +#undef DIRSIZ +#define DIRSIZ(dp) \ + (((sizeof (struct direct) \ + - (MAXNAMLEN+1) \ + + ((dp)->d_namlen+1)) \ + + 3) & ~3) + +#define d_ino d_fileno /* compatability */ + + +/* + * Definitions for library routines operating on directories. + */ + +typedef struct DIR +{ + struct direct dir; + char d_result[MAXNAMLEN + 1]; +#if defined (__ALPHA) || defined (__DECC) + struct FAB fab; +#else + struct fabdef fab; +#endif +} DIR; + +#ifndef NULL +#define NULL 0 +#endif + +#define rewinddir(dirp) seekdir((dirp), (long)0) + +DIR *opendir (); +struct direct *readdir (DIR *dfd); +int closedir (DIR *dfd); +const char *vmsify (const char *name, int type); + +#endif /* VMSDIR_H */ diff --git a/vmsfunctions.c b/vmsfunctions.c new file mode 100644 index 0000000..5b867d9 --- /dev/null +++ b/vmsfunctions.c @@ -0,0 +1,262 @@ +/* VMS functions +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "debug.h" +#include "job.h" + +#ifdef __DECC +#include +#endif +#include +#include +#include +#include +#include +#include "vmsdir.h" + +#ifdef HAVE_VMSDIR_H + +DIR * +opendir (char *dspec) +{ + struct DIR *dir = xcalloc (sizeof (struct DIR)); + struct NAM *dnam = xmalloc (sizeof (struct NAM)); + struct FAB *dfab = &dir->fab; + char *searchspec = xmalloc (MAXNAMLEN + 1); + + *dfab = cc$rms_fab; + *dnam = cc$rms_nam; + sprintf (searchspec, "%s*.*;", dspec); + + dfab->fab$l_fna = searchspec; + dfab->fab$b_fns = strlen (searchspec); + dfab->fab$l_nam = dnam; + + *dnam = cc$rms_nam; + dnam->nam$l_esa = searchspec; + dnam->nam$b_ess = MAXNAMLEN; + + if (! (sys$parse (dfab) & 1)) + { + free (dir); + free (dnam); + free (searchspec); + return (NULL); + } + + return dir; +} + +#define uppercasify(str) \ + do \ + { \ + char *tmp; \ + for (tmp = (str); *tmp != '\0'; tmp++) \ + if (islower ((unsigned char)*tmp)) \ + *tmp = toupper ((unsigned char)*tmp); \ + } \ + while (0) + +struct direct * +readdir (DIR *dir) +{ + struct FAB *dfab = &dir->fab; + struct NAM *dnam = (struct NAM *)(dfab->fab$l_nam); + struct direct *dentry = &dir->dir; + int i; + + memset (dentry, 0, sizeof *dentry); + + dnam->nam$l_rsa = dir->d_result; + dnam->nam$b_rss = MAXNAMLEN; + + DB (DB_VERBOSE, (".")); + + if (!((i = sys$search (dfab)) & 1)) + { + DB (DB_VERBOSE, (_("sys$search() failed with %d\n"), i)); + return (NULL); + } + + dentry->d_off = 0; + if (dnam->nam$w_fid == 0) + dentry->d_fileno = 1; + else + dentry->d_fileno = dnam->nam$w_fid[0] + (dnam->nam$w_fid[1] << 16); + + dentry->d_reclen = sizeof (struct direct); + dentry->d_namlen = dnam->nam$b_name + dnam->nam$b_type; + strncpy (dentry->d_name, dnam->nam$l_name, dentry->d_namlen); + dentry->d_name[dentry->d_namlen] = '\0'; + +#ifdef HAVE_CASE_INSENSITIVE_FS + uppercasify (dentry->d_name); +#endif + + return (dentry); +} + +int +closedir (DIR *dir) +{ + if (dir != NULL) + { + struct FAB *dfab = &dir->fab; + struct NAM *dnam = (struct NAM *)(dfab->fab$l_nam); + if (dnam != NULL) + free (dnam->nam$l_esa); + free (dnam); + free (dir); + } + + return 0; +} +#endif /* compiled for OpenVMS prior to V7.x */ + +char * +getwd (char *cwd) +{ + static char buf[512]; + + if (cwd) + return (getcwd (cwd, 512)); + else + return (getcwd (buf, 512)); +} + +#if 0 +/* + * Is this used? I don't see any reference, so I suggest to remove it. + */ +int +vms_stat (char *name, struct stat *buf) +{ + int status; + int i; + + static struct FAB Fab; + static struct NAM Nam; + static struct fibdef Fib; /* short fib */ + static struct dsc$descriptor FibDesc = + { sizeof (Fib), DSC$K_DTYPE_Z, DSC$K_CLASS_S, (char *) &Fib }; + static struct dsc$descriptor_s DevDesc = + { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &Nam.nam$t_dvi[1] }; + static char EName[NAM$C_MAXRSS]; + static char RName[NAM$C_MAXRSS]; + static struct dsc$descriptor_s FileName = + { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0 }; + static struct dsc$descriptor_s string = + { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0 }; + static unsigned long Rdate[2]; + static unsigned long Cdate[2]; + static struct atrdef Atr[] = + { +#if defined(VAX) + /* Revision date */ + { sizeof (Rdate), ATR$C_REVDATE, (unsigned int) &Rdate[0] }, + /* Creation date */ + { sizeof (Cdate), ATR$C_CREDATE, (unsigned int) &Cdate[0] }, +#else + /* Revision date */ + { sizeof (Rdate), ATR$C_REVDATE, &Rdate[0] }, + /* Creation date */ + { sizeof (Cdate), ATR$C_CREDATE, &Cdate[0]}, +#endif + { 0, 0, 0 } + }; + static short int DevChan; + static short int iosb[4]; + + name = vmsify (name, 0); + + /* initialize RMS structures, we need a NAM to retrieve the FID */ + Fab = cc$rms_fab; + Fab.fab$l_fna = name; /* name of file */ + Fab.fab$b_fns = strlen (name); + Fab.fab$l_nam = &Nam; /* FAB has an associated NAM */ + + Nam = cc$rms_nam; + Nam.nam$l_esa = EName; /* expanded filename */ + Nam.nam$b_ess = sizeof (EName); + Nam.nam$l_rsa = RName; /* resultant filename */ + Nam.nam$b_rss = sizeof (RName); + + /* do $PARSE and $SEARCH here */ + status = sys$parse (&Fab); + if (!(status & 1)) + return -1; + + DevDesc.dsc$w_length = Nam.nam$t_dvi[0]; + status = sys$assign (&DevDesc, &DevChan, 0, 0); + if (!(status & 1)) + return -1; + + FileName.dsc$a_pointer = Nam.nam$l_name; + FileName.dsc$w_length = Nam.nam$b_name + Nam.nam$b_type + Nam.nam$b_ver; + + /* Initialize the FIB */ + for (i = 0; i < 3; i++) + { +#ifndef __VAXC + Fib.fib$w_fid[i] = Nam.nam$w_fid[i]; + Fib.fib$w_did[i] = Nam.nam$w_did[i]; +#else + Fib.fib$r_fid_overlay.fib$w_fid[i] = Nam.nam$w_fid[i]; + Fib.fib$r_did_overlay.fib$w_did[i] = Nam.nam$w_did[i]; +#endif + } + + status = sys$qiow (0, DevChan, IO$_ACCESS, &iosb, 0, 0, + &FibDesc, &FileName, 0, 0, &Atr, 0); + sys$dassgn (DevChan); + if (!(status & 1)) + return -1; + status = iosb[0]; + if (!(status & 1)) + return -1; + + status = stat (name, buf); + if (status) + return -1; + + buf->st_mtime = ((Rdate[0] >> 24) & 0xff) + ((Rdate[1] << 8) & 0xffffff00); + buf->st_ctime = ((Cdate[0] >> 24) & 0xff) + ((Cdate[1] << 8) & 0xffffff00); + + return 0; +} +#endif + +char * +cvt_time (unsigned long tval) +{ + static long int date[2]; + static char str[27]; + static struct dsc$descriptor date_str = + { 26, DSC$K_DTYPE_T, DSC$K_CLASS_S, str }; + + date[0] = (tval & 0xff) << 24; + date[1] = ((tval >> 8) & 0xffffff); + + if ((date[0] == 0) && (date[1] == 0)) + return ("never"); + + sys$asctim (0, &date_str, date, 0); + str[26] = '\0'; + + return (str); +} diff --git a/vmsify.c b/vmsify.c new file mode 100644 index 0000000..f58fee7 --- /dev/null +++ b/vmsify.c @@ -0,0 +1,1005 @@ +/* vmsify.c -- Module for vms <-> unix file name conversion +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +/* Written by Klaus Kämpf (kkaempf@progis.de) + of proGIS Software, Aachen, Germany */ + + +#include +#include +#include + +#if VMS +#include +#include +#include +#include +#include +#include +#include +#include +/* Initialize a string descriptor (struct dsc$descriptor_s) for an + arbitrary string. ADDR is a pointer to the first character + of the string, and LEN is the length of the string. */ + +#define INIT_DSC_S(dsc, addr, len) do { \ + (dsc).dsc$b_dtype = DSC$K_DTYPE_T; \ + (dsc).dsc$b_class = DSC$K_CLASS_S; \ + (dsc).dsc$w_length = (len); \ + (dsc).dsc$a_pointer = (addr); \ +} while (0) + +/* Initialize a string descriptor (struct dsc$descriptor_s) for a + NUL-terminated string. S is a pointer to the string; the length + is determined by calling strlen(). */ + +#define INIT_DSC_CSTRING(dsc, s) INIT_DSC_S(dsc, s, strlen(s)) +#endif + +/* + copy 'from' to 'to' up to but not including 'upto' + return 0 if eos on from + return 1 if upto found + + return 'to' at last char + 1 + return 'from' at match + 1 or eos if no match + + if as_dir == 1, change all '.' to '_' + else change all '.' but the last to '_' +*/ + +static int +copyto (char **to, const char **from, char upto, int as_dir) +{ + const char *s; + + s = strrchr (*from, '.'); + + while (**from) + { + if (**from == upto) + { + do + { + (*from)++; + } + while (**from == upto); + return 1; + } + if (**from == '.') + { + if ((as_dir == 1) + || (*from != s)) + **to = '_'; + else + **to = '.'; + } + else + { +#ifdef HAVE_CASE_INSENSITIVE_FS + if (isupper ((unsigned char)**from)) + **to = tolower ((unsigned char)**from); + else +#endif + **to = **from; + } + (*to)++; + (*from)++; + } + + return 0; +} + + +/* + get translation of logical name + +*/ + +static char * +trnlog (const char *name) +{ + int stat; + static char reslt[1024]; + $DESCRIPTOR (reslt_dsc, reslt); + short resltlen; + struct dsc$descriptor_s name_dsc; + char *s; + + /* + * the string isn't changed, but there is no string descriptor with + * "const char *dsc$a_pointer" + */ + INIT_DSC_CSTRING (name_dsc, (char *)name); + + stat = lib$sys_trnlog (&name_dsc, &resltlen, &reslt_dsc); + + if ((stat&1) == 0) + { + return ""; + } + if (stat == SS$_NOTRAN) + { + return ""; + } + reslt[resltlen] = '\0'; + + s = malloc (resltlen+1); + if (s == 0) + return ""; + strcpy (s, reslt); + return s; +} + +static char * +showall (char *s) +{ + static char t[512]; + char *pt; + + pt = t; + if (strchr (s, '\\') == 0) + return s; + while (*s) + { + if (*s == '\\') + { + *pt++ = *s; + } + *pt++ = *s++; + } + return pt; +} + + +enum namestate { N_START, N_DEVICE, N_OPEN, N_DOT, N_CLOSED, N_DONE }; + +/* + convert unix style name to vms style + type = 0 -> name is a full name (directory and filename part) + type = 1 -> name is a directory + type = 2 -> name is a filename without directory + + The following conversions are applied + (0) (1) (2) + input full name dir name file name + +1 ./ [] .dir +2 ../ .dir + +3 // : :[000000] :000000.dir +4 //a a: a: a: +5 //a/ a: a: a:000000.dir + +9 / [000000] [000000] 000000.dir +10 /a [000000]a [a] [000000]a +11 /a/ [a] [a] [000000]a.dir +12 /a/b [a]b [a.b] [a]b +13 /a/b/ [a.b] [a.b] [a]b.dir +14 /a/b/c [a.b]c [a.b.c] [a.b]c +15 /a/b/c/ [a.b.c] [a.b.c] [a.b]c.dir + +16 a a [.a] a +17 a/ [.a] [.a] a.dir +18 a/b [.a]b [.a.b] [.a]b +19 a/b/ [.a.b] [.a.b] [.a]b.dir +20 a/b/c [.a.b]c [.a.b.c] [.a.b]c +21 a/b/c/ [.a.b.c] [.a.b.c] [.a.b]c.dir + +22 a.b.c a_b.c [.a_b_c] a_b_c.dir + +23 [x][y]z [x.y]z [x.y]z [x.y]z +24 [x][.y]z [x.y]z [x.y]z [x.y]z + +25 filenames with '$' are left unchanged if they contain no '/' +25 filenames with ':' are left unchanged +26 filenames with a single pair of '[' ']' are left unchanged + + The input string is not written to. The result is also const because + it's a static buffer; we don't want to change it. +*/ + +const char * +vmsify (const char *name, int type) +{ +/* max 255 device + max 39 directory + max 39 filename + max 39 filetype + max 5 version +*/ +#define MAXPATHLEN 512 + + enum namestate nstate; + static char vmsname[MAXPATHLEN+1]; + const char *fptr; + const char *t; + char *vptr; + int as_dir; + int count; + const char *s; + const char *s1; + const char *s2; + + if (name == 0) + return 0; + fptr = name; + vptr = vmsname; + nstate = N_START; + + /* case 25a */ + t = strpbrk (name, "$:"); + + if (t != 0) + { +// const char *s1; +// const char *s2; + + if (type == 1) + { + s1 = strchr (t+1, '['); + s2 = strchr (t+1, ']'); + } + + if (*t == '$') + { + if (strchr (name, '/') == 0) + { + strcpy (vmsname, name); + if ((type == 1) && (s1 != 0) && (s2 == 0)) + strcat (vmsname, "]"); + return vmsname; + } + } + else + { + strcpy (vmsname, name); + if ((type == 1) && (s1 != 0) && (s2 == 0)) + strcat (vmsname, "]"); + return vmsname; + } + } + + /* case 26 */ + t = strchr (name, '['); + + if (t != 0) + { +// const char *s; +// const char *s1 = strchr (t+1, '['); + s1 = strchr (t+1, '['); + if (s1 == 0) + { + strcpy (vmsname, name); + if ((type == 1) && (strchr (t+1, ']') == 0)) + strcat (vmsname, "]"); + return vmsname; + } + s1--; + if (*s1 != ']') + { + strcpy (vmsname, name); + return vmsname; /* not ][, keep unchanged */ + } + + /* we have ][ */ + + s = name; + + /* s -> starting char + s1 -> ending ']' */ + do + { + strncpy (vptr, s, s1-s); /* copy up to but not including ']' */ + vptr += s1-s; + if (*s1 == 0) + break; + s = s1 + 1; /* s -> char behind ']' */ + if (*s != '[') /* was '][' ? */ + break; /* no, last ] found, exit */ + s++; + if (*s != '.') + *vptr++ = '.'; + s1 = strchr (s, ']'); + if (s1 == 0) /* no closing ] */ + s1 = s + strlen (s); + } + while (1); + + *vptr++ = ']'; + + fptr = s; + + } + else /* no [ in name */ + { + int state = 0; + int rooted = 1; /* flag if logical is rooted, else insert [000000] */ + + do + { + switch (state) + { + case 0: /* start of loop */ + if (*fptr == '/') + { + fptr++; + state = 1; + } + else if (*fptr == '.') + { + fptr++; + state = 10; + } + else + state = 2; + break; + + case 1: /* '/' at start */ + if (*fptr == '/') + { + fptr++; + state = 3; + } + else + state = 4; + break; + + case 2: /* no '/' at start */ + { + const char *s = strchr (fptr, '/'); + if (s == 0) /* no '/' (16) */ + { + if (type == 1) + { + strcpy (vptr, "[."); + vptr += 2; + } + copyto (&vptr, &fptr, 0, (type==1)); + if (type == 1) + *vptr++ = ']'; + state = -1; + } + else /* found '/' (17..21) */ + { + if ((type == 2) + && (*(s+1) == 0)) /* 17(2) */ + { + copyto (&vptr, &fptr, '/', 1); + state = 7; + } + else + { + strcpy (vptr, "[."); + vptr += 2; + copyto (&vptr, &fptr, '/', 1); + nstate = N_OPEN; + state = 9; + } + } + break; + } + + case 3: /* '//' at start */ + { +// const char *s; +// const char *s1; + char *vp; + while (*fptr == '/') /* collapse all '/' */ + fptr++; + if (*fptr == 0) /* just // */ + { + char cwdbuf[MAXPATHLEN+1]; + + s1 = getcwd(cwdbuf, MAXPATHLEN); + if (s1 == 0) + { + vmsname[0] = '\0'; + return vmsname; /* FIXME, err getcwd */ + } + s = strchr (s1, ':'); + if (s == 0) + { + vmsname[0] = '\0'; + return vmsname; /* FIXME, err no device */ + } + strncpy (vptr, s1, s-s1+1); + vptr += s-s1+1; + state = -1; + break; + } + + s = vptr; + + if (copyto (&vptr, &fptr, '/', 1) == 0) /* copy device part */ + { + *vptr++ = ':'; + state = -1; + break; + } + *vptr = ':'; + nstate = N_DEVICE; + if (*fptr == 0) /* just '//a/' */ + { + strcpy (vptr+1, "[000000]"); + vptr += 9; + state = -1; + break; + } + *vptr = 0; + /* check logical for [000000] insertion */ + vp = trnlog (s); + if (*vp != '\0') + { /* found translation */ + for (;;) /* loop over all nested logicals */ + { + char *vp2 = vp + strlen (vp) - 1; + if (*vp2 == ':') /* translation ends in ':' */ + { + vp2 = trnlog (vp); + free (vp); + if (*vp2 == 0) + { + rooted = 0; + break; + } + vp = vp2; + continue; /* next iteration */ + } + if (*vp2 == ']') /* translation ends in ']' */ + { + if (*(vp2-1) == '.') /* ends in '.]' */ + { + if (strncmp (fptr, "000000", 6) != 0) + rooted = 0; + } + else + { + strcpy (vmsname, s1); + vp = strchr (vmsname, ']'); + *vp = '.'; + nstate = N_DOT; + vptr = vp; + } + } + break; + } + free (vp); + } + else + rooted = 0; + + if (*vptr == 0) + { + nstate = N_DEVICE; + *vptr++ = ':'; + } + else + vptr++; + + if (rooted == 0) + { + nstate = N_DOT; + strcpy (vptr, "[000000."); + vptr += 8; + vp = vptr-1; + } + else + vp = 0; + + /* vp-> '.' after 000000 or NULL */ + + s = strchr (fptr, '/'); + if (s == 0) + { /* no next '/' */ + if (*(vptr-1) == '.') + *(vptr-1) = ']'; + else if (rooted == 0) + *vptr++ = ']'; + copyto (&vptr, &fptr, 0, (type == 1)); + state = -1; + break; + } + else + { + while (*(s+1) == '/') /* skip multiple '/' */ + s++; + } + + if ((rooted != 0) + && (*(vptr-1) != '.')) + { + *vptr++ = '['; + nstate = N_DOT; + } + else + if ((nstate == N_DOT) + && (vp != 0) + && (*(s+1) == 0)) + { + if (type == 2) + { + *vp = ']'; + nstate = N_CLOSED; + } + } + state = 9; + break; + } + case 4: /* single '/' at start (9..15) */ + if (*fptr == 0) + state = 5; + else + state = 6; + break; + + case 5: /* just '/' at start (9) */ + if (type != 2) + { + *vptr++ = '['; + nstate = N_OPEN; + } + strcpy (vptr, "000000"); + vptr += 6; + if (type == 2) + state = 7; + else + state = 8; + break; + + case 6: /* chars following '/' at start 10..15 */ + { + const char *s; + *vptr++ = '['; + nstate = N_OPEN; + s = strchr (fptr, '/'); + if (s == 0) /* 10 */ + { + if (type != 1) + { + strcpy (vptr, "000000]"); + vptr += 7; + } + copyto (&vptr, &fptr, 0, (type == 1)); + if (type == 1) + { + *vptr++ = ']'; + } + state = -1; + } + else /* 11..15 */ + { + if ( (type == 2) + && (*(s+1) == 0)) /* 11(2) */ + { + strcpy (vptr, "000000]"); + nstate = N_CLOSED; + vptr += 7; + } + copyto (&vptr, &fptr, '/', (*(vptr-1) != ']')); + state = 9; + } + break; + } + + case 7: /* add '.dir' and exit */ + if ((nstate == N_OPEN) + || (nstate == N_DOT)) + { + char *vp = vptr-1; + while (vp > vmsname) + { + if (*vp == ']') + { + break; + } + if (*vp == '.') + { + *vp = ']'; + break; + } + vp--; + } + } + strcpy (vptr, ".dir"); + vptr += 4; + state = -1; + break; + + case 8: /* add ']' and exit */ + *vptr++ = ']'; + state = -1; + break; + + case 9: /* 17..21, fptr -> 1st '/' + 1 */ + { + const char *s; + if (*fptr == 0) + { + if (type == 2) + { + state = 7; + } + else + state = 8; + break; + } + s = strchr (fptr, '/'); + if (s == 0) + { + if (type != 1) + { + if (nstate == N_OPEN) + { + *vptr++ = ']'; + nstate = N_CLOSED; + } + as_dir = 0; + } + else + { + if (nstate == N_OPEN) + { + *vptr++ = '.'; + nstate = N_DOT; + } + as_dir = 1; + } + } + else + { + while (*(s+1) == '/') + s++; + if ( (type == 2) + && (*(s+1) == 0)) /* 19(2), 21(2)*/ + { + if (nstate != N_CLOSED) + { + *vptr++ = ']'; + nstate = N_CLOSED; + } + as_dir = 1; + } + else + { + if (nstate == N_OPEN) + { + *vptr++ = '.'; + nstate = N_DOT; + } + as_dir = 1; + } + } + if ( (*fptr == '.') /* check for '..' or '../' */ + && (*(fptr+1) == '.') + && ((*(fptr+2) == '/') + || (*(fptr+2) == 0)) ) + { + char *vp; + fptr += 2; + if (*fptr == '/') + { + do + { + fptr++; + } + while (*fptr == '/'); + } + else if (*fptr == 0) + type = 1; + vptr--; /* vptr -> '.' or ']' */ + vp = vptr; + for (;;) + { + vp--; + if (*vp == '.') /* one back */ + { + vptr = vp; + nstate = N_OPEN; + break; + } + if (*vp == '[') /* top level reached */ + { + if (*fptr == 0) + { + strcpy (vp, "[000000]"); + vptr = vp + 8; + nstate = N_CLOSED; + s = 0; + break; + } + else + { + vptr = vp+1; + nstate = N_OPEN; + break; + } + } + } + } + else + { + copyto (&vptr, &fptr, '/', as_dir); + if (nstate == N_DOT) + nstate = N_OPEN; + } + if (s == 0) + { /* 18,20 */ + if (type == 1) + *vptr++ = ']'; + state = -1; + } + else + { + if (*(s+1) == 0) + { + if (type == 2) /* 19,21 */ + { + state = 7; + } + else + { + *vptr++ = ']'; + state = -1; + } + } + } + break; + } + + case 10: /* 1,2 first is '.' */ + if (*fptr == '.') + { + fptr++; + state = 11; + } + else + state = 12; + break; + + case 11: /* 2, '..' at start */ + count = 1; + if (*fptr != 0) + { + if (*fptr != '/') /* got ..xxx */ + { + strcpy (vmsname, name); + return vmsname; + } + do /* got ../ */ + { + fptr++; + while (*fptr == '/') fptr++; + if (*fptr != '.') + break; + if (*(fptr+1) != '.') + break; + fptr += 2; + if ((*fptr == 0) + || (*fptr == '/')) + count++; + } + while (*fptr == '/'); + } + { /* got '..' or '../' */ + char *vp; + char cwdbuf[MAXPATHLEN+1]; + + vp = getcwd(cwdbuf, MAXPATHLEN); + if (vp == 0) + { + vmsname[0] = '\0'; + return vmsname; /* FIXME, err getcwd */ + } + strcpy (vptr, vp); + vp = strchr (vptr, ']'); + if (vp != 0) + { + nstate = N_OPEN; + while (vp > vptr) + { + vp--; + if (*vp == '[') + { + vp++; + strcpy (vp, "000000]"); + state = -1; + break; + } + else if (*vp == '.') + { + if (--count == 0) + { + if (*fptr == 0) /* had '..' or '../' */ + { + *vp++ = ']'; + state = -1; + } + else /* had '../xxx' */ + { + state = 9; + } + *vp = '\0'; + break; + } + } + } + } + vptr += strlen (vptr); + } + break; + + case 12: /* 1, '.' at start */ + if (*fptr != 0) + { + if (*fptr != '/') + { + strcpy (vmsname, name); + return vmsname; + } + while (*fptr == '/') + fptr++; + } + + { + char *vp; + char cwdbuf[MAXPATHLEN+1]; + + vp = getcwd(cwdbuf, MAXPATHLEN); + if (vp == 0) + { + vmsname[0] = '\0'; + return vmsname; /*FIXME, err getcwd */ + } + strcpy (vptr, vp); + } + if (*fptr == 0) + { + state = -1; + break; + } + else + { + char *vp = strchr (vptr, ']'); + if (vp == 0) + { + state = -1; + break; + } + *vp = '\0'; + nstate = N_OPEN; + vptr += strlen (vptr); + state = 9; + } + break; + } + + } + while (state > 0); + + + } + + + /* directory conversion done + fptr -> filename part of input string + vptr -> free space in vmsname + */ + + *vptr++ = 0; + + return vmsname; +} + + + +/* + convert from vms-style to unix-style + + dev:[dir1.dir2] //dev/dir1/dir2/ +*/ + +const char * +unixify (const char *name) +{ + static char piece[512]; + const char *s; + char *p; + + if (strchr (name, '/') != 0) /* already in unix style */ + { + strcpy (piece, name); + return piece; + } + + p = piece; + *p = 0; + + /* device part */ + + s = strchr (name, ':'); + + if (s != 0) + { + int l = s - name; + *p++ = '/'; + *p++ = '/'; + strncpy (p, name, l); + p += l; + } + + /* directory part */ + + *p++ = '/'; + s = strchr (name, '['); + + if (s != 0) + { + s++; + switch (*s) + { + case ']': /* [] */ + strcat (p, "./"); + break; + case '-': /* [- */ + strcat (p, "../"); + break; + case '.': + strcat (p, "./"); /* [. */ + break; + default: + s--; + break; + } + s++; + while (*s) + { + if (*s == '.') + *p++ = '/'; + else + *p++ = *s; + s++; + if (*s == ']') + { + s++; + break; + } + } + if (*s != 0) /* more after ']' ?? */ + { + if (*(p-1) != '/') + *p++ = '/'; + strcpy (p, s); /* copy it anyway */ + } + } + + else /* no '[' anywhere */ + + { + *p++ = 0; + } + + /* force end with '/' */ + + if (*(p-1) != '/') + *p++ = '/'; + *p = 0; + + return piece; +} + +/* EOF */ diff --git a/vmsjobs.c b/vmsjobs.c new file mode 100644 index 0000000..05c8dba --- /dev/null +++ b/vmsjobs.c @@ -0,0 +1,725 @@ +/* --------------- Moved here from job.c --------------- + This file must be #included in job.c, as it accesses static functions. + +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include +#include +#include + +char *vmsify (char *name, int type); + +static int vms_jobsefnmask = 0; + +/* Wait for nchildren children to terminate */ +static void +vmsWaitForChildren(int *status) +{ + while (1) + { + if (!vms_jobsefnmask) + { + *status = 0; + return; + } + + *status = sys$wflor (32, vms_jobsefnmask); + } + return; +} + +/* Set up IO redirection. */ + +char * +vms_redirect (struct dsc$descriptor_s *desc, char *fname, char *ibuf) +{ + char *fptr; + + ibuf++; + while (isspace ((unsigned char)*ibuf)) + ibuf++; + fptr = ibuf; + while (*ibuf && !isspace ((unsigned char)*ibuf)) + ibuf++; + *ibuf = 0; + if (strcmp (fptr, "/dev/null") != 0) + { + strcpy (fname, vmsify (fptr, 0)); + if (strchr (fname, '.') == 0) + strcat (fname, "."); + } + desc->dsc$w_length = strlen(fname); + desc->dsc$a_pointer = fname; + desc->dsc$b_dtype = DSC$K_DTYPE_T; + desc->dsc$b_class = DSC$K_CLASS_S; + + if (*fname == 0) + printf (_("Warning: Empty redirection\n")); + return ibuf; +} + + +/* found apostrophe at (p-1) + inc p until after closing apostrophe. + */ + +char * +vms_handle_apos (char *p) +{ + int alast; + +#define SEPCHARS ",/()= " + + alast = 0; + + while (*p != 0) + { + if (*p == '"') + { + if (alast) + { + alast = 0; + p++; + } + else + { + p++; + if (strchr (SEPCHARS, *p)) + break; + alast = 1; + } + } + else + p++; + } + + return p; +} + +static int ctrlYPressed= 0; +/* This is called at main or AST level. It is at AST level for DONTWAITFORCHILD + and at main level otherwise. In any case it is called when a child process + terminated. At AST level it won't get interrupted by anything except a + inner mode level AST. +*/ +int +vmsHandleChildTerm(struct child *child) +{ + int status; + register struct child *lastc, *c; + int child_failed; + + vms_jobsefnmask &= ~(1 << (child->efn - 32)); + + lib$free_ef(&child->efn); + if (child->comname) + { + if (!ISDB (DB_JOBS)&&!ctrlYPressed) + unlink (child->comname); + free (child->comname); + } + + (void) sigblock (fatal_signal_mask); + + child_failed = !(child->cstatus & 1 || ((child->cstatus & 7) == 0)); + + /* Search for a child matching the deceased one. */ + lastc = 0; +#if defined(RECURSIVEJOBS) /* I've had problems with recursive stuff and process handling */ + for (c = children; c != 0 && c != child; lastc = c, c = c->next) + ; +#else + c = child; +#endif + + if (child_failed && !c->noerror && !ignore_errors_flag) + { + /* The commands failed. Write an error message, + delete non-precious targets, and abort. */ + child_error (c->file->name, c->cstatus, 0, 0, 0); + c->file->update_status = 1; + delete_child_targets (c); + } + else + { + if (child_failed) + { + /* The commands failed, but we don't care. */ + child_error (c->file->name, c->cstatus, 0, 0, 1); + child_failed = 0; + } + +#if defined(RECURSIVEJOBS) /* I've had problems with recursive stuff and process handling */ + /* If there are more commands to run, try to start them. */ + start_job (c); + + switch (c->file->command_state) + { + case cs_running: + /* Successfully started. */ + break; + + case cs_finished: + if (c->file->update_status != 0) { + /* We failed to start the commands. */ + delete_child_targets (c); + } + break; + + default: + error (NILF, _("internal error: `%s' command_state"), + c->file->name); + abort (); + break; + } +#endif /* RECURSIVEJOBS */ + } + + /* Set the state flag to say the commands have finished. */ + c->file->command_state = cs_finished; + notice_finished_file (c->file); + +#if defined(RECURSIVEJOBS) /* I've had problems with recursive stuff and process handling */ + /* Remove the child from the chain and free it. */ + if (lastc == 0) + children = c->next; + else + lastc->next = c->next; + free_child (c); +#endif /* RECURSIVEJOBS */ + + /* There is now another slot open. */ + if (job_slots_used > 0) + --job_slots_used; + + /* If the job failed, and the -k flag was not given, die. */ + if (child_failed && !keep_going_flag) + die (EXIT_FAILURE); + + (void) sigsetmask (sigblock (0) & ~(fatal_signal_mask)); + + return 1; +} + +/* VMS: + Spawn a process executing the command in ARGV and return its pid. */ + +#define MAXCMDLEN 200 + +/* local helpers to make ctrl+c and ctrl+y working, see below */ +#include +#include +#include + +static int ctrlMask= LIB$M_CLI_CTRLY; +static int oldCtrlMask; +static int setupYAstTried= 0; +static unsigned short int chan= 0; + +static void +reEnableAst(void) +{ + lib$enable_ctrl (&oldCtrlMask,0); +} + +static int +astYHandler (void) +{ + struct child *c; + for (c = children; c != 0; c = c->next) + sys$delprc (&c->pid, 0, 0); + ctrlYPressed= 1; + kill (getpid(),SIGQUIT); + return SS$_NORMAL; +} + +static void +tryToSetupYAst(void) +{ + $DESCRIPTOR(inputDsc,"SYS$COMMAND"); + int status; + struct { + short int status, count; + int dvi; + } iosb; + unsigned short int loc_chan; + + setupYAstTried++; + + if (chan) + loc_chan= chan; + else { + status= sys$assign(&inputDsc,&loc_chan,0,0); + if (!(status&SS$_NORMAL)) { + lib$signal(status); + return; + } + } + status= sys$qiow (0, loc_chan, IO$_SETMODE|IO$M_CTRLYAST,&iosb,0,0, + astYHandler,0,0,0,0,0); + if (status==SS$_NORMAL) + status= iosb.status; + if (status!=SS$_NORMAL) { + if (!chan) + sys$dassgn(loc_chan); + if (status!=SS$_ILLIOFUNC && status!=SS$_NOPRIV) + lib$signal(status); + return; + } + + /* called from AST handler ? */ + if (setupYAstTried>1) + return; + if (atexit(reEnableAst)) + fprintf (stderr, + _("-warning, you may have to re-enable CTRL-Y handling from DCL.\n")); + status= lib$disable_ctrl (&ctrlMask, &oldCtrlMask); + if (!(status&SS$_NORMAL)) { + lib$signal(status); + return; + } + if (!chan) + chan = loc_chan; +} + +int +child_execute_job (char *argv, struct child *child) +{ + int i; + static struct dsc$descriptor_s cmddsc; + static struct dsc$descriptor_s pnamedsc; + static struct dsc$descriptor_s ifiledsc; + static struct dsc$descriptor_s ofiledsc; + static struct dsc$descriptor_s efiledsc; + int have_redirection = 0; + int have_append = 0; + int have_newline = 0; + + int spflags = CLI$M_NOWAIT; + int status; + char *cmd = alloca (strlen (argv) + 512), *p, *q; + char ifile[256], ofile[256], efile[256]; + int comnamelen; + char procname[100]; + int in_string; + + /* Parse IO redirection. */ + + ifile[0] = 0; + ofile[0] = 0; + efile[0] = 0; + child->comname = NULL; + + DB (DB_JOBS, ("child_execute_job (%s)\n", argv)); + + while (isspace ((unsigned char)*argv)) + argv++; + + if (*argv == 0) + return 0; + + sprintf (procname, "GMAKE_%05x", getpid () & 0xfffff); + pnamedsc.dsc$w_length = strlen(procname); + pnamedsc.dsc$a_pointer = procname; + pnamedsc.dsc$b_dtype = DSC$K_DTYPE_T; + pnamedsc.dsc$b_class = DSC$K_CLASS_S; + + in_string = 0; + /* Handle comments and redirection. */ + for (p = argv, q = cmd; *p; p++, q++) + { + if (*p == '"') + in_string = !in_string; + if (in_string) + { + *q = *p; + continue; + } + switch (*p) + { + case '#': + *p-- = 0; + *q-- = 0; + break; + case '\\': + p++; + if (*p == '\n') + p++; + if (isspace ((unsigned char)*p)) + { + do { p++; } while (isspace ((unsigned char)*p)); + p--; + } + *q = *p; + break; + case '<': + p = vms_redirect (&ifiledsc, ifile, p); + *q = ' '; + have_redirection = 1; + break; + case '>': + have_redirection = 1; + if (*(p-1) == '2') + { + q--; + if (strncmp (p, ">&1", 3) == 0) + { + p += 3; + strcpy (efile, "sys$output"); + efiledsc.dsc$w_length = strlen(efile); + efiledsc.dsc$a_pointer = efile; + efiledsc.dsc$b_dtype = DSC$K_DTYPE_T; + efiledsc.dsc$b_class = DSC$K_CLASS_S; + } + else + { + p = vms_redirect (&efiledsc, efile, p); + } + } + else + { + if (*(p+1) == '>') + { + have_append = 1; + p += 1; + } + p = vms_redirect (&ofiledsc, ofile, p); + } + *q = ' '; + break; + case '\n': + have_newline = 1; + default: + *q = *p; + break; + } + } + *q = *p; + while (isspace ((unsigned char)*--q)) + *q = '\0'; + + if (strncmp (cmd, "builtin_", 8) == 0) + { + child->pid = 270163; + child->efn = 0; + child->cstatus = 1; + + DB (DB_JOBS, (_("BUILTIN [%s][%s]\n"), cmd, cmd+8)); + + p = cmd + 8; + + if ((*(p) == 'c') + && (*(p+1) == 'd') + && ((*(p+2) == ' ') || (*(p+2) == '\t'))) + { + p += 3; + while ((*p == ' ') || (*p == '\t')) + p++; + DB (DB_JOBS, (_("BUILTIN CD %s\n"), p)); + if (chdir (p)) + return 0; + else + return 1; + } + else if ((*(p) == 'r') + && (*(p+1) == 'm') + && ((*(p+2) == ' ') || (*(p+2) == '\t'))) + { + int in_arg; + + /* rm */ + p += 3; + while ((*p == ' ') || (*p == '\t')) + p++; + in_arg = 1; + + DB (DB_JOBS, (_("BUILTIN RM %s\n"), p)); + while (*p) + { + switch (*p) + { + case ' ': + case '\t': + if (in_arg) + { + *p++ = ';'; + in_arg = 0; + } + break; + default: + break; + } + p++; + } + } + else + { + printf(_("Unknown builtin command '%s'\n"), cmd); + fflush(stdout); + return 0; + } + } + + /* Create a *.com file if either the command is too long for + lib$spawn, or the command contains a newline, or if redirection + is desired. Forcing commands with newlines into DCLs allows to + store search lists on user mode logicals. */ + + if (strlen (cmd) > MAXCMDLEN + || (have_redirection != 0) + || (have_newline != 0)) + { + FILE *outfile; + char c; + char *sep; + int alevel = 0; /* apostrophe level */ + + if (strlen (cmd) == 0) + { + printf (_("Error, empty command\n")); + fflush (stdout); + return 0; + } + + outfile = open_tmpfile (&child->comname, "sys$scratch:CMDXXXXXX.COM"); + if (outfile == 0) + pfatal_with_name (_("fopen (temporary file)")); + comnamelen = strlen (child->comname); + + if (ifile[0]) + { + fprintf (outfile, "$ assign/user %s sys$input\n", ifile); + DB (DB_JOBS, (_("Redirected input from %s\n"), ifile)); + ifiledsc.dsc$w_length = 0; + } + + if (efile[0]) + { + fprintf (outfile, "$ define sys$error %s\n", efile); + DB (DB_JOBS, (_("Redirected error to %s\n"), efile)); + efiledsc.dsc$w_length = 0; + } + + if (ofile[0]) + { + if (have_append) + { + fprintf (outfile, "$ set noon\n"); + fprintf (outfile, "$ define sys$output %.*s\n", comnamelen-3, child->comname); + DB (DB_JOBS, (_("Append output to %s\n"), ofile)); + ofiledsc.dsc$w_length = 0; + } + else + { + fprintf (outfile, "$ define sys$output %s\n", ofile); + DB (DB_JOBS, (_("Redirected output to %s\n"), ofile)); + ofiledsc.dsc$w_length = 0; + } + } + + p = sep = q = cmd; + for (c = '\n'; c; c = *q++) + { + switch (c) + { + case '\n': + /* At a newline, skip any whitespace around a leading $ + from the command and issue exactly one $ into the DCL. */ + while (isspace ((unsigned char)*p)) + p++; + if (*p == '$') + p++; + while (isspace ((unsigned char)*p)) + p++; + fwrite (p, 1, q - p, outfile); + fputc ('$', outfile); + fputc (' ', outfile); + /* Reset variables. */ + p = sep = q; + break; + + /* Nice places for line breaks are after strings, after + comma or space and before slash. */ + case '"': + q = vms_handle_apos (q); + sep = q; + break; + case ',': + case ' ': + sep = q; + break; + case '/': + case '\0': + sep = q - 1; + break; + default: + break; + } + if (sep - p > 78) + { + /* Enough stuff for a line. */ + fwrite (p, 1, sep - p, outfile); + p = sep; + if (*sep) + { + /* The command continues. */ + fputc ('-', outfile); + } + fputc ('\n', outfile); + } + } + + if (*p) + { + fwrite (p, 1, --q - p, outfile); + fputc ('\n', outfile); + } + + if (have_append) + { + fprintf (outfile, "$ deassign sys$output ! 'f$verify(0)\n"); + fprintf (outfile, "$ append:=append\n"); + fprintf (outfile, "$ delete:=delete\n"); + fprintf (outfile, "$ append/new %.*s %s\n", comnamelen-3, child->comname, ofile); + fprintf (outfile, "$ delete %.*s;*\n", comnamelen-3, child->comname); + DB (DB_JOBS, (_("Append %.*s and cleanup\n"), comnamelen-3, child->comname)); + } + + fclose (outfile); + + sprintf (cmd, "$ @%s", child->comname); + + DB (DB_JOBS, (_("Executing %s instead\n"), cmd)); + } + + cmddsc.dsc$w_length = strlen(cmd); + cmddsc.dsc$a_pointer = cmd; + cmddsc.dsc$b_dtype = DSC$K_DTYPE_T; + cmddsc.dsc$b_class = DSC$K_CLASS_S; + + child->efn = 0; + while (child->efn < 32 || child->efn > 63) + { + status = lib$get_ef ((unsigned long *)&child->efn); + if (!(status & 1)) + { + if (child->comname) + { + if (!ISDB (DB_JOBS)) + unlink (child->comname); + free (child->comname); + } + return 0; + } + } + + sys$clref (child->efn); + + vms_jobsefnmask |= (1 << (child->efn - 32)); + +/* + LIB$SPAWN [command-string] + [,input-file] + [,output-file] + [,flags] + [,process-name] + [,process-id] [,completion-status-address] [,byte-integer-event-flag-num] + [,AST-address] [,varying-AST-argument] + [,prompt-string] [,cli] [,table] +*/ + +#ifndef DONTWAITFORCHILD +/* + * Code to make ctrl+c and ctrl+y working. + * The problem starts with the synchronous case where after lib$spawn is + * called any input will go to the child. But with input re-directed, + * both control characters won't make it to any of the programs, neither + * the spawning nor to the spawned one. Hence the caller needs to spawn + * with CLI$M_NOWAIT to NOT give up the input focus. A sys$waitfr + * has to follow to simulate the wanted synchronous behaviour. + * The next problem is ctrl+y which isn't caught by the crtl and + * therefore isn't converted to SIGQUIT (for a signal handler which is + * already established). The only way to catch ctrl+y, is an AST + * assigned to the input channel. But ctrl+y handling of DCL needs to be + * disabled, otherwise it will handle it. Not to mention the previous + * ctrl+y handling of DCL needs to be re-established before make exits. + * One more: At the time of LIB$SPAWN signals are blocked. SIGQUIT will + * make it to the signal handler after the child "normally" terminates. + * This isn't enough. It seems reasonable for simple command lines like + * a 'cc foobar.c' spawned in a subprocess but it is unacceptable for + * spawning make. Therefore we need to abort the process in the AST. + * + * Prior to the spawn it is checked if an AST is already set up for + * ctrl+y, if not one is set up for a channel to SYS$COMMAND. In general + * this will work except if make is run in a batch environment, but there + * nobody can press ctrl+y. During the setup the DCL handling of ctrl+y + * is disabled and an exit handler is established to re-enable it. + * If the user interrupts with ctrl+y, the assigned AST will fire, force + * an abort to the subprocess and signal SIGQUIT, which will be caught by + * the already established handler and will bring us back to common code. + * After the spawn (now /nowait) a sys$waitfr simulates the /wait and + * enables the ctrl+y be delivered to this code. And the ctrl+c too, + * which the crtl converts to SIGINT and which is caught by the common + * signal handler. Because signals were blocked before entering this code + * sys$waitfr will always complete and the SIGQUIT will be processed after + * it (after termination of the current block, somewhere in common code). + * And SIGINT too will be delayed. That is ctrl+c can only abort when the + * current command completes. Anyway it's better than nothing :-) + */ + + if (!setupYAstTried) + tryToSetupYAst(); + status = lib$spawn (&cmddsc, /* cmd-string */ + (ifiledsc.dsc$w_length == 0)?0:&ifiledsc, /* input-file */ + (ofiledsc.dsc$w_length == 0)?0:&ofiledsc, /* output-file */ + &spflags, /* flags */ + &pnamedsc, /* proc name */ + &child->pid, &child->cstatus, &child->efn, + 0, 0, + 0, 0, 0); + if (status & 1) + { + status= sys$waitfr (child->efn); + vmsHandleChildTerm(child); + } +#else + status = lib$spawn (&cmddsc, + (ifiledsc.dsc$w_length == 0)?0:&ifiledsc, + (ofiledsc.dsc$w_length == 0)?0:&ofiledsc, + &spflags, + &pnamedsc, + &child->pid, &child->cstatus, &child->efn, + vmsHandleChildTerm, child, + 0, 0, 0); +#endif + + if (!(status & 1)) + { + printf (_("Error spawning, %d\n") ,status); + fflush (stdout); + switch (status) + { + case 0x1c: + errno = EPROCLIM; + break; + default: + errno = EFAIL; + } + } + + return (status & 1); +} diff --git a/vpath.c b/vpath.c new file mode 100644 index 0000000..9f41b27 --- /dev/null +++ b/vpath.c @@ -0,0 +1,620 @@ +/* Implementation of pattern-matching file search paths for GNU Make. +Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include "filedef.h" +#include "variable.h" +#ifdef WINDOWS32 +#include "pathstuff.h" +#endif + + +/* Structure used to represent a selective VPATH searchpath. */ + +struct vpath + { + struct vpath *next; /* Pointer to next struct in the linked list. */ + const char *pattern;/* The pattern to match. */ + const char *percent;/* Pointer into `pattern' where the `%' is. */ + unsigned int patlen;/* Length of the pattern. */ + const char **searchpath; /* Null-terminated list of directories. */ + unsigned int maxlen;/* Maximum length of any entry in the list. */ + }; + +/* Linked-list of all selective VPATHs. */ + +static struct vpath *vpaths; + +/* Structure for the general VPATH given in the variable. */ + +static struct vpath *general_vpath; + +/* Structure for GPATH given in the variable. */ + +static struct vpath *gpaths; + + +/* Reverse the chain of selective VPATH lists so they will be searched in the + order given in the makefiles and construct the list from the VPATH + variable. */ + +void +build_vpath_lists () +{ + register struct vpath *new = 0; + register struct vpath *old, *nexto; + register char *p; + + /* Reverse the chain. */ + for (old = vpaths; old != 0; old = nexto) + { + nexto = old->next; + old->next = new; + new = old; + } + + vpaths = new; + + /* If there is a VPATH variable with a nonnull value, construct the + general VPATH list from it. We use variable_expand rather than just + calling lookup_variable so that it will be recursively expanded. */ + + { + /* Turn off --warn-undefined-variables while we expand SHELL and IFS. */ + int save = warn_undefined_variables_flag; + warn_undefined_variables_flag = 0; + + p = variable_expand ("$(strip $(VPATH))"); + + warn_undefined_variables_flag = save; + } + + if (*p != '\0') + { + /* Save the list of vpaths. */ + struct vpath *save_vpaths = vpaths; + char gp[] = "%"; + + /* Empty `vpaths' so the new one will have no next, and `vpaths' + will still be nil if P contains no existing directories. */ + vpaths = 0; + + /* Parse P. */ + construct_vpath_list (gp, p); + + /* Store the created path as the general path, + and restore the old list of vpaths. */ + general_vpath = vpaths; + vpaths = save_vpaths; + } + + /* If there is a GPATH variable with a nonnull value, construct the + GPATH list from it. We use variable_expand rather than just + calling lookup_variable so that it will be recursively expanded. */ + + { + /* Turn off --warn-undefined-variables while we expand SHELL and IFS. */ + int save = warn_undefined_variables_flag; + warn_undefined_variables_flag = 0; + + p = variable_expand ("$(strip $(GPATH))"); + + warn_undefined_variables_flag = save; + } + + if (*p != '\0') + { + /* Save the list of vpaths. */ + struct vpath *save_vpaths = vpaths; + char gp[] = "%"; + + /* Empty `vpaths' so the new one will have no next, and `vpaths' + will still be nil if P contains no existing directories. */ + vpaths = 0; + + /* Parse P. */ + construct_vpath_list (gp, p); + + /* Store the created path as the GPATH, + and restore the old list of vpaths. */ + gpaths = vpaths; + vpaths = save_vpaths; + } +} + +/* Construct the VPATH listing for the PATTERN and DIRPATH given. + + This function is called to generate selective VPATH lists and also for + the general VPATH list (which is in fact just a selective VPATH that + is applied to everything). The returned pointer is either put in the + linked list of all selective VPATH lists or in the GENERAL_VPATH + variable. + + If DIRPATH is nil, remove all previous listings with the same + pattern. If PATTERN is nil, remove all VPATH listings. Existing + and readable directories that are not "." given in the DIRPATH + separated by the path element separator (defined in make.h) are + loaded into the directory hash table if they are not there already + and put in the VPATH searchpath for the given pattern with trailing + slashes stripped off if present (and if the directory is not the + root, "/"). The length of the longest entry in the list is put in + the structure as well. The new entry will be at the head of the + VPATHS chain. */ + +void +construct_vpath_list (char *pattern, char *dirpath) +{ + unsigned int elem; + char *p; + const char **vpath; + unsigned int maxvpath; + unsigned int maxelem; + const char *percent = NULL; + + if (pattern != 0) + percent = find_percent (pattern); + + if (dirpath == 0) + { + /* Remove matching listings. */ + struct vpath *path, *lastpath; + + lastpath = 0; + path = vpaths; + while (path != 0) + { + struct vpath *next = path->next; + + if (pattern == 0 + || (((percent == 0 && path->percent == 0) + || (percent - pattern == path->percent - path->pattern)) + && streq (pattern, path->pattern))) + { + /* Remove it from the linked list. */ + if (lastpath == 0) + vpaths = path->next; + else + lastpath->next = next; + + /* Free its unused storage. */ + /* MSVC erroneously warns without a cast here. */ + free ((void *)path->searchpath); + free (path); + } + else + lastpath = path; + + path = next; + } + + return; + } + +#ifdef WINDOWS32 + convert_vpath_to_windows32(dirpath, ';'); +#endif + + /* Skip over any initial separators and blanks. */ + while (*dirpath == PATH_SEPARATOR_CHAR || isblank ((unsigned char)*dirpath)) + ++dirpath; + + /* Figure out the maximum number of VPATH entries and put it in + MAXELEM. We start with 2, one before the first separator and one + nil (the list terminator) and increment our estimated number for + each separator or blank we find. */ + maxelem = 2; + p = dirpath; + while (*p != '\0') + if (*p++ == PATH_SEPARATOR_CHAR || isblank ((unsigned char)*p)) + ++maxelem; + + vpath = xmalloc (maxelem * sizeof (const char *)); + maxvpath = 0; + + elem = 0; + p = dirpath; + while (*p != '\0') + { + char *v; + unsigned int len; + + /* Find the end of this entry. */ + v = p; + while (*p != '\0' +#if defined(HAVE_DOS_PATHS) && (PATH_SEPARATOR_CHAR == ':') + /* Platforms whose PATH_SEPARATOR_CHAR is ':' and which + also define HAVE_DOS_PATHS would like us to recognize + colons after the drive letter in the likes of + "D:/foo/bar:C:/xyzzy". */ + && (*p != PATH_SEPARATOR_CHAR + || (p == v + 1 && (p[1] == '/' || p[1] == '\\'))) +#else + && *p != PATH_SEPARATOR_CHAR +#endif + && !isblank ((unsigned char)*p)) + ++p; + + len = p - v; + /* Make sure there's no trailing slash, + but still allow "/" as a directory. */ +#if defined(__MSDOS__) || defined(__EMX__) || defined(HAVE_DOS_PATHS) + /* We need also to leave alone a trailing slash in "d:/". */ + if (len > 3 || (len > 1 && v[1] != ':')) +#endif + if (len > 1 && p[-1] == '/') + --len; + + /* Put the directory on the vpath list. */ + if (len > 1 || *v != '.') + { + vpath[elem++] = dir_name (strcache_add_len (v, len)); + if (len > maxvpath) + maxvpath = len; + } + + /* Skip over separators and blanks between entries. */ + while (*p == PATH_SEPARATOR_CHAR || isblank ((unsigned char)*p)) + ++p; + } + + if (elem > 0) + { + struct vpath *path; + /* ELEM is now incremented one element past the last + entry, to where the nil-pointer terminator goes. + Usually this is maxelem - 1. If not, shrink down. */ + if (elem < (maxelem - 1)) + vpath = xrealloc (vpath, (elem+1) * sizeof (const char *)); + + /* Put the nil-pointer terminator on the end of the VPATH list. */ + vpath[elem] = NULL; + + /* Construct the vpath structure and put it into the linked list. */ + path = xmalloc (sizeof (struct vpath)); + path->searchpath = vpath; + path->maxlen = maxvpath; + path->next = vpaths; + vpaths = path; + + /* Set up the members. */ + path->pattern = strcache_add (pattern); + path->patlen = strlen (pattern); + path->percent = percent ? path->pattern + (percent - pattern) : 0; + } + else + /* There were no entries, so free whatever space we allocated. */ + /* MSVC erroneously warns without a cast here. */ + free ((void *)vpath); +} + +/* Search the GPATH list for a pathname string that matches the one passed + in. If it is found, return 1. Otherwise we return 0. */ + +int +gpath_search (const char *file, unsigned int len) +{ + const char **gp; + + if (gpaths && (len <= gpaths->maxlen)) + for (gp = gpaths->searchpath; *gp != NULL; ++gp) + if (strneq (*gp, file, len) && (*gp)[len] == '\0') + return 1; + + return 0; +} + + +/* Search the given VPATH list for a directory where the name pointed to by + FILE exists. If it is found, we return a cached name of the existing file + and set *MTIME_PTR (if MTIME_PTR is not NULL) to its modtime (or zero if no + stat call was done). Also set the matching directory index in PATH_INDEX + if it is not NULL. Otherwise we return NULL. */ + +static const char * +selective_vpath_search (struct vpath *path, const char *file, + FILE_TIMESTAMP *mtime_ptr, unsigned int* path_index) +{ + int not_target; + char *name; + const char *n; + const char *filename; + const char **vpath = path->searchpath; + unsigned int maxvpath = path->maxlen; + unsigned int i; + unsigned int flen, vlen, name_dplen; + int exists = 0; + + /* Find out if *FILE is a target. + If and only if it is NOT a target, we will accept prospective + files that don't exist but are mentioned in a makefile. */ + { + struct file *f = lookup_file (file); + not_target = f == 0 || !f->is_target; + } + + flen = strlen (file); + + /* Split *FILE into a directory prefix and a name-within-directory. + NAME_DPLEN gets the length of the prefix; FILENAME gets the pointer to + the name-within-directory and FLEN is its length. */ + + n = strrchr (file, '/'); +#ifdef HAVE_DOS_PATHS + /* We need the rightmost slash or backslash. */ + { + const char *bslash = strrchr(file, '\\'); + if (!n || bslash > n) + n = bslash; + } +#endif + name_dplen = n != 0 ? n - file : 0; + filename = name_dplen > 0 ? n + 1 : file; + if (name_dplen > 0) + flen -= name_dplen + 1; + + /* Get enough space for the biggest VPATH entry, a slash, the directory + prefix that came with FILE, another slash (although this one may not + always be necessary), the filename, and a null terminator. */ + name = alloca (maxvpath + 1 + name_dplen + 1 + flen + 1); + + /* Try each VPATH entry. */ + for (i = 0; vpath[i] != 0; ++i) + { + int exists_in_cache = 0; + char *p; + + p = name; + + /* Put the next VPATH entry into NAME at P and increment P past it. */ + vlen = strlen (vpath[i]); + memcpy (p, vpath[i], vlen); + p += vlen; + + /* Add the directory prefix already in *FILE. */ + if (name_dplen > 0) + { +#ifndef VMS + *p++ = '/'; +#endif + memcpy (p, file, name_dplen); + p += name_dplen; + } + +#ifdef HAVE_DOS_PATHS + /* Cause the next if to treat backslash and slash alike. */ + if (p != name && p[-1] == '\\' ) + p[-1] = '/'; +#endif + /* Now add the name-within-directory at the end of NAME. */ +#ifndef VMS + if (p != name && p[-1] != '/') + { + *p = '/'; + memcpy (p + 1, filename, flen + 1); + } + else +#endif + memcpy (p, filename, flen + 1); + + /* Check if the file is mentioned in a makefile. If *FILE is not + a target, that is enough for us to decide this file exists. + If *FILE is a target, then the file must be mentioned in the + makefile also as a target to be chosen. + + The restriction that *FILE must not be a target for a + makefile-mentioned file to be chosen was added by an + inadequately commented change in July 1990; I am not sure off + hand what problem it fixes. + + In December 1993 I loosened this restriction to allow a file + to be chosen if it is mentioned as a target in a makefile. This + seem logical. + + Special handling for -W / -o: make sure we preserve the special + values here. Actually this whole thing is a little bogus: I think + we should ditch the name/hname thing and look into the renamed + capability that already exists for files: that is, have a new struct + file* entry for the VPATH-found file, and set the renamed field if + we use it. + */ + { + struct file *f = lookup_file (name); + if (f != 0) + { + exists = not_target || f->is_target; + if (exists && mtime_ptr + && (f->last_mtime == OLD_MTIME || f->last_mtime == NEW_MTIME)) + { + *mtime_ptr = f->last_mtime; + mtime_ptr = 0; + } + } + } + + if (!exists) + { + /* That file wasn't mentioned in the makefile. + See if it actually exists. */ + +#ifdef VMS + exists_in_cache = exists = dir_file_exists_p (vpath[i], filename); +#else + /* Clobber a null into the name at the last slash. + Now NAME is the name of the directory to look in. */ + *p = '\0'; + + /* We know the directory is in the hash table now because either + construct_vpath_list or the code just above put it there. + Does the file we seek exist in it? */ + exists_in_cache = exists = dir_file_exists_p (name, filename); +#endif + } + + if (exists) + { + /* The file is in the directory cache. + Now check that it actually exists in the filesystem. + The cache may be out of date. When vpath thinks a file + exists, but stat fails for it, confusion results in the + higher levels. */ + + struct stat st; + +#ifndef VMS + /* Put the slash back in NAME. */ + *p = '/'; +#endif + + if (exists_in_cache) /* Makefile-mentioned file need not exist. */ + { + int e; + + EINTRLOOP (e, stat (name, &st)); /* Does it really exist? */ + if (e != 0) + { + exists = 0; + continue; + } + + /* Store the modtime into *MTIME_PTR for the caller. */ + if (mtime_ptr != 0) + { + *mtime_ptr = FILE_TIMESTAMP_STAT_MODTIME (name, st); + mtime_ptr = 0; + } + } + + /* We have found a file. + If we get here and mtime_ptr hasn't been set, record + UNKNOWN_MTIME to indicate this. */ + if (mtime_ptr != 0) + *mtime_ptr = UNKNOWN_MTIME; + + /* Store the name we found and return it. */ + + if (path_index) + *path_index = i; + + return strcache_add_len (name, (p + 1 - name) + flen); + } + } + + return 0; +} + + +/* Search the VPATH list whose pattern matches FILE for a directory where FILE + exists. If it is found, return the cached name of an existing file, and + set *MTIME_PTR (if MTIME_PTR is not NULL) to its modtime (or zero if no + stat call was done). Also set the matching directory index in VPATH_INDEX + and PATH_INDEX if they are not NULL. Otherwise we return 0. */ + +const char * +vpath_search (const char *file, FILE_TIMESTAMP *mtime_ptr, + unsigned int* vpath_index, unsigned int* path_index) +{ + struct vpath *v; + + /* If there are no VPATH entries or FILENAME starts at the root, + there is nothing we can do. */ + + if (file[0] == '/' +#ifdef HAVE_DOS_PATHS + || file[0] == '\\' || file[1] == ':' +#endif + || (vpaths == 0 && general_vpath == 0)) + return 0; + + if (vpath_index) + { + *vpath_index = 0; + *path_index = 0; + } + + for (v = vpaths; v != 0; v = v->next) + { + if (pattern_matches (v->pattern, v->percent, file)) + { + const char *p = selective_vpath_search ( + v, file, mtime_ptr, path_index); + if (p) + return p; + } + + if (vpath_index) + ++*vpath_index; + } + + + if (general_vpath != 0) + { + const char *p = selective_vpath_search ( + general_vpath, file, mtime_ptr, path_index); + if (p) + return p; + } + + return 0; +} + + + + +/* Print the data base of VPATH search paths. */ + +void +print_vpath_data_base (void) +{ + unsigned int nvpaths; + struct vpath *v; + + puts (_("\n# VPATH Search Paths\n")); + + nvpaths = 0; + for (v = vpaths; v != 0; v = v->next) + { + register unsigned int i; + + ++nvpaths; + + printf ("vpath %s ", v->pattern); + + for (i = 0; v->searchpath[i] != 0; ++i) + printf ("%s%c", v->searchpath[i], + v->searchpath[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR); + } + + if (vpaths == 0) + puts (_("# No `vpath' search paths.")); + else + printf (_("\n# %u `vpath' search paths.\n"), nvpaths); + + if (general_vpath == 0) + puts (_("\n# No general (`VPATH' variable) search path.")); + else + { + const char **path = general_vpath->searchpath; + unsigned int i; + + fputs (_("\n# General (`VPATH' variable) search path:\n# "), stdout); + + for (i = 0; path[i] != 0; ++i) + printf ("%s%c", path[i], + path[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR); + } +} diff --git a/w32/.deps/libw32_a-misc.Po b/w32/.deps/libw32_a-misc.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/w32/.deps/libw32_a-misc.Po @@ -0,0 +1 @@ +# dummy diff --git a/w32/.deps/libw32_a-pathstuff.Po b/w32/.deps/libw32_a-pathstuff.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/w32/.deps/libw32_a-pathstuff.Po @@ -0,0 +1 @@ +# dummy diff --git a/w32/.deps/libw32_a-sub_proc.Po b/w32/.deps/libw32_a-sub_proc.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/w32/.deps/libw32_a-sub_proc.Po @@ -0,0 +1 @@ +# dummy diff --git a/w32/.deps/libw32_a-w32err.Po b/w32/.deps/libw32_a-w32err.Po new file mode 100644 index 0000000..9ce06a8 --- /dev/null +++ b/w32/.deps/libw32_a-w32err.Po @@ -0,0 +1 @@ +# dummy diff --git a/w32/Makefile b/w32/Makefile new file mode 100644 index 0000000..8c95760 --- /dev/null +++ b/w32/Makefile @@ -0,0 +1,536 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# w32/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +# Makefile.am to create libw32.a for mingw32 host. +# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + + +pkgdatadir = $(datadir)/make +pkgincludedir = $(includedir)/make +pkglibdir = $(libdir)/make +pkglibexecdir = $(libexecdir)/make +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-unknown-linux-gnu +host_triplet = x86_64-unknown-linux-gnu +subdir = w32 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/isc-posix.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libw32_a_AR = $(AR) $(ARFLAGS) +libw32_a_LIBADD = +am_libw32_a_OBJECTS = libw32_a-misc.$(OBJEXT) \ + libw32_a-sub_proc.$(OBJEXT) libw32_a-w32err.$(OBJEXT) \ + libw32_a-pathstuff.$(OBJEXT) +libw32_a_OBJECTS = $(am_libw32_a_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libw32_a_SOURCES) +DIST_SOURCES = $(libw32_a_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /home/psmith/src/make/make-rel/config/missing --run aclocal-1.11 +ALLOCA = +AMTAR = ${SHELL} /home/psmith/src/make/make-rel/config/missing --run tar +AR = ar +AUTOCONF = ${SHELL} /home/psmith/src/make/make-rel/config/missing --run autoconf +AUTOHEADER = ${SHELL} /home/psmith/src/make/make-rel/config/missing --run autoheader +AUTOMAKE = ${SHELL} /home/psmith/src/make/make-rel/config/missing --run automake-1.11 +AWK = gawk +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPP = gcc -E +CPPFLAGS = +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /bin/grep -E +EXEEXT = +GETLOADAVG_LIBS = +GLOBINC = +GLOBLIB = +GMSGFMT = /usr/bin/msgfmt +GREP = /bin/grep +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +INTLLIBS = +KMEM_GROUP = +LDFLAGS = +LIBICONV = -liconv +LIBINTL = +LIBOBJS = +LIBS = -lrt +LTLIBICONV = -liconv +LTLIBINTL = +LTLIBOBJS = +MAKEINFO = ${SHELL} /home/psmith/src/make/make-rel/config/missing --run makeinfo +MAKE_HOST = x86_64-unknown-linux-gnu +MKDIR_P = /bin/mkdir -p +MKINSTALLDIRS = $(top_builddir)/config/mkinstalldirs +MSGFMT = /usr/bin/msgfmt +MSGMERGE = /usr/bin/msgmerge +NEED_SETGID = false +OBJEXT = o +PACKAGE = make +PACKAGE_BUGREPORT = bug-make@gnu.org +PACKAGE_NAME = GNU make +PACKAGE_STRING = GNU make 3.82 +PACKAGE_TARNAME = make +PACKAGE_URL = http://www.gnu.org/software/make/ +PACKAGE_VERSION = 3.82 +PATH_SEPARATOR = : +PERL = perl +POSUB = po +RANLIB = ranlib +REMOTE = stub +SET_MAKE = +SHELL = /bin/bash +STRIP = +USE_NLS = yes +VERSION = 3.82 +XGETTEXT = /usr/bin/xgettext +abs_builddir = /home/psmith/src/make/make-rel/w32 +abs_srcdir = /home/psmith/src/make/make-rel/w32 +abs_top_builddir = /home/psmith/src/make/make-rel +abs_top_srcdir = /home/psmith/src/make/make-rel +ac_ct_CC = gcc +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +bindir = ${exec_prefix}/bin +build = x86_64-unknown-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = unknown +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-unknown-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = unknown +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /home/psmith/src/make/make-rel/config/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /bin/mkdir -p +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../ +top_builddir = .. +top_srcdir = .. +noinst_LIBRARIES = libw32.a +libw32_a_SOURCES = subproc/misc.c subproc/sub_proc.c subproc/w32err.c \ + pathstuff.c + +libw32_a_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/subproc -I$(top_srcdir) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu w32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu w32/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libw32.a: $(libw32_a_OBJECTS) $(libw32_a_DEPENDENCIES) + -rm -f libw32.a + $(libw32_a_AR) libw32.a $(libw32_a_OBJECTS) $(libw32_a_LIBADD) + $(RANLIB) libw32.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/libw32_a-misc.Po +include ./$(DEPDIR)/libw32_a-pathstuff.Po +include ./$(DEPDIR)/libw32_a-sub_proc.Po +include ./$(DEPDIR)/libw32_a-w32err.Po + +.c.o: + $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c $< + +.c.obj: + $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c `$(CYGPATH_W) '$<'` + +libw32_a-misc.o: subproc/misc.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-misc.o -MD -MP -MF $(DEPDIR)/libw32_a-misc.Tpo -c -o libw32_a-misc.o `test -f 'subproc/misc.c' || echo '$(srcdir)/'`subproc/misc.c + $(am__mv) $(DEPDIR)/libw32_a-misc.Tpo $(DEPDIR)/libw32_a-misc.Po +# source='subproc/misc.c' object='libw32_a-misc.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-misc.o `test -f 'subproc/misc.c' || echo '$(srcdir)/'`subproc/misc.c + +libw32_a-misc.obj: subproc/misc.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-misc.obj -MD -MP -MF $(DEPDIR)/libw32_a-misc.Tpo -c -o libw32_a-misc.obj `if test -f 'subproc/misc.c'; then $(CYGPATH_W) 'subproc/misc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/misc.c'; fi` + $(am__mv) $(DEPDIR)/libw32_a-misc.Tpo $(DEPDIR)/libw32_a-misc.Po +# source='subproc/misc.c' object='libw32_a-misc.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-misc.obj `if test -f 'subproc/misc.c'; then $(CYGPATH_W) 'subproc/misc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/misc.c'; fi` + +libw32_a-sub_proc.o: subproc/sub_proc.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-sub_proc.o -MD -MP -MF $(DEPDIR)/libw32_a-sub_proc.Tpo -c -o libw32_a-sub_proc.o `test -f 'subproc/sub_proc.c' || echo '$(srcdir)/'`subproc/sub_proc.c + $(am__mv) $(DEPDIR)/libw32_a-sub_proc.Tpo $(DEPDIR)/libw32_a-sub_proc.Po +# source='subproc/sub_proc.c' object='libw32_a-sub_proc.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-sub_proc.o `test -f 'subproc/sub_proc.c' || echo '$(srcdir)/'`subproc/sub_proc.c + +libw32_a-sub_proc.obj: subproc/sub_proc.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-sub_proc.obj -MD -MP -MF $(DEPDIR)/libw32_a-sub_proc.Tpo -c -o libw32_a-sub_proc.obj `if test -f 'subproc/sub_proc.c'; then $(CYGPATH_W) 'subproc/sub_proc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/sub_proc.c'; fi` + $(am__mv) $(DEPDIR)/libw32_a-sub_proc.Tpo $(DEPDIR)/libw32_a-sub_proc.Po +# source='subproc/sub_proc.c' object='libw32_a-sub_proc.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-sub_proc.obj `if test -f 'subproc/sub_proc.c'; then $(CYGPATH_W) 'subproc/sub_proc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/sub_proc.c'; fi` + +libw32_a-w32err.o: subproc/w32err.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-w32err.o -MD -MP -MF $(DEPDIR)/libw32_a-w32err.Tpo -c -o libw32_a-w32err.o `test -f 'subproc/w32err.c' || echo '$(srcdir)/'`subproc/w32err.c + $(am__mv) $(DEPDIR)/libw32_a-w32err.Tpo $(DEPDIR)/libw32_a-w32err.Po +# source='subproc/w32err.c' object='libw32_a-w32err.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-w32err.o `test -f 'subproc/w32err.c' || echo '$(srcdir)/'`subproc/w32err.c + +libw32_a-w32err.obj: subproc/w32err.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-w32err.obj -MD -MP -MF $(DEPDIR)/libw32_a-w32err.Tpo -c -o libw32_a-w32err.obj `if test -f 'subproc/w32err.c'; then $(CYGPATH_W) 'subproc/w32err.c'; else $(CYGPATH_W) '$(srcdir)/subproc/w32err.c'; fi` + $(am__mv) $(DEPDIR)/libw32_a-w32err.Tpo $(DEPDIR)/libw32_a-w32err.Po +# source='subproc/w32err.c' object='libw32_a-w32err.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-w32err.obj `if test -f 'subproc/w32err.c'; then $(CYGPATH_W) 'subproc/w32err.c'; else $(CYGPATH_W) '$(srcdir)/subproc/w32err.c'; fi` + +libw32_a-pathstuff.o: pathstuff.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-pathstuff.o -MD -MP -MF $(DEPDIR)/libw32_a-pathstuff.Tpo -c -o libw32_a-pathstuff.o `test -f 'pathstuff.c' || echo '$(srcdir)/'`pathstuff.c + $(am__mv) $(DEPDIR)/libw32_a-pathstuff.Tpo $(DEPDIR)/libw32_a-pathstuff.Po +# source='pathstuff.c' object='libw32_a-pathstuff.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-pathstuff.o `test -f 'pathstuff.c' || echo '$(srcdir)/'`pathstuff.c + +libw32_a-pathstuff.obj: pathstuff.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-pathstuff.obj -MD -MP -MF $(DEPDIR)/libw32_a-pathstuff.Tpo -c -o libw32_a-pathstuff.obj `if test -f 'pathstuff.c'; then $(CYGPATH_W) 'pathstuff.c'; else $(CYGPATH_W) '$(srcdir)/pathstuff.c'; fi` + $(am__mv) $(DEPDIR)/libw32_a-pathstuff.Tpo $(DEPDIR)/libw32_a-pathstuff.Po +# source='pathstuff.c' object='libw32_a-pathstuff.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-pathstuff.obj `if test -f 'pathstuff.c'; then $(CYGPATH_W) 'pathstuff.c'; else $(CYGPATH_W) '$(srcdir)/pathstuff.c'; fi` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-noinstLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/w32/Makefile.am b/w32/Makefile.am new file mode 100644 index 0000000..b8e2071 --- /dev/null +++ b/w32/Makefile.am @@ -0,0 +1,24 @@ +# Makefile.am to create libw32.a for mingw32 host. +# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +noinst_LIBRARIES = libw32.a + +libw32_a_SOURCES = subproc/misc.c subproc/sub_proc.c subproc/w32err.c \ + pathstuff.c + +libw32_a_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/subproc -I$(top_srcdir) diff --git a/w32/Makefile.in b/w32/Makefile.in new file mode 100644 index 0000000..c5ea5b5 --- /dev/null +++ b/w32/Makefile.in @@ -0,0 +1,536 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile.am to create libw32.a for mingw32 host. +# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = w32 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \ + $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \ + $(top_srcdir)/config/isc-posix.m4 \ + $(top_srcdir)/config/lib-ld.m4 \ + $(top_srcdir)/config/lib-link.m4 \ + $(top_srcdir)/config/lib-prefix.m4 $(top_srcdir)/config/nls.m4 \ + $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libw32_a_AR = $(AR) $(ARFLAGS) +libw32_a_LIBADD = +am_libw32_a_OBJECTS = libw32_a-misc.$(OBJEXT) \ + libw32_a-sub_proc.$(OBJEXT) libw32_a-w32err.$(OBJEXT) \ + libw32_a-pathstuff.$(OBJEXT) +libw32_a_OBJECTS = $(am_libw32_a_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libw32_a_SOURCES) +DIST_SOURCES = $(libw32_a_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ +GLOBINC = @GLOBINC@ +GLOBLIB = @GLOBLIB@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +KMEM_GROUP = @KMEM_GROUP@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_HOST = @MAKE_HOST@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NEED_SETGID = @NEED_SETGID@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +REMOTE = @REMOTE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +noinst_LIBRARIES = libw32.a +libw32_a_SOURCES = subproc/misc.c subproc/sub_proc.c subproc/w32err.c \ + pathstuff.c + +libw32_a_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/subproc -I$(top_srcdir) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu w32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu w32/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libw32.a: $(libw32_a_OBJECTS) $(libw32_a_DEPENDENCIES) + -rm -f libw32.a + $(libw32_a_AR) libw32.a $(libw32_a_OBJECTS) $(libw32_a_LIBADD) + $(RANLIB) libw32.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libw32_a-misc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libw32_a-pathstuff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libw32_a-sub_proc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libw32_a-w32err.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +libw32_a-misc.o: subproc/misc.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-misc.o -MD -MP -MF $(DEPDIR)/libw32_a-misc.Tpo -c -o libw32_a-misc.o `test -f 'subproc/misc.c' || echo '$(srcdir)/'`subproc/misc.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libw32_a-misc.Tpo $(DEPDIR)/libw32_a-misc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='subproc/misc.c' object='libw32_a-misc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-misc.o `test -f 'subproc/misc.c' || echo '$(srcdir)/'`subproc/misc.c + +libw32_a-misc.obj: subproc/misc.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-misc.obj -MD -MP -MF $(DEPDIR)/libw32_a-misc.Tpo -c -o libw32_a-misc.obj `if test -f 'subproc/misc.c'; then $(CYGPATH_W) 'subproc/misc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/misc.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libw32_a-misc.Tpo $(DEPDIR)/libw32_a-misc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='subproc/misc.c' object='libw32_a-misc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-misc.obj `if test -f 'subproc/misc.c'; then $(CYGPATH_W) 'subproc/misc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/misc.c'; fi` + +libw32_a-sub_proc.o: subproc/sub_proc.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-sub_proc.o -MD -MP -MF $(DEPDIR)/libw32_a-sub_proc.Tpo -c -o libw32_a-sub_proc.o `test -f 'subproc/sub_proc.c' || echo '$(srcdir)/'`subproc/sub_proc.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libw32_a-sub_proc.Tpo $(DEPDIR)/libw32_a-sub_proc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='subproc/sub_proc.c' object='libw32_a-sub_proc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-sub_proc.o `test -f 'subproc/sub_proc.c' || echo '$(srcdir)/'`subproc/sub_proc.c + +libw32_a-sub_proc.obj: subproc/sub_proc.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-sub_proc.obj -MD -MP -MF $(DEPDIR)/libw32_a-sub_proc.Tpo -c -o libw32_a-sub_proc.obj `if test -f 'subproc/sub_proc.c'; then $(CYGPATH_W) 'subproc/sub_proc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/sub_proc.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libw32_a-sub_proc.Tpo $(DEPDIR)/libw32_a-sub_proc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='subproc/sub_proc.c' object='libw32_a-sub_proc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-sub_proc.obj `if test -f 'subproc/sub_proc.c'; then $(CYGPATH_W) 'subproc/sub_proc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/sub_proc.c'; fi` + +libw32_a-w32err.o: subproc/w32err.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-w32err.o -MD -MP -MF $(DEPDIR)/libw32_a-w32err.Tpo -c -o libw32_a-w32err.o `test -f 'subproc/w32err.c' || echo '$(srcdir)/'`subproc/w32err.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libw32_a-w32err.Tpo $(DEPDIR)/libw32_a-w32err.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='subproc/w32err.c' object='libw32_a-w32err.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-w32err.o `test -f 'subproc/w32err.c' || echo '$(srcdir)/'`subproc/w32err.c + +libw32_a-w32err.obj: subproc/w32err.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-w32err.obj -MD -MP -MF $(DEPDIR)/libw32_a-w32err.Tpo -c -o libw32_a-w32err.obj `if test -f 'subproc/w32err.c'; then $(CYGPATH_W) 'subproc/w32err.c'; else $(CYGPATH_W) '$(srcdir)/subproc/w32err.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libw32_a-w32err.Tpo $(DEPDIR)/libw32_a-w32err.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='subproc/w32err.c' object='libw32_a-w32err.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-w32err.obj `if test -f 'subproc/w32err.c'; then $(CYGPATH_W) 'subproc/w32err.c'; else $(CYGPATH_W) '$(srcdir)/subproc/w32err.c'; fi` + +libw32_a-pathstuff.o: pathstuff.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-pathstuff.o -MD -MP -MF $(DEPDIR)/libw32_a-pathstuff.Tpo -c -o libw32_a-pathstuff.o `test -f 'pathstuff.c' || echo '$(srcdir)/'`pathstuff.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libw32_a-pathstuff.Tpo $(DEPDIR)/libw32_a-pathstuff.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pathstuff.c' object='libw32_a-pathstuff.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-pathstuff.o `test -f 'pathstuff.c' || echo '$(srcdir)/'`pathstuff.c + +libw32_a-pathstuff.obj: pathstuff.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-pathstuff.obj -MD -MP -MF $(DEPDIR)/libw32_a-pathstuff.Tpo -c -o libw32_a-pathstuff.obj `if test -f 'pathstuff.c'; then $(CYGPATH_W) 'pathstuff.c'; else $(CYGPATH_W) '$(srcdir)/pathstuff.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libw32_a-pathstuff.Tpo $(DEPDIR)/libw32_a-pathstuff.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pathstuff.c' object='libw32_a-pathstuff.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-pathstuff.obj `if test -f 'pathstuff.c'; then $(CYGPATH_W) 'pathstuff.c'; else $(CYGPATH_W) '$(srcdir)/pathstuff.c'; fi` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-noinstLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/w32/compat/dirent.c b/w32/compat/dirent.c new file mode 100644 index 0000000..8d66e47 --- /dev/null +++ b/w32/compat/dirent.c @@ -0,0 +1,207 @@ +/* Directory entry code for Window platforms. +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + + +#include +#include +#include +#include +#include +#include +#include "dirent.h" + + +DIR* +opendir(const char* pDirName) +{ + struct stat sb; + DIR* pDir; + char* pEndDirName; + int nBufferLen; + + /* sanity checks */ + if (!pDirName) { + errno = EINVAL; + return NULL; + } + if (stat(pDirName, &sb) != 0) { + errno = ENOENT; + return NULL; + } + if ((sb.st_mode & S_IFMT) != S_IFDIR) { + errno = ENOTDIR; + return NULL; + } + + /* allocate a DIR structure to return */ + pDir = (DIR *) malloc(sizeof (DIR)); + + if (!pDir) + return NULL; + + /* input directory name length */ + nBufferLen = strlen(pDirName); + + /* copy input directory name to DIR buffer */ + strcpy(pDir->dir_pDirectoryName, pDirName); + + /* point to end of the copied directory name */ + pEndDirName = &pDir->dir_pDirectoryName[nBufferLen - 1]; + + /* if directory name did not end in '/' or '\', add '/' */ + if ((*pEndDirName != '/') && (*pEndDirName != '\\')) { + pEndDirName++; + *pEndDirName = '/'; + } + + /* now append the wildcard character to the buffer */ + pEndDirName++; + *pEndDirName = '*'; + pEndDirName++; + *pEndDirName = '\0'; + + /* other values defaulted */ + pDir->dir_nNumFiles = 0; + pDir->dir_hDirHandle = INVALID_HANDLE_VALUE; + pDir->dir_ulCookie = __DIRENT_COOKIE; + + return pDir; +} + +void +closedir(DIR *pDir) +{ + /* got a valid pointer? */ + if (!pDir) { + errno = EINVAL; + return; + } + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) { + errno = EINVAL; + return; + } + + /* close the WINDOWS32 directory handle */ + if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE) + FindClose(pDir->dir_hDirHandle); + + free(pDir); + + return; +} + +struct dirent * +readdir(DIR* pDir) +{ + WIN32_FIND_DATA wfdFindData; + + if (!pDir) { + errno = EINVAL; + return NULL; + } + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) { + errno = EINVAL; + return NULL; + } + + if (pDir->dir_nNumFiles == 0) { + pDir->dir_hDirHandle = FindFirstFile(pDir->dir_pDirectoryName, &wfdFindData); + if (pDir->dir_hDirHandle == INVALID_HANDLE_VALUE) + return NULL; + } else if (!FindNextFile(pDir->dir_hDirHandle, &wfdFindData)) + return NULL; + + /* bump count for next call to readdir() or telldir() */ + pDir->dir_nNumFiles++; + + /* fill in struct dirent values */ + pDir->dir_sdReturn.d_ino = (ino_t)-1; + strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName); + + return &pDir->dir_sdReturn; +} + +void +rewinddir(DIR* pDir) +{ + if (!pDir) { + errno = EINVAL; + return; + } + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) { + errno = EINVAL; + return; + } + + /* close the WINDOWS32 directory handle */ + if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE) + if (!FindClose(pDir->dir_hDirHandle)) + errno = EBADF; + + /* reset members which control readdir() */ + pDir->dir_hDirHandle = INVALID_HANDLE_VALUE; + pDir->dir_nNumFiles = 0; + + return; +} + +int +telldir(DIR* pDir) +{ + if (!pDir) { + errno = EINVAL; + return -1; + } + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) { + errno = EINVAL; + return -1; + } + + /* return number of times readdir() called */ + return pDir->dir_nNumFiles; +} + +void +seekdir(DIR* pDir, long nPosition) +{ + if (!pDir) + return; + + /* sanity check that this is a DIR pointer */ + if (pDir->dir_ulCookie != __DIRENT_COOKIE) + return; + + /* go back to beginning of directory */ + rewinddir(pDir); + + /* loop until we have found position we care about */ + for (--nPosition; nPosition && readdir(pDir); nPosition--); + + /* flag invalid nPosition value */ + if (nPosition) + errno = EINVAL; + + return; +} diff --git a/w32/include/dirent.h b/w32/include/dirent.h new file mode 100644 index 0000000..6e77c8b --- /dev/null +++ b/w32/include/dirent.h @@ -0,0 +1,60 @@ +/* Windows version of dirent.h +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef _DIRENT_H +#define _DIRENT_H + +#ifdef __MINGW32__ +# include +# include_next +#else + +#include +#include +#include +#include + +#ifndef NAME_MAX +#define NAME_MAX 255 +#endif + +#define __DIRENT_COOKIE 0xfefeabab + + +struct dirent +{ + ino_t d_ino; /* unused - no equivalent on WINDOWS32 */ + char d_name[NAME_MAX+1]; +}; + +typedef struct dir_struct { + ULONG dir_ulCookie; + HANDLE dir_hDirHandle; + DWORD dir_nNumFiles; + char dir_pDirectoryName[NAME_MAX+1]; + struct dirent dir_sdReturn; +} DIR; + +DIR *opendir(const char *); +struct dirent *readdir(DIR *); +void rewinddir(DIR *); +void closedir(DIR *); +int telldir(DIR *); +void seekdir(DIR *, long); + +#endif /* !__MINGW32__ */ +#endif diff --git a/w32/include/pathstuff.h b/w32/include/pathstuff.h new file mode 100644 index 0000000..e56e822 --- /dev/null +++ b/w32/include/pathstuff.h @@ -0,0 +1,26 @@ +/* Definitions for Windows path manipulation. +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef _PATHSTUFF_H +#define _PATHSTUFF_H + +char *convert_Path_to_windows32(char *Path, char to_delim); +char *convert_vpath_to_windows32(char *Path, char to_delim); +char *w32ify(const char *file, int resolve); +char *getcwd_fs(char *buf, int len); + +#endif diff --git a/w32/include/sub_proc.h b/w32/include/sub_proc.h new file mode 100644 index 0000000..8166dce --- /dev/null +++ b/w32/include/sub_proc.h @@ -0,0 +1,60 @@ +/* Definitions for Windows process invocation. +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef SUB_PROC_H +#define SUB_PROC_H + +/* + * Component Name: + * + * $Date: 2010/07/13 01:20:43 $ + * + * $Source: /sources/make/make/w32/include/sub_proc.h,v $ + * + * $Id: sub_proc.h,v 1.12 2010/07/13 01:20:43 psmith Exp $ + */ + +#define EXTERN_DECL(entry, args) extern entry args +#define VOID_DECL void + +EXTERN_DECL(HANDLE process_init, (VOID_DECL)); +EXTERN_DECL(HANDLE process_init_fd, (HANDLE stdinh, HANDLE stdouth, + HANDLE stderrh)); +EXTERN_DECL(long process_begin, (HANDLE proc, char **argv, char **envp, + char *exec_path, char *as_user)); +EXTERN_DECL(long process_pipe_io, (HANDLE proc, char *stdin_data, + int stdin_data_len)); +EXTERN_DECL(long process_file_io, (HANDLE proc)); +EXTERN_DECL(void process_cleanup, (HANDLE proc)); +EXTERN_DECL(HANDLE process_wait_for_any, (VOID_DECL)); +EXTERN_DECL(void process_register, (HANDLE proc)); +EXTERN_DECL(HANDLE process_easy, (char** argv, char** env)); +EXTERN_DECL(BOOL process_kill, (HANDLE proc, int signal)); +EXTERN_DECL(int process_used_slots, (VOID_DECL)); + +/* support routines */ +EXTERN_DECL(long process_errno, (HANDLE proc)); +EXTERN_DECL(long process_last_err, (HANDLE proc)); +EXTERN_DECL(long process_exit_code, (HANDLE proc)); +EXTERN_DECL(long process_signal, (HANDLE proc)); +EXTERN_DECL(char * process_outbuf, (HANDLE proc)); +EXTERN_DECL(char * process_errbuf, (HANDLE proc)); +EXTERN_DECL(int process_outcnt, (HANDLE proc)); +EXTERN_DECL(int process_errcnt, (HANDLE proc)); +EXTERN_DECL(void process_pipes, (HANDLE proc, int pipes[3])); + +#endif diff --git a/w32/include/w32err.h b/w32/include/w32err.h new file mode 100644 index 0000000..65369ba --- /dev/null +++ b/w32/include/w32err.h @@ -0,0 +1,27 @@ +/* Definitions for Windows error handling. +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef _W32ERR_H_ +#define _W32ERR_H_ + +#ifndef EXTERN_DECL +#define EXTERN_DECL(entry, args) entry args +#endif + +EXTERN_DECL(char * map_windows32_error_to_string, (DWORD error)); + +#endif /* !_W32ERR_H */ diff --git a/w32/pathstuff.c b/w32/pathstuff.c new file mode 100644 index 0000000..1f8269e --- /dev/null +++ b/w32/pathstuff.c @@ -0,0 +1,267 @@ +/* Path conversion for Windows pathnames. +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include "make.h" +#include +#include +#include "pathstuff.h" + +/* + * Convert delimiter separated vpath to Canonical format. + */ +char * +convert_vpath_to_windows32(char *Path, char to_delim) +{ + char *etok; /* token separator for old Path */ + + /* + * Convert all spaces to delimiters. Note that pathnames which + * contain blanks get trounced here. Use 8.3 format as a workaround. + */ + for (etok = Path; etok && *etok; etok++) + if (isblank ((unsigned char) *etok)) + *etok = to_delim; + + return (convert_Path_to_windows32(Path, to_delim)); +} + +/* + * Convert delimiter separated path to Canonical format. + */ +char * +convert_Path_to_windows32(char *Path, char to_delim) +{ + char *etok; /* token separator for old Path */ + char *p; /* points to element of old Path */ + + /* is this a multi-element Path ? */ + /* FIXME: Perhaps use ":;\"" in strpbrk to convert all quotes to + delimiters as well, as a way to handle quoted directories in + PATH? */ + for (p = Path, etok = strpbrk(p, ":;"); + etok; + etok = strpbrk(p, ":;")) + if ((etok - p) == 1) { + if (*(etok - 1) == ';' || + *(etok - 1) == ':') { + etok[-1] = to_delim; + etok[0] = to_delim; + p = ++etok; + continue; /* ignore empty bucket */ + } else if (!isalpha ((unsigned char) *p)) { + /* found one to count, handle things like '.' */ + *etok = to_delim; + p = ++etok; + } else if ((*etok == ':') && (etok = strpbrk(etok+1, ":;"))) { + /* found one to count, handle drive letter */ + *etok = to_delim; + p = ++etok; + } else + /* all finished, force abort */ + p += strlen(p); + } else if (*p == '"') { /* a quoted directory */ + for (p++; *p && *p != '"'; p++) /* skip quoted part */ + ; + etok = strpbrk(p, ":;"); /* find next delimiter */ + if (etok) { + *etok = to_delim; + p = ++etok; + } else + p += strlen(p); + } else { + /* found another one, no drive letter */ + *etok = to_delim; + p = ++etok; + } + + return Path; +} + +/* + * Convert to forward slashes. Resolve to full pathname optionally + */ +char * +w32ify(const char *filename, int resolve) +{ + static char w32_path[FILENAME_MAX]; + char *p; + + if (resolve) + _fullpath(w32_path, filename, sizeof (w32_path)); + else + strncpy(w32_path, filename, sizeof (w32_path)); + + for (p = w32_path; p && *p; p++) + if (*p == '\\') + *p = '/'; + + return w32_path; +} + +char * +getcwd_fs(char* buf, int len) +{ + char *p = getcwd(buf, len); + + if (p) { + char *q = w32ify(buf, 0); + strncpy(buf, q, len); + } + + return p; +} + +#ifdef unused +/* + * Convert delimiter separated pathnames (e.g. PATH) or single file pathname + * (e.g. c:/foo, c:\bar) to NutC format. If we are handed a string that + * _NutPathToNutc() fails to convert, just return the path we were handed + * and assume the caller will know what to do with it (It was probably + * a mistake to try and convert it anyway due to some of the bizarre things + * that might look like pathnames in makefiles). + */ +char * +convert_path_to_nutc(char *path) +{ + int count; /* count of path elements */ + char *nutc_path; /* new NutC path */ + int nutc_path_len; /* length of buffer to allocate for new path */ + char *pathp; /* pointer to nutc_path used to build it */ + char *etok; /* token separator for old path */ + char *p; /* points to element of old path */ + char sep; /* what flavor of separator used in old path */ + char *rval; + + /* is this a multi-element path ? */ + for (p = path, etok = strpbrk(p, ":;"), count = 0; + etok; + etok = strpbrk(p, ":;")) + if ((etok - p) == 1) { + if (*(etok - 1) == ';' || + *(etok - 1) == ':') { + p = ++etok; + continue; /* ignore empty bucket */ + } else if (etok = strpbrk(etok+1, ":;")) + /* found one to count, handle drive letter */ + p = ++etok, count++; + else + /* all finished, force abort */ + p += strlen(p); + } else + /* found another one, no drive letter */ + p = ++etok, count++; + + if (count) { + count++; /* x1;x2;x3 <- need to count x3 */ + + /* + * Hazard a guess on how big the buffer needs to be. + * We have to convert things like c:/foo to /c=/foo. + */ + nutc_path_len = strlen(path) + (count*2) + 1; + nutc_path = xmalloc(nutc_path_len); + pathp = nutc_path; + *pathp = '\0'; + + /* + * Loop through PATH and convert one elemnt of the path at at + * a time. Single file pathnames will fail this and fall + * to the logic below loop. + */ + for (p = path, etok = strpbrk(p, ":;"); + etok; + etok = strpbrk(p, ":;")) { + + /* don't trip up on device specifiers or empty path slots */ + if ((etok - p) == 1) + if (*(etok - 1) == ';' || + *(etok - 1) == ':') { + p = ++etok; + continue; + } else if ((etok = strpbrk(etok+1, ":;")) == NULL) + break; /* thing found was a WINDOWS32 pathname */ + + /* save separator */ + sep = *etok; + + /* terminate the current path element -- temporarily */ + *etok = '\0'; + +#ifdef __NUTC__ + /* convert to NutC format */ + if (_NutPathToNutc(p, pathp, 0) == FALSE) { + free(nutc_path); + rval = savestring(path, strlen(path)); + return rval; + } +#else + *pathp++ = '/'; + *pathp++ = p[0]; + *pathp++ = '='; + *pathp++ = '/'; + strcpy(pathp, &p[2]); +#endif + + pathp += strlen(pathp); + *pathp++ = ':'; /* use Unix style path separtor for new path */ + *pathp = '\0'; /* make sure we are null terminaed */ + + /* restore path separator */ + *etok = sep; + + /* point p to first char of next path element */ + p = ++etok; + + } + } else { + nutc_path_len = strlen(path) + 3; + nutc_path = xmalloc(nutc_path_len); + pathp = nutc_path; + *pathp = '\0'; + p = path; + } + + /* + * OK, here we handle the last element in PATH (e.g. c of a;b;c) + * or the path was a single filename and will be converted + * here. Note, testing p here assures that we don't trip up + * on paths like a;b; which have trailing delimiter followed by + * nothing. + */ + if (*p != '\0') { +#ifdef __NUTC__ + if (_NutPathToNutc(p, pathp, 0) == FALSE) { + free(nutc_path); + rval = savestring(path, strlen(path)); + return rval; + } +#else + *pathp++ = '/'; + *pathp++ = p[0]; + *pathp++ = '='; + *pathp++ = '/'; + strcpy(pathp, &p[2]); +#endif + } else + *(pathp-1) = '\0'; /* we're already done, don't leave trailing : */ + + rval = savestring(nutc_path, strlen(nutc_path)); + free(nutc_path); + return rval; +} + +#endif diff --git a/w32/subproc/NMakefile b/w32/subproc/NMakefile new file mode 100644 index 0000000..46c838c --- /dev/null +++ b/w32/subproc/NMakefile @@ -0,0 +1,61 @@ +# NOTE: If you have no `make' program at all to process this makefile, run +# `build.bat' instead. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is part of GNU Make. +# +# GNU Make 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. +# +# GNU Make 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 . + +# +# NMakefile for GNU Make (subproc library) +# +LIB = lib +CC = cl +MAKE = nmake + +OUTDIR=. +MAKEFILE=NMakefile + +CFLAGS_any = /nologo /MT /W4 /GX /Z7 /YX /D WIN32 /D WINDOWS32 /D _WINDOWS -I. -I../include -I../../ +CFLAGS_debug = $(CFLAGS_any) /Od /D _DEBUG /FR.\WinDebug\ /Fp.\WinDebug\subproc.pch /Fo.\WinDebug/ +CFLAGS_release = $(CFLAGS_any) /O2 /FR.\WinRel\ /Fp.\WinRel\subproc.pch /Fo.\WinRel/ + +all: Release Debug + +Release: + $(MAKE) /f $(MAKEFILE) OUTDIR=WinRel CFLAGS="$(CFLAGS_release)" WinRel/subproc.lib +Debug: + $(MAKE) /f $(MAKEFILE) OUTDIR=WinDebug CFLAGS="$(CFLAGS_debug)" WinDebug/subproc.lib + +clean: + rmdir /s /q WinRel WinDebug + erase *.pdb + +$(OUTDIR): + if not exist .\$@\nul mkdir .\$@ + +OBJS = $(OUTDIR)/misc.obj $(OUTDIR)/w32err.obj $(OUTDIR)/sub_proc.obj + +$(OUTDIR)/subproc.lib: $(OUTDIR) $(OBJS) + $(LIB) -out:$@ @<< + $(OBJS) +<< + +.c{$(OUTDIR)}.obj: + $(CC) $(CFLAGS) /c $< + +$(OUTDIR)/misc.obj: misc.c proc.h +$(OUTDIR)/sub_proc.obj: sub_proc.c ../include/sub_proc.h ../include/w32err.h proc.h +$(OUTDIR)/w32err.obj: w32err.c ../include/w32err.h diff --git a/w32/subproc/build.bat b/w32/subproc/build.bat new file mode 100644 index 0000000..dee4072 --- /dev/null +++ b/w32/subproc/build.bat @@ -0,0 +1,35 @@ +@if "%1" == "gcc" GoTo GCCBuild +if not exist .\WinDebug\nul mkdir .\WinDebug +cl.exe /nologo /MT /W4 /GX /Z7 /YX /Od /I .. /I . /I ../include /D WIN32 /D WINDOWS32 /D _DEBUG /D _WINDOWS /FR.\WinDebug/ /Fp.\WinDebug/subproc.pch /Fo.\WinDebug/ /c misc.c +cl.exe /nologo /MT /W4 /GX /Z7 /YX /Od /I .. /I . /I ../include /I ../.. /D WIN32 /D WINDOWS32 /D _DEBUG /D _WINDOWS /FR.\WinDebug/ /Fp.\WinDebug/subproc.pch /Fo.\WinDebug/ /c sub_proc.c +cl.exe /nologo /MT /W4 /GX /Z7 /YX /Od /I .. /I . /I ../include /D WIN32 /D WINDOWS32 /D _DEBUG /D _WINDOWS /FR.\WinDebug/ /Fp.\WinDebug/subproc.pch /Fo.\WinDebug/ /c w32err.c +lib.exe /NOLOGO /OUT:.\WinDebug\subproc.lib .\WinDebug/misc.obj .\WinDebug/sub_proc.obj .\WinDebug/w32err.obj +if not exist .\WinRel\nul mkdir .\WinRel +cl.exe /nologo /MT /W4 /GX /YX /O2 /I ../include /D WIN32 /D WINDOWS32 /D NDEBUG /D _WINDOWS /FR.\WinRel/ /Fp.\WinRel/subproc.pch /Fo.\WinRel/ /c misc.c +cl.exe /nologo /MT /W4 /GX /YX /O2 /I ../include /I ../.. /D WIN32 /D WINDOWS32 /D NDEBUG /D _WINDOWS /FR.\WinRel/ /Fp.\WinRel/subproc.pch /Fo.\WinRel/ /c sub_proc.c +cl.exe /nologo /MT /W4 /GX /YX /O2 /I ../include /D WIN32 /D WINDOWS32 /D NDEBUG /D _WINDOWS /FR.\WinRel/ /Fp.\WinRel/subproc.pch /Fo.\WinRel/ /c w32err.c +lib.exe /NOLOGO /OUT:.\WinRel\subproc.lib .\WinRel/misc.obj .\WinRel/sub_proc.obj .\WinRel/w32err.obj +GoTo BuildEnd +:GCCBuild +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I.. -I. -I../include -I../.. -DWINDOWS32 -c misc.c -o ../../w32_misc.o +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I.. -I. -I../include -I../.. -DWINDOWS32 -c sub_proc.c -o ../../sub_proc.o +gcc -mthreads -Wall -gdwarf-2 -g3 -O2 -I.. -I. -I../include -I../.. -DWINDOWS32 -c w32err.c -o ../../w32err.o +:BuildEnd + +@echo off +rem Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +rem 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +rem This file is part of GNU Make. +rem +rem GNU Make is free software; you can redistribute it and/or modify it under +rem the terms of the GNU General Public License as published by the Free +rem Software Foundation; either version 3 of the License, or (at your option) +rem any later version. +rem +rem GNU Make is distributed in the hope that it will be useful, but WITHOUT +rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +rem FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for. +rem more details. +rem +rem You should have received a copy of the GNU General Public License along +rem with this program. If not, see . diff --git a/w32/subproc/misc.c b/w32/subproc/misc.c new file mode 100644 index 0000000..6759c17 --- /dev/null +++ b/w32/subproc/misc.c @@ -0,0 +1,83 @@ +/* Process handling for Windows +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include +#include +#include +#include +#include +#include "proc.h" + + +/* + * Description: Convert a NULL string terminated UNIX environment block to + * an environment block suitable for a windows32 system call + * + * Returns: TRUE= success, FALSE=fail + * + * Notes/Dependencies: the environment block is sorted in case-insensitive + * order, is double-null terminated, and is a char *, not a char ** + */ +int _cdecl compare(const void *a1, const void *a2) +{ + return _stricoll(*((char**)a1),*((char**)a2)); +} +bool_t +arr2envblk(char **arr, char **envblk_out) +{ + char **tmp; + int size_needed; + int arrcnt; + char *ptr; + + arrcnt = 0; + while (arr[arrcnt]) { + arrcnt++; + } + + tmp = (char**) calloc(arrcnt + 1, sizeof(char *)); + if (!tmp) { + return FALSE; + } + + arrcnt = 0; + size_needed = 0; + while (arr[arrcnt]) { + tmp[arrcnt] = arr[arrcnt]; + size_needed += strlen(arr[arrcnt]) + 1; + arrcnt++; + } + size_needed++; + + qsort((void *) tmp, (size_t) arrcnt, sizeof (char*), compare); + + ptr = *envblk_out = calloc(size_needed, 1); + if (!ptr) { + free(tmp); + return FALSE; + } + + arrcnt = 0; + while (tmp[arrcnt]) { + strcpy(ptr, tmp[arrcnt]); + ptr += strlen(tmp[arrcnt]) + 1; + arrcnt++; + } + + free(tmp); + return TRUE; +} diff --git a/w32/subproc/proc.h b/w32/subproc/proc.h new file mode 100644 index 0000000..00b4bac --- /dev/null +++ b/w32/subproc/proc.h @@ -0,0 +1,30 @@ +/* Definitions for Windows +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#ifndef _PROC_H +#define _PROC_H + +typedef int bool_t; + +#define E_SCALL 101 +#define E_IO 102 +#define E_NO_MEM 103 +#define E_FORK 104 + +extern bool_t arr2envblk(char **arr, char **envblk_out); + +#endif diff --git a/w32/subproc/sub_proc.c b/w32/subproc/sub_proc.c new file mode 100644 index 0000000..dcb77bf --- /dev/null +++ b/w32/subproc/sub_proc.c @@ -0,0 +1,1274 @@ +/* Process handling for Windows. +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include +#include +#include +#ifdef _MSC_VER +# include /* for intptr_t */ +#else +# include +#endif +#include /* for msvc _beginthreadex, _endthreadex */ +#include +#include + +#include "sub_proc.h" +#include "proc.h" +#include "w32err.h" +#include "debug.h" + +static char *make_command_line(char *shell_name, char *exec_path, char **argv); +extern char *xmalloc (unsigned int); + +typedef struct sub_process_t { + intptr_t sv_stdin[2]; + intptr_t sv_stdout[2]; + intptr_t sv_stderr[2]; + int using_pipes; + char *inp; + DWORD incnt; + char * volatile outp; + volatile DWORD outcnt; + char * volatile errp; + volatile DWORD errcnt; + pid_t pid; + int exit_code; + int signal; + long last_err; + long lerrno; +} sub_process; + +/* keep track of children so we can implement a waitpid-like routine */ +static sub_process *proc_array[MAXIMUM_WAIT_OBJECTS]; +static int proc_index = 0; +static int fake_exits_pending = 0; + +/* + * When a process has been waited for, adjust the wait state + * array so that we don't wait for it again + */ +static void +process_adjust_wait_state(sub_process* pproc) +{ + int i; + + if (!proc_index) + return; + + for (i = 0; i < proc_index; i++) + if (proc_array[i]->pid == pproc->pid) + break; + + if (i < proc_index) { + proc_index--; + if (i != proc_index) + memmove(&proc_array[i], &proc_array[i+1], + (proc_index-i) * sizeof(sub_process*)); + proc_array[proc_index] = NULL; + } +} + +/* + * Waits for any of the registered child processes to finish. + */ +static sub_process * +process_wait_for_any_private(void) +{ + HANDLE handles[MAXIMUM_WAIT_OBJECTS]; + DWORD retval, which; + int i; + + if (!proc_index) + return NULL; + + /* build array of handles to wait for */ + for (i = 0; i < proc_index; i++) { + handles[i] = (HANDLE) proc_array[i]->pid; + + if (fake_exits_pending && proc_array[i]->exit_code) + break; + } + + /* wait for someone to exit */ + if (!fake_exits_pending) { + retval = WaitForMultipleObjects(proc_index, handles, FALSE, INFINITE); + which = retval - WAIT_OBJECT_0; + } else { + fake_exits_pending--; + retval = !WAIT_FAILED; + which = i; + } + + /* return pointer to process */ + if (retval != WAIT_FAILED) { + sub_process* pproc = proc_array[which]; + process_adjust_wait_state(pproc); + return pproc; + } else + return NULL; +} + +/* + * Terminate a process. + */ +BOOL +process_kill(HANDLE proc, int signal) +{ + sub_process* pproc = (sub_process*) proc; + pproc->signal = signal; + return (TerminateProcess((HANDLE) pproc->pid, signal)); +} + +/* + * Use this function to register processes you wish to wait for by + * calling process_file_io(NULL) or process_wait_any(). This must be done + * because it is possible for callers of this library to reuse the same + * handle for multiple processes launches :-( + */ +void +process_register(HANDLE proc) +{ + if (proc_index < MAXIMUM_WAIT_OBJECTS) + proc_array[proc_index++] = (sub_process *) proc; +} + +/* + * Return the number of processes that we are still waiting for. + */ +int +process_used_slots(void) +{ + return proc_index; +} + +/* + * Public function which works kind of like waitpid(). Wait for any + * of the children to die and return results. To call this function, + * you must do 1 of things: + * + * x = process_easy(...); + * + * or + * + * x = process_init_fd(); + * process_register(x); + * + * or + * + * x = process_init(); + * process_register(x); + * + * You must NOT then call process_pipe_io() because this function is + * not capable of handling automatic notification of any child + * death. + */ + +HANDLE +process_wait_for_any(void) +{ + sub_process* pproc = process_wait_for_any_private(); + + if (!pproc) + return NULL; + else { + /* + * Ouch! can't tell caller if this fails directly. Caller + * will have to use process_last_err() + */ + (void) process_file_io(pproc); + return ((HANDLE) pproc); + } +} + +long +process_signal(HANDLE proc) +{ + if (proc == INVALID_HANDLE_VALUE) return 0; + return (((sub_process *)proc)->signal); +} + +long +process_last_err(HANDLE proc) +{ + if (proc == INVALID_HANDLE_VALUE) return ERROR_INVALID_HANDLE; + return (((sub_process *)proc)->last_err); +} + +long +process_exit_code(HANDLE proc) +{ + if (proc == INVALID_HANDLE_VALUE) return EXIT_FAILURE; + return (((sub_process *)proc)->exit_code); +} + +/* +2006-02: +All the following functions are currently unused. +All of them would crash gmake if called with argument INVALID_HANDLE_VALUE. +Hence whoever wants to use one of this functions must invent and implement +a reasonable error handling for this function. + +char * +process_outbuf(HANDLE proc) +{ + return (((sub_process *)proc)->outp); +} + +char * +process_errbuf(HANDLE proc) +{ + return (((sub_process *)proc)->errp); +} + +int +process_outcnt(HANDLE proc) +{ + return (((sub_process *)proc)->outcnt); +} + +int +process_errcnt(HANDLE proc) +{ + return (((sub_process *)proc)->errcnt); +} + +void +process_pipes(HANDLE proc, int pipes[3]) +{ + pipes[0] = ((sub_process *)proc)->sv_stdin[0]; + pipes[1] = ((sub_process *)proc)->sv_stdout[0]; + pipes[2] = ((sub_process *)proc)->sv_stderr[0]; + return; +} +*/ + + HANDLE +process_init() +{ + sub_process *pproc; + /* + * open file descriptors for attaching stdin/stdout/sterr + */ + HANDLE stdin_pipes[2]; + HANDLE stdout_pipes[2]; + HANDLE stderr_pipes[2]; + SECURITY_ATTRIBUTES inherit; + BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH]; + + pproc = malloc(sizeof(*pproc)); + memset(pproc, 0, sizeof(*pproc)); + + /* We can't use NULL for lpSecurityDescriptor because that + uses the default security descriptor of the calling process. + Instead we use a security descriptor with no DACL. This + allows nonrestricted access to the associated objects. */ + + if (!InitializeSecurityDescriptor((PSECURITY_DESCRIPTOR)(&sd), + SECURITY_DESCRIPTOR_REVISION)) { + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + return((HANDLE)pproc); + } + + inherit.nLength = sizeof(inherit); + inherit.lpSecurityDescriptor = (PSECURITY_DESCRIPTOR)(&sd); + inherit.bInheritHandle = TRUE; + + // By convention, parent gets pipe[0], and child gets pipe[1] + // This means the READ side of stdin pipe goes into pipe[1] + // and the WRITE side of the stdout and stderr pipes go into pipe[1] + if (CreatePipe( &stdin_pipes[1], &stdin_pipes[0], &inherit, 0) == FALSE || + CreatePipe( &stdout_pipes[0], &stdout_pipes[1], &inherit, 0) == FALSE || + CreatePipe( &stderr_pipes[0], &stderr_pipes[1], &inherit, 0) == FALSE) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + return((HANDLE)pproc); + } + + // + // Mark the parent sides of the pipes as non-inheritable + // + if (SetHandleInformation(stdin_pipes[0], + HANDLE_FLAG_INHERIT, 0) == FALSE || + SetHandleInformation(stdout_pipes[0], + HANDLE_FLAG_INHERIT, 0) == FALSE || + SetHandleInformation(stderr_pipes[0], + HANDLE_FLAG_INHERIT, 0) == FALSE) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + return((HANDLE)pproc); + } + pproc->sv_stdin[0] = (intptr_t) stdin_pipes[0]; + pproc->sv_stdin[1] = (intptr_t) stdin_pipes[1]; + pproc->sv_stdout[0] = (intptr_t) stdout_pipes[0]; + pproc->sv_stdout[1] = (intptr_t) stdout_pipes[1]; + pproc->sv_stderr[0] = (intptr_t) stderr_pipes[0]; + pproc->sv_stderr[1] = (intptr_t) stderr_pipes[1]; + + pproc->using_pipes = 1; + + pproc->lerrno = 0; + + return((HANDLE)pproc); +} + + + HANDLE +process_init_fd(HANDLE stdinh, HANDLE stdouth, HANDLE stderrh) +{ + sub_process *pproc; + + pproc = malloc(sizeof(*pproc)); + memset(pproc, 0, sizeof(*pproc)); + + /* + * Just pass the provided file handles to the 'child side' of the + * pipe, bypassing pipes altogether. + */ + pproc->sv_stdin[1] = (intptr_t) stdinh; + pproc->sv_stdout[1] = (intptr_t) stdouth; + pproc->sv_stderr[1] = (intptr_t) stderrh; + + pproc->last_err = pproc->lerrno = 0; + + return((HANDLE)pproc); +} + + +static HANDLE +find_file(const char *exec_path, const char *path_var, + char *full_fname, DWORD full_len) +{ + HANDLE exec_handle; + char *fname; + char *ext; + DWORD req_len; + int i; + static const char *extensions[] = + /* Should .com come before no-extension case? */ + { ".exe", ".cmd", ".bat", "", ".com", NULL }; + + fname = xmalloc(strlen(exec_path) + 5); + strcpy(fname, exec_path); + ext = fname + strlen(fname); + + for (i = 0; extensions[i]; i++) { + strcpy(ext, extensions[i]); + if (((req_len = SearchPath (path_var, fname, NULL, full_len, + full_fname, NULL)) > 0 + /* For compatibility with previous code, which + used OpenFile, and with Windows operation in + general, also look in various default + locations, such as Windows directory and + Windows System directory. Warning: this also + searches PATH in the Make's environment, which + might not be what the Makefile wants, but it + seems to be OK as a fallback, after the + previous SearchPath failed to find on child's + PATH. */ + || (req_len = SearchPath (NULL, fname, NULL, full_len, + full_fname, NULL)) > 0) + && req_len <= full_len + && (exec_handle = + CreateFile(full_fname, + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL)) != INVALID_HANDLE_VALUE) { + free(fname); + return(exec_handle); + } + } + + free(fname); + return INVALID_HANDLE_VALUE; +} + + +/* + * Description: Create the child process to be helped + * + * Returns: success <=> 0 + * + * Notes/Dependencies: + */ +long +process_begin( + HANDLE proc, + char **argv, + char **envp, + char *exec_path, + char *as_user) +{ + sub_process *pproc = (sub_process *)proc; + char *shell_name = 0; + int file_not_found=0; + HANDLE exec_handle; + char exec_fname[MAX_PATH]; + const char *path_var = NULL; + char **ep; + char buf[256]; + DWORD bytes_returned; + DWORD flags; + char *command_line; + STARTUPINFO startInfo; + PROCESS_INFORMATION procInfo; + char *envblk=NULL; + + /* + * Shell script detection... if the exec_path starts with #! then + * we want to exec shell-script-name exec-path, not just exec-path + * NT doesn't recognize #!/bin/sh or #!/etc/Tivoli/bin/perl. We do not + * hard-code the path to the shell or perl or whatever: Instead, we + * assume it's in the path somewhere (generally, the NT tools + * bin directory) + */ + + /* Use the Makefile's value of PATH to look for the program to + execute, because it could be different from Make's PATH + (e.g., if the target sets its own value. */ + if (envp) + for (ep = envp; *ep; ep++) { + if (strncmp (*ep, "PATH=", 5) == 0 + || strncmp (*ep, "Path=", 5) == 0) { + path_var = *ep + 5; + break; + } + } + exec_handle = find_file(exec_path, path_var, + exec_fname, sizeof(exec_fname)); + + /* + * If we couldn't open the file, just assume that Windows will be + * somehow able to find and execute it. + */ + if (exec_handle == INVALID_HANDLE_VALUE) { + file_not_found++; + } + else { + /* Attempt to read the first line of the file */ + if (ReadFile( exec_handle, + buf, sizeof(buf) - 1, /* leave room for trailing NULL */ + &bytes_returned, 0) == FALSE || bytes_returned < 2) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_IO; + CloseHandle(exec_handle); + return(-1); + } + if (buf[0] == '#' && buf[1] == '!') { + /* + * This is a shell script... Change the command line from + * exec_path args to shell_name exec_path args + */ + char *p; + + /* Make sure buf is NULL terminated */ + buf[bytes_returned] = 0; + /* + * Depending on the file system type, etc. the first line + * of the shell script may end with newline or newline-carriage-return + * Whatever it ends with, cut it off. + */ + p= strchr(buf, '\n'); + if (p) + *p = 0; + p = strchr(buf, '\r'); + if (p) + *p = 0; + + /* + * Find base name of shell + */ + shell_name = strrchr( buf, '/'); + if (shell_name) { + shell_name++; + } else { + shell_name = &buf[2];/* skipping "#!" */ + } + + } + CloseHandle(exec_handle); + } + + flags = 0; + + if (file_not_found) + command_line = make_command_line( shell_name, exec_path, argv); + else + command_line = make_command_line( shell_name, exec_fname, argv); + + if ( command_line == NULL ) { + pproc->last_err = 0; + pproc->lerrno = E_NO_MEM; + return(-1); + } + + if (envp) { + if (arr2envblk(envp, &envblk) ==FALSE) { + pproc->last_err = 0; + pproc->lerrno = E_NO_MEM; + free( command_line ); + return(-1); + } + } + + if ((shell_name) || (file_not_found)) { + exec_path = 0; /* Search for the program in %Path% */ + } else { + exec_path = exec_fname; + } + + /* + * Set up inherited stdin, stdout, stderr for child + */ + GetStartupInfo(&startInfo); + startInfo.dwFlags = STARTF_USESTDHANDLES; + startInfo.lpReserved = 0; + startInfo.cbReserved2 = 0; + startInfo.lpReserved2 = 0; + startInfo.lpTitle = shell_name ? shell_name : exec_path; + startInfo.hStdInput = (HANDLE)pproc->sv_stdin[1]; + startInfo.hStdOutput = (HANDLE)pproc->sv_stdout[1]; + startInfo.hStdError = (HANDLE)pproc->sv_stderr[1]; + + if (as_user) { + if (envblk) free(envblk); + return -1; + } else { + DB (DB_JOBS, ("CreateProcess(%s,%s,...)\n", + exec_path ? exec_path : "NULL", + command_line ? command_line : "NULL")); + if (CreateProcess( + exec_path, + command_line, + NULL, + 0, /* default security attributes for thread */ + TRUE, /* inherit handles (e.g. helper pipes, oserv socket) */ + flags, + envblk, + 0, /* default starting directory */ + &startInfo, + &procInfo) == FALSE) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_FORK; + fprintf(stderr, "process_begin: CreateProcess(%s, %s, ...) failed.\n", + exec_path ? exec_path : "NULL", command_line); + if (envblk) free(envblk); + free( command_line ); + return(-1); + } + } + + pproc->pid = (pid_t)procInfo.hProcess; + /* Close the thread handle -- we'll just watch the process */ + CloseHandle(procInfo.hThread); + + /* Close the halves of the pipes we don't need */ + CloseHandle((HANDLE)pproc->sv_stdin[1]); + CloseHandle((HANDLE)pproc->sv_stdout[1]); + CloseHandle((HANDLE)pproc->sv_stderr[1]); + pproc->sv_stdin[1] = 0; + pproc->sv_stdout[1] = 0; + pproc->sv_stderr[1] = 0; + + free( command_line ); + if (envblk) free(envblk); + pproc->lerrno=0; + return 0; +} + + + +static DWORD +proc_stdin_thread(sub_process *pproc) +{ + DWORD in_done; + for (;;) { + if (WriteFile( (HANDLE) pproc->sv_stdin[0], pproc->inp, pproc->incnt, + &in_done, NULL) == FALSE) + _endthreadex(0); + // This if should never be true for anonymous pipes, but gives + // us a chance to change I/O mechanisms later + if (in_done < pproc->incnt) { + pproc->incnt -= in_done; + pproc->inp += in_done; + } else { + _endthreadex(0); + } + } + return 0; // for compiler warnings only.. not reached +} + +static DWORD +proc_stdout_thread(sub_process *pproc) +{ + DWORD bufsize = 1024; + char c; + DWORD nread; + pproc->outp = malloc(bufsize); + if (pproc->outp == NULL) + _endthreadex(0); + pproc->outcnt = 0; + + for (;;) { + if (ReadFile( (HANDLE)pproc->sv_stdout[0], &c, 1, &nread, NULL) + == FALSE) { +/* map_windows32_error_to_string(GetLastError());*/ + _endthreadex(0); + } + if (nread == 0) + _endthreadex(0); + if (pproc->outcnt + nread > bufsize) { + bufsize += nread + 512; + pproc->outp = realloc(pproc->outp, bufsize); + if (pproc->outp == NULL) { + pproc->outcnt = 0; + _endthreadex(0); + } + } + pproc->outp[pproc->outcnt++] = c; + } + return 0; +} + +static DWORD +proc_stderr_thread(sub_process *pproc) +{ + DWORD bufsize = 1024; + char c; + DWORD nread; + pproc->errp = malloc(bufsize); + if (pproc->errp == NULL) + _endthreadex(0); + pproc->errcnt = 0; + + for (;;) { + if (ReadFile( (HANDLE)pproc->sv_stderr[0], &c, 1, &nread, NULL) == FALSE) { + map_windows32_error_to_string(GetLastError()); + _endthreadex(0); + } + if (nread == 0) + _endthreadex(0); + if (pproc->errcnt + nread > bufsize) { + bufsize += nread + 512; + pproc->errp = realloc(pproc->errp, bufsize); + if (pproc->errp == NULL) { + pproc->errcnt = 0; + _endthreadex(0); + } + } + pproc->errp[pproc->errcnt++] = c; + } + return 0; +} + + +/* + * Purpose: collects output from child process and returns results + * + * Description: + * + * Returns: + * + * Notes/Dependencies: + */ + long +process_pipe_io( + HANDLE proc, + char *stdin_data, + int stdin_data_len) +{ + sub_process *pproc = (sub_process *)proc; + bool_t stdin_eof = FALSE, stdout_eof = FALSE, stderr_eof = FALSE; + HANDLE childhand = (HANDLE) pproc->pid; + HANDLE tStdin = NULL, tStdout = NULL, tStderr = NULL; + unsigned int dwStdin, dwStdout, dwStderr; + HANDLE wait_list[4]; + DWORD wait_count; + DWORD wait_return; + HANDLE ready_hand; + bool_t child_dead = FALSE; + BOOL GetExitCodeResult; + + /* + * Create stdin thread, if needed + */ + pproc->inp = stdin_data; + pproc->incnt = stdin_data_len; + if (!pproc->inp) { + stdin_eof = TRUE; + CloseHandle((HANDLE)pproc->sv_stdin[0]); + pproc->sv_stdin[0] = 0; + } else { + tStdin = (HANDLE) _beginthreadex( 0, 1024, + (unsigned (__stdcall *) (void *))proc_stdin_thread, + pproc, 0, &dwStdin); + if (tStdin == 0) { + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done; + } + } + + /* + * Assume child will produce stdout and stderr + */ + tStdout = (HANDLE) _beginthreadex( 0, 1024, + (unsigned (__stdcall *) (void *))proc_stdout_thread, pproc, 0, + &dwStdout); + tStderr = (HANDLE) _beginthreadex( 0, 1024, + (unsigned (__stdcall *) (void *))proc_stderr_thread, pproc, 0, + &dwStderr); + + if (tStdout == 0 || tStderr == 0) { + + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done; + } + + + /* + * Wait for all I/O to finish and for the child process to exit + */ + + while (!stdin_eof || !stdout_eof || !stderr_eof || !child_dead) { + wait_count = 0; + if (!stdin_eof) { + wait_list[wait_count++] = tStdin; + } + if (!stdout_eof) { + wait_list[wait_count++] = tStdout; + } + if (!stderr_eof) { + wait_list[wait_count++] = tStderr; + } + if (!child_dead) { + wait_list[wait_count++] = childhand; + } + + wait_return = WaitForMultipleObjects(wait_count, wait_list, + FALSE, /* don't wait for all: one ready will do */ + child_dead? 1000 :INFINITE); /* after the child dies, subthreads have + one second to collect all remaining output */ + + if (wait_return == WAIT_FAILED) { +/* map_windows32_error_to_string(GetLastError());*/ + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done; + } + + ready_hand = wait_list[wait_return - WAIT_OBJECT_0]; + + if (ready_hand == tStdin) { + CloseHandle((HANDLE)pproc->sv_stdin[0]); + pproc->sv_stdin[0] = 0; + CloseHandle(tStdin); + tStdin = 0; + stdin_eof = TRUE; + + } else if (ready_hand == tStdout) { + + CloseHandle((HANDLE)pproc->sv_stdout[0]); + pproc->sv_stdout[0] = 0; + CloseHandle(tStdout); + tStdout = 0; + stdout_eof = TRUE; + + } else if (ready_hand == tStderr) { + + CloseHandle((HANDLE)pproc->sv_stderr[0]); + pproc->sv_stderr[0] = 0; + CloseHandle(tStderr); + tStderr = 0; + stderr_eof = TRUE; + + } else if (ready_hand == childhand) { + + DWORD ierr; + GetExitCodeResult = GetExitCodeProcess(childhand, &ierr); + if (ierr == CONTROL_C_EXIT) { + pproc->signal = SIGINT; + } else { + pproc->exit_code = ierr; + } + if (GetExitCodeResult == FALSE) { + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done; + } + child_dead = TRUE; + + } else { + + /* ?? Got back a handle we didn't query ?? */ + pproc->last_err = 0; + pproc->lerrno = E_FAIL; + goto done; + } + } + + done: + if (tStdin != 0) + CloseHandle(tStdin); + if (tStdout != 0) + CloseHandle(tStdout); + if (tStderr != 0) + CloseHandle(tStderr); + + if (pproc->lerrno) + return(-1); + else + return(0); + +} + +/* + * Purpose: collects output from child process and returns results + * + * Description: + * + * Returns: + * + * Notes/Dependencies: + */ + long +process_file_io( + HANDLE proc) +{ + sub_process *pproc; + HANDLE childhand; + DWORD wait_return; + BOOL GetExitCodeResult; + DWORD ierr; + + if (proc == NULL) + pproc = process_wait_for_any_private(); + else + pproc = (sub_process *)proc; + + /* some sort of internal error */ + if (!pproc) + return -1; + + childhand = (HANDLE) pproc->pid; + + /* + * This function is poorly named, and could also be used just to wait + * for child death if you're doing your own pipe I/O. If that is + * the case, close the pipe handles here. + */ + if (pproc->sv_stdin[0]) { + CloseHandle((HANDLE)pproc->sv_stdin[0]); + pproc->sv_stdin[0] = 0; + } + if (pproc->sv_stdout[0]) { + CloseHandle((HANDLE)pproc->sv_stdout[0]); + pproc->sv_stdout[0] = 0; + } + if (pproc->sv_stderr[0]) { + CloseHandle((HANDLE)pproc->sv_stderr[0]); + pproc->sv_stderr[0] = 0; + } + + /* + * Wait for the child process to exit + */ + + wait_return = WaitForSingleObject(childhand, INFINITE); + + if (wait_return != WAIT_OBJECT_0) { +/* map_windows32_error_to_string(GetLastError());*/ + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + goto done2; + } + + GetExitCodeResult = GetExitCodeProcess(childhand, &ierr); + if (ierr == CONTROL_C_EXIT) { + pproc->signal = SIGINT; + } else { + pproc->exit_code = ierr; + } + if (GetExitCodeResult == FALSE) { + pproc->last_err = GetLastError(); + pproc->lerrno = E_SCALL; + } + +done2: + if (pproc->lerrno) + return(-1); + else + return(0); + +} + +/* + * Description: Clean up any leftover handles, etc. It is up to the + * caller to manage and free the input, ouput, and stderr buffers. + */ + void +process_cleanup( + HANDLE proc) +{ + sub_process *pproc = (sub_process *)proc; + int i; + + if (pproc->using_pipes) { + for (i= 0; i <= 1; i++) { + if ((HANDLE)pproc->sv_stdin[i]) + CloseHandle((HANDLE)pproc->sv_stdin[i]); + if ((HANDLE)pproc->sv_stdout[i]) + CloseHandle((HANDLE)pproc->sv_stdout[i]); + if ((HANDLE)pproc->sv_stderr[i]) + CloseHandle((HANDLE)pproc->sv_stderr[i]); + } + } + if ((HANDLE)pproc->pid) + CloseHandle((HANDLE)pproc->pid); + + free(pproc); +} + + +/* + * Description: + * Create a command line buffer to pass to CreateProcess + * + * Returns: the buffer or NULL for failure + * Shell case: sh_name a:/full/path/to/script argv[1] argv[2] ... + * Otherwise: argv[0] argv[1] argv[2] ... + * + * Notes/Dependencies: + * CreateProcess does not take an argv, so this command creates a + * command line for the executable. + */ + +static char * +make_command_line( char *shell_name, char *full_exec_path, char **argv) +{ + int argc = 0; + char** argvi; + int* enclose_in_quotes = NULL; + int* enclose_in_quotes_i; + unsigned int bytes_required = 0; + char* command_line; + char* command_line_i; + int cygwin_mode = 0; /* HAVE_CYGWIN_SHELL */ + int have_sh = 0; /* HAVE_CYGWIN_SHELL */ + +#ifdef HAVE_CYGWIN_SHELL + have_sh = (shell_name != NULL || strstr(full_exec_path, "sh.exe")); + cygwin_mode = 1; +#endif + + if (shell_name && full_exec_path) { + bytes_required + = strlen(shell_name) + 1 + strlen(full_exec_path); + /* + * Skip argv[0] if any, when shell_name is given. + */ + if (*argv) argv++; + /* + * Add one for the intervening space. + */ + if (*argv) bytes_required++; + } + + argvi = argv; + while (*(argvi++)) argc++; + + if (argc) { + enclose_in_quotes = (int*) calloc(1, argc * sizeof(int)); + + if (!enclose_in_quotes) { + return NULL; + } + } + + /* We have to make one pass through each argv[i] to see if we need + * to enclose it in ", so we might as well figure out how much + * memory we'll need on the same pass. + */ + + argvi = argv; + enclose_in_quotes_i = enclose_in_quotes; + while(*argvi) { + char* p = *argvi; + unsigned int backslash_count = 0; + + /* + * We have to enclose empty arguments in ". + */ + if (!(*p)) *enclose_in_quotes_i = 1; + + while(*p) { + switch (*p) { + case '\"': + /* + * We have to insert a backslash for each " + * and each \ that precedes the ". + */ + bytes_required += (backslash_count + 1); + backslash_count = 0; + break; + +#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL) + case '\\': + backslash_count++; + break; +#endif + /* + * At one time we set *enclose_in_quotes_i for '*' or '?' to suppress + * wildcard expansion in programs linked with MSVC's SETARGV.OBJ so + * that argv in always equals argv out. This was removed. Say you have + * such a program named glob.exe. You enter + * glob '*' + * at the sh command prompt. Obviously the intent is to make glob do the + * wildcarding instead of sh. If we set *enclose_in_quotes_i for '*' or '?', + * then the command line that glob would see would be + * glob "*" + * and the _setargv in SETARGV.OBJ would _not_ expand the *. + */ + case ' ': + case '\t': + *enclose_in_quotes_i = 1; + /* fall through */ + + default: + backslash_count = 0; + break; + } + + /* + * Add one for each character in argv[i]. + */ + bytes_required++; + + p++; + } + + if (*enclose_in_quotes_i) { + /* + * Add one for each enclosing ", + * and one for each \ that precedes the + * closing ". + */ + bytes_required += (backslash_count + 2); + } + + /* + * Add one for the intervening space. + */ + if (*(++argvi)) bytes_required++; + enclose_in_quotes_i++; + } + + /* + * Add one for the terminating NULL. + */ + bytes_required++; + + command_line = (char*) malloc(bytes_required); + + if (!command_line) { + if (enclose_in_quotes) free(enclose_in_quotes); + return NULL; + } + + command_line_i = command_line; + + if (shell_name && full_exec_path) { + while(*shell_name) { + *(command_line_i++) = *(shell_name++); + } + + *(command_line_i++) = ' '; + + while(*full_exec_path) { + *(command_line_i++) = *(full_exec_path++); + } + + if (*argv) { + *(command_line_i++) = ' '; + } + } + + argvi = argv; + enclose_in_quotes_i = enclose_in_quotes; + + while(*argvi) { + char* p = *argvi; + unsigned int backslash_count = 0; + + if (*enclose_in_quotes_i) { + *(command_line_i++) = '\"'; + } + + while(*p) { + if (*p == '\"') { + if (cygwin_mode && have_sh) { /* HAVE_CYGWIN_SHELL */ + /* instead of a \", cygwin likes "" */ + *(command_line_i++) = '\"'; + } else { + + /* + * We have to insert a backslash for the " + * and each \ that precedes the ". + */ + backslash_count++; + + while(backslash_count) { + *(command_line_i++) = '\\'; + backslash_count--; + }; + } +#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL) + } else if (*p == '\\') { + backslash_count++; + } else { + backslash_count = 0; +#endif + } + + /* + * Copy the character. + */ + *(command_line_i++) = *(p++); + } + + if (*enclose_in_quotes_i) { +#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL) + /* + * Add one \ for each \ that precedes the + * closing ". + */ + while(backslash_count--) { + *(command_line_i++) = '\\'; + }; +#endif + *(command_line_i++) = '\"'; + } + + /* + * Append an intervening space. + */ + if (*(++argvi)) { + *(command_line_i++) = ' '; + } + + enclose_in_quotes_i++; + } + + /* + * Append the terminating NULL. + */ + *command_line_i = '\0'; + + if (enclose_in_quotes) free(enclose_in_quotes); + return command_line; +} + +/* + * Description: Given an argv and optional envp, launch the process + * using the default stdin, stdout, and stderr handles. + * Also, register process so that process_wait_for_any_private() + * can be used via process_file_io(NULL) or + * process_wait_for_any(). + * + * Returns: + * + * Notes/Dependencies: + */ +HANDLE +process_easy( + char **argv, + char **envp) +{ + HANDLE hIn; + HANDLE hOut; + HANDLE hErr; + HANDLE hProcess; + + if (proc_index >= MAXIMUM_WAIT_OBJECTS) { + DB (DB_JOBS, ("process_easy: All process slots used up\n")); + return INVALID_HANDLE_VALUE; + } + if (DuplicateHandle(GetCurrentProcess(), + GetStdHandle(STD_INPUT_HANDLE), + GetCurrentProcess(), + &hIn, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) { + fprintf(stderr, + "process_easy: DuplicateHandle(In) failed (e=%ld)\n", + GetLastError()); + return INVALID_HANDLE_VALUE; + } + if (DuplicateHandle(GetCurrentProcess(), + GetStdHandle(STD_OUTPUT_HANDLE), + GetCurrentProcess(), + &hOut, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) { + fprintf(stderr, + "process_easy: DuplicateHandle(Out) failed (e=%ld)\n", + GetLastError()); + return INVALID_HANDLE_VALUE; + } + if (DuplicateHandle(GetCurrentProcess(), + GetStdHandle(STD_ERROR_HANDLE), + GetCurrentProcess(), + &hErr, + 0, + TRUE, + DUPLICATE_SAME_ACCESS) == FALSE) { + fprintf(stderr, + "process_easy: DuplicateHandle(Err) failed (e=%ld)\n", + GetLastError()); + return INVALID_HANDLE_VALUE; + } + + hProcess = process_init_fd(hIn, hOut, hErr); + + if (process_begin(hProcess, argv, envp, argv[0], NULL)) { + fake_exits_pending++; + /* process_begin() failed: make a note of that. */ + if (!((sub_process*) hProcess)->last_err) + ((sub_process*) hProcess)->last_err = -1; + ((sub_process*) hProcess)->exit_code = process_last_err(hProcess); + + /* close up unused handles */ + CloseHandle(hIn); + CloseHandle(hOut); + CloseHandle(hErr); + } + + process_register(hProcess); + + return hProcess; +} diff --git a/w32/subproc/w32err.c b/w32/subproc/w32err.c new file mode 100644 index 0000000..80d796e --- /dev/null +++ b/w32/subproc/w32err.c @@ -0,0 +1,70 @@ +/* Error handling for Windows +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +This file is part of GNU Make. + +GNU Make 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. + +GNU Make 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 . */ + +#include +#include "w32err.h" + +/* + * Description: the windows32 version of perror() + * + * Returns: a pointer to a static error + * + * Notes/Dependencies: I got this from + * comp.os.ms-windows.programmer.win32 + */ +char * +map_windows32_error_to_string (DWORD ercode) { +/* __declspec (thread) necessary if you will use multiple threads on MSVC */ +#ifdef _MSC_VER +__declspec (thread) static char szMessageBuffer[128]; +#else +static char szMessageBuffer[128]; +#endif + /* Fill message buffer with a default message in + * case FormatMessage fails + */ + wsprintf (szMessageBuffer, "Error %ld\n", ercode); + + /* + * Special code for winsock error handling. + */ + if (ercode > WSABASEERR) { + HMODULE hModule = GetModuleHandle("wsock32"); + if (hModule != NULL) { + FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, + hModule, + ercode, + LANG_NEUTRAL, + szMessageBuffer, + sizeof(szMessageBuffer), + NULL); + FreeLibrary(hModule); + } + } else { + /* + * Default system message handling + */ + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + ercode, + LANG_NEUTRAL, + szMessageBuffer, + sizeof(szMessageBuffer), + NULL); + } + return szMessageBuffer; +}