home *** CD-ROM | disk | FTP | other *** search
/ ftp.cse.unsw.edu.au / 2014.06.ftp.cse.unsw.edu.au.tar / ftp.cse.unsw.edu.au / pub / doc / papers / misc / config-WRPRC-X11R4 / config-WRPRC.ms next >
Encoding:
Text File  |  1992-10-18  |  20.9 KB  |  692 lines

  1. .\" format with
  2. .\" xroff -ms % | lpr
  3. .\"
  4. .\" revision date - change whenever this file is edited
  5. .ds RD 24 July 1990
  6. .nr PO 1.2i    \" page offset 1.2 inches
  7. .nr PD .7v    \" inter-paragraph distance
  8. .\"
  9. .EH 'Multiple-project Imake'- % -''
  10. .OH ''- % -'Multiple-project Imake'
  11. .OF 'Revision date:\0\0\*(RD'\s+2\*-DRAFT\*-\s-2'Printed:\0\0\n(dy \*(MO 19\n(yr'
  12. .EF 'Revision date:\0\0\*(RD'\s+2\*-DRAFT\*-\s-2'Printed:\0\0\n(dy \*(MO 19\n(yr'
  13. .\"
  14. .\" I - italic font (taken from -ms and changed)
  15. .de I
  16. .nr PQ \\n(.f
  17. .if t \&\\$3\\f2\\$1\\fP\&\\$2
  18. .if n .if \\n(.$=1 \&\\$1
  19. .if n .if \\n(.$>1 \&\\$1\c
  20. .if n .if \\n(.$>1 \&\\$2
  21. ..
  22. .TL
  23. Using Imake for Multiple Projects
  24. .sp .5v
  25. (document version 1.02)
  26. .AU
  27. Paul DuBois
  28. dubois@primate.wisc.edu
  29. .AI
  30. Wisconsin Regional Primate Research Center
  31. Revision date:\0\0\*(RD
  32. .NH
  33. Introduction
  34. .LP
  35. .I imake
  36. is a tool for generating makefiles and is used to allow software projects
  37. to be configured easily on a wide variety of target machines.
  38. It is distributed with projects such as the X Window System and the Kerberos
  39. authentication system.
  40. The tool
  41. .I makedepend
  42. is typically used in conjunction with
  43. .I imake
  44. to generate dependencies in makefiles.
  45. .I xmkmf
  46. is also used, for bootstrapping makefiles from imakefiles.
  47. .LP
  48. This document describes the particular way
  49. .I imake
  50. is used to configure projects at WRPRC.
  51. The method is patterned after the way
  52. .I imake
  53. is employed in the X Window System (version 11, release 4).
  54. The X11R4 method is significantly more developed than in X11R3.
  55. Presumably,
  56. .I imake
  57. as used in Kerberos (currently at protocol revision 4)
  58. might have been used as a base, but I judged it
  59. unsuitable for two reasons: (i) I learned
  60. .I imake
  61. from studying X, so I'm probably imprinted to it;
  62. (ii) development of the configuration files in Kerberos appears to be
  63. at a more primitive level even than in X11R3.
  64. .LP
  65. The X11R4 approach allows configuration files to be stored either
  66. in a well-known system-wide location (e.g.,
  67. .I /usr/lib/config ),
  68. or in a
  69. .I config
  70. directory under the project top-level directory.
  71. .LP
  72. A more-than-passing acquaintance with
  73. .I imake
  74. is assumed here.
  75. Helpful companion documentation includes ``Configuration Management in
  76. the X Window System,'' the configuration and
  77. .I README
  78. files in the X11R4 distribution (in the
  79. .I mit/config
  80. directory), and the WRPRC configuration files (see below for
  81. information on distribution and availability).
  82. .NH
  83. Statement of Problem
  84. .LP
  85. Because of the flexibility
  86. .I imake
  87. provides as a
  88. configuration tool (once you figure out how to use it!),
  89. I had begun to use it on all my projects.
  90. Since these were all developed at the same site, the projects naturally
  91. had quite a bit of configuration information in common.
  92. On the other hand, different projects just as naturally had their own
  93. individual requirements.
  94. .LP
  95. What I had been doing was creating a
  96. .I config
  97. directory in each project directory, with a copy of the configuration files
  98. in each, modified as necessary for the project (otherwise known as ``using
  99. brute force'').
  100. I did not use configuration files in a system-wide location
  101. because of differing project requirements.
  102. At the same time, there was a great deal of redundancy between sets of
  103. configuration files since projects were built and installed
  104. in similar ways.
  105. It seemed rather wasteful and silly not to take advantage of this overlap,
  106. besides the fact that the multiple copies of files contributed to a
  107. maintenance inefficiency when changes were made that affected all projects.
  108. .LP
  109. This (unsatisfactory) situation prompts the question:
  110. how can the number of files to be maintained be minimized and how can
  111. configuration files be shared among projects without sacrificing the ability
  112. to specify project-specific information as necessary?
  113. .NH
  114. Solution to Problem
  115. .LP
  116. Since
  117. .I imake
  118. possessed the ability to look through multiple directories when looking
  119. for configuration files, the simplest solution to the problem seemed to be:
  120. .IP (i)
  121. Create a set of standard configuration files and store them in a well-known
  122. location (referred to here as StdConfigDir).
  123. .IP (ii)
  124. Allow projects to define an alternate configuration directory (referred to
  125. here as ProjConfigDir, typically the
  126. .I config
  127. directory under the project directory).
  128. .IP (iii)
  129. Tell
  130. .I imake
  131. to look through ProjConfigDir, then StdConfigDir for configuration files.
  132. This means changing
  133. .I xmkmf ,
  134. which executes
  135. .I imake ,
  136. and the configuration file definitions that construct
  137. .I imake
  138. commands.
  139. .LP
  140. In other words,
  141. a standard set of configuration files is created and stored in a well-known
  142. location for use by multiple projects.
  143. However, should it be required,
  144. individual projects place configuration files in their own
  145. .I config
  146. directory, which takes precedence over StdConfigDir when
  147. searching for files.
  148. In the degenerate case, projects need supply nothing if
  149. the standard stuff is sufficient; only files in StdConfigDir will be
  150. used.
  151. .NH
  152. Implementation of Solution
  153. .NH 2
  154. Imake.tmpl Architecture
  155. .LP
  156. The architecture of the
  157. .I imake
  158. template,
  159. .I Imake.tmpl ,
  160. as used in X11R4 is, roughly:
  161. .LP
  162. .DS
  163. .ta 3i
  164. header block section
  165. #include <\fIplatform\fR.cf>    (platform-specific definitions)
  166. #include <site.def>        (site-specific definitions)
  167. system description, build and installation definitions
  168. #include <Project.tmpl>    (project-specific definitions)
  169. #include <Imake.rules>    (\fIimake\fR rules)
  170. #include "./Imakefile"    (\fIImakefile\fR for current directory)
  171. .DE
  172. .LP
  173. The header block section determines the machine type and the
  174. platform-specific file
  175. .I platform .cf
  176. to be included.
  177. .LP
  178. To accommodate other project-specific files, extra
  179. #include's are introduced into
  180. .I Imake.tmpl .
  181. The resulting modified architecture becomes:
  182. .LP
  183. .DS
  184. header block section
  185. .sp .2v
  186. #include <\fIplatform\fR.pcf>
  187. #include <\fIplatform\fR.cf>
  188. .sp .2v
  189. #include <site.pdef>
  190. #include <site.def>
  191. .sp .2v
  192. system description, build and installation definitions
  193. .sp .2v
  194. #include <Project.ptmpl>
  195. #include <Project.tmpl>
  196. .sp .2v
  197. #include <Imake.prules>
  198. #include <Imake.rules>
  199. .sp .2v
  200. #include "./Imakefile"
  201. .DE
  202. .LP
  203. The header block section now additionally determines the name of the
  204. project-specific platform file
  205. .I platform .pcf. 
  206. .LP
  207. The modification is based on the notion of override files.
  208. Before any of the platform, site, project or rules
  209. files are included, another related file is
  210. included which may contain project-specific information.
  211. Standard versions of these project-specific files
  212. .I *.pcf , (
  213. .I site.pdef ,
  214. .I Project.ptmpl
  215. and
  216. .I Imake.prules )
  217. are present in
  218. StdConfigDir (to prevent file-inclusion errors) but they are all empty.
  219. If a given project has special configuration requirements, it may
  220. supply its own private versions of any of these files in its
  221. .I config
  222. directory.
  223. Since
  224. .I imake
  225. will search that directory before StdConfigDir, the standard (empty)
  226. versions will be overridden.
  227. The project does not have to actually replace them.
  228. .LP
  229. .B "Example 1:"
  230. At the one extreme, when a project has
  231. no special project-specific configuration requirements (no
  232. .I config
  233. directory, or an empty one),
  234. only the files in StdConfigDir are used to create makefiles.
  235. Since the default project-specific files are empty, the new
  236. architecture of
  237. .I Imake.tmpl
  238. is functionally equivalent to the old.
  239. At the other extreme, a project can replace
  240. .I all
  241. the configuration files; nothing from StdConfigDir is used then.
  242. .LP
  243. .B "Example 2:"
  244. The standard
  245. .I site.def
  246. file might be used by the system administrator to set the value of
  247. BinDir to the directory in which programs are installed.
  248. A project might want them installed somewhere else; this could be done
  249. by defining BinDir in the project-specific site file
  250. .I site.pdef
  251. to override the value in
  252. .I site.def .
  253. .LP
  254. .B "Example 3:"
  255. Override files may also be used to extend the standard configuration
  256. by defining symbols not appearing at all in the standard files.
  257. For instance, if some programs were to be installed in the standard
  258. BinDir, but others were to be installed in a private directory, a
  259. symbol such as ProjBinDir could be defined for the latter purpose in
  260. .I Project.ptmpl .
  261. .LP
  262. One bothersome thing about this architecture is the naming of
  263. .I Project.tmpl
  264. and
  265. .I Project.ptmpl .
  266. If
  267. .I Project.tmpl
  268. contains ``project-specific'' information, then what does
  269. .I Project.ptmpl
  270. contain?
  271. ``Project-project-specific'' information?
  272. Ugh.
  273. I prefer to consider
  274. .I Project.tmpl
  275. to contain ``standard'' (i.e., best-guess) project configuration
  276. parameters, and
  277. .I Project.ptmpl
  278. to contain the parameters which actually are specific to a given project.
  279. .LP
  280. The disadvantages of this architecture are obvious:
  281. .IP \(bu
  282. .I Imake.tmpl
  283. is somewhat more complex.
  284. .IP \(bu
  285. StdConfigDir must be populated with the additional
  286. .I *.pcf ,
  287. .I site.pdef ,
  288. .I Project.ptmpl
  289. and
  290. .I Imake.prules
  291. files (although this is easy since they are all empty).
  292. .LP
  293. The advantages are:
  294. .IP \(bu
  295. Configuration information is centralized, but flexibility is maintained.
  296. Projects may
  297. override definitions in the the standard configuration files
  298. without replacing those files directly, and multiple projects may use
  299. files in StdConfigDir cooperatively without interfering with each other.
  300. .IP \(bu
  301. Override files minimize the need for individual
  302. projects to modify the standard non-project specific files
  303. .I Imake.tmpl , (
  304. .I *.cf ,
  305. .I site.def ,
  306. .I Project.tmpl
  307. and
  308. .I Imake.rules )
  309. directly.
  310. The philosophy underlying the architecture is that the standard files
  311. describe a common ``baseline'' configuration, and
  312. individual projects need specify configuration information (using
  313. private
  314. .I *.pcf ,
  315. .I site.pdef ,
  316. .I Project.ptmpl
  317. and
  318. .I Imake.prules
  319. files) only to the extent that they
  320. .I differ
  321. from the standard.
  322. .IP \(bu
  323. When improvements are made to the standard files, the changes are
  324. immediately available to any project using them via a normal
  325. configuration step, i.e., ``make Makefile;make Makefiles''.
  326. (Of course, it also becomes possible to break a lot of projects if an
  327. erroneous change is made.)
  328. .IP \(bu
  329. Overall, fewer files need to be maintained, and less space is used.
  330. .NH 2
  331. Other Changes
  332. .LP
  333. .I xmkmf
  334. is used to bootstrap makefiles from imakefiles.
  335. To accommodate the above scheme, it was
  336. modified from the version distributed with X11R4 to search the project's
  337. .I config
  338. directory, then the standard configuration directory
  339. (i.e., ProjConfigDir then StdConfigDir, not just StdConfigDir).
  340. .LP
  341. The definition of the makefile variable IMAKE_CMD in the configuration
  342. files was also changed:
  343. .LP
  344. .DS
  345. Old (from X11R4):
  346. #ifdef UseInstalled
  347.     IRULESRC = $(CONFIGDIR)
  348.     IMAKE_CMD = $(IMAKE) -DUseInstalled \e
  349.         -I$(IRULESRC) \e
  350.         $(IMAKE_DEFINES)
  351. #else
  352.     IRULESRC = $(CONFIGSRC)
  353.     IMAKE_CMD = $(NEWTOP)$(IMAKE) \e
  354.         -I$(NEWTOP)$(IRULESRC) \e
  355.         $(IMAKE_DEFINES)
  356. #endif
  357. .DE
  358. .\" allow page break here if necessary...
  359. .DS
  360. New:
  361. #ifdef UseInstalled
  362.     IMAKE_CMD = $(IMAKE) -DUseInstalled \e
  363.         -I$(NEWTOP)$(PROJCONFIGDIR) \e
  364.         -I$(STDCONFIGDIR) \e
  365.         $(IMAKE_DEFINES)
  366. #else
  367.     IMAKE_CMD = $(NEWTOP)$(IMAKE) \e
  368.         -I$(NEWTOP)$(PROJCONFIGDIR) \e
  369.         -I$(STDCONFIGDIR) \e
  370.         $(IMAKE_DEFINES)
  371. #endif
  372. .DE
  373. .LP
  374. The old rule determines whether to use versions of
  375. .I imake
  376. (and
  377. .I makedepend )
  378. already installed in public directories or
  379. build them in the source tree based on whether UseInstalled is defined or not.
  380. That symbol also determines where to look for configuration files and
  381. defines the value of IRULESRC accordingly.
  382. If UseInstalled is undefined, searches look in CONFIGSRC, the project's
  383. .I config
  384. directory, otherwise in CONFIGDIR, the standard configuration directory.
  385. .LP
  386. This behavior is unsuitable for the purposes described here, since both of
  387. those directories should be searched, if they exist.
  388. The new rule makes UseInstalled relevant only for determining where
  389. to find (and possibly build)
  390. .I imake
  391. and
  392. .I makedepend ,
  393. not where to look for configuration files.
  394. .NH
  395. Test of Implementation
  396. .LP
  397. After making the changes described above, a flight test was arranged.
  398. Nine projects developed under six different logins were converted to use
  399. the standard files.
  400. Projects supplied override files where necessary.
  401. These projects were all initially developed using configuration files
  402. that bore a
  403. fairly strong relationship to the standard set, so it was expected
  404. that conversion would not be unbearably odious.
  405. The degree of relationship broke down as follows:
  406. .IP \(bu
  407. Two projects used configuration files that were identical (or nearly
  408. so) to the standards.
  409. Each of these projects, unlike the other seven, comprised only a
  410. single source directory.
  411. As expected, conversion was completely trivial, once the top-level
  412. .I Makefile
  413. was rebuilt with
  414. .I xmkmf .
  415. .IP \(bu
  416. Four projects required additional project-specific specification
  417. beyond the standard configuration
  418. (special include file directories, link libraries,
  419. installation directories, etc.).
  420. These usually required only
  421. .I site.pdef
  422. and
  423. .I Project.tmpl
  424. files in their local
  425. .I config
  426. directories.
  427. One project required a
  428. .I platform.pcf
  429. file.
  430. Project owner and group names (used for install operations) were moved
  431. out of
  432. .I site.def
  433. files into
  434. .I site.pdef .
  435. .IP \(bu
  436. Three projects diverged from the standard files fairly significantly,
  437. because although their configuration files were initially set up from
  438. files similar to the standards, less effort had been exerted to keep
  439. them in sync as project development progressed.
  440. Besides the changes made to the projects described in the previous
  441. paragraph, there were additional special commands for compilation, special
  442. .I Imakefile
  443. rules, etc.
  444. Nevertheless, conversion proceeded smoothly and without incident.
  445. .LP
  446. One thing I had done in the original
  447. .I Project.tmpl
  448. files was to define certain
  449. makefile variables directly (e.g., ``INCLUDESRC=$(TOP)/h''), rather
  450. than by using a previously #define'd
  451. .I cpp
  452. symbol (e.g., ``INCLUDESRC=IncludeSrc'', where IncludeSrc is #define'd
  453. within a #ifndef/#endif block).
  454. This was a short-cut, that works in a non-shared environment but
  455. needed to be fixed to work in a shared environment.
  456. A default value of IncludeSrc needs to be placed in
  457. .I Project.tmpl ,
  458. and individual projects redefine that symbol as necessary in
  459. .I Project.ptmpl .
  460. .LP
  461. It was necessary to place a number of
  462. .I cpp
  463. symbol definitions in
  464. .I Project.tmpl
  465. within #ifndef/#endif blocks, since they became liable to being
  466. overridden in
  467. .I Project.ptmpl .
  468. .LP
  469. In the top-level imakefiles for the multiple source directory
  470. projects, the ``make World'' rules had to be adjusted to account for
  471. whether UseInstalled is defined or not.
  472. If so, the build process does not need to try to build
  473. .I imake
  474. and
  475. .I makedepend
  476. in the project source tree.
  477. (That would be a mistake since the source for those programs would not
  478. necessarily be present.)
  479. .LP
  480. Overall, conversion was simple and straightforward.
  481. I judged the conversion odiousness coefficient acceptably low.
  482. .NH
  483. Another Problem\*-Project Groups
  484. .LP
  485. The mechanism described above allows a group of similarly-configured
  486. projects to share configuration files and selectively extend or
  487. override them as necessary.
  488. This provides a solution to the original problem (how to avoid
  489. maintaining multiple full sets of files while maintaining flexibility),
  490. but leads to another.
  491. Suppose that instead of a group of projects, there exist several
  492. groups of projects, such that projects within a group are similar, but
  493. differences between groups are quite large.
  494. This can happen, for instance, if projects designed and developed at one
  495. site under certain conventions are installed at another
  496. site where different conventions are used.
  497. .LP
  498. The difficulty here is that there are two sets of ``standard'' configuration
  499. files, and they cannot both be installed in the same well-known
  500. location.
  501. This problem can be overcome quite simply.
  502. Instead of using StdConfigDir as the single well-known location in which
  503. the standards are installed, define StdConfigPath to be that
  504. directory, and use it as the root of a set of
  505. subdirectories, each of which corresponds to a project group.
  506. Each group's standard configuration files are installed in the appropriate
  507. directory, and StdConfigDir for a given project group
  508. will be defined as that directory (e.g., StdConfigPath/\fIabc\fR for
  509. project \fIabc\fR).
  510. .LP
  511. To allow
  512. .I xmkmf
  513. to be used for bootstrapping,
  514. it was modified slightly again to select
  515. one of the subdirectories as the hardwired-in default, but allow
  516. another to be selected through a
  517. .B \-C
  518. option.
  519. For convenience, the argument following
  520. .B \-C
  521. may be absolute or relative.
  522. If absolute, it is used unchanged.
  523. If relative, StdConfigDir is prepended.
  524. .LP
  525. This modification makes
  526. .I xmkmf
  527. incompatible with the version distributed with X11R4, which is a
  528. problem for sites using that version.
  529. Assuming X configuration files are installed in
  530. .I /usr/lib/X11/config
  531. and the value of StdConfigPath is
  532. .I /usr/lib/config ,
  533. this incompatibility can be obviated as follows:
  534. .LP
  535. .DS
  536. mkdir /usr/lib/config
  537. cd /usr/lib/config
  538. ln -s /usr/lib/X11/config X11
  539. ln -s X11 default
  540. .DE
  541. .LP
  542. For sites without symbolic links, the files in
  543. .I /usr/lib/X11/config
  544. can be copied into
  545. .I /usr/lib/config/X11 ,
  546. and
  547. .I xmkmf
  548. can be hacked to use
  549. .I /usr/lib/config/X11
  550. instead of
  551. .I /usr/lib/config/default
  552. as the default.
  553. Ugly, but workable.
  554. (Also known as ``crude, but effective''.)
  555. .LP
  556. With these conventions,
  557. projects within groups can share redundant information, as before, and
  558. project groups can coexist peacefully.
  559. .LP
  560. The nine projects previously converted were tested against these
  561. additional modifications.
  562. They required only ``xmkmf;make Makefile;make Makefiles'' to properly
  563. reset the configuration information in the makefiles.
  564. .NH
  565. Distribution of Projects
  566. .LP
  567. The mechanism described in this document appears to solve
  568. the problem of reusing
  569. configuration files while allowing for extension and override within
  570. individual projects.
  571. However, when a project is packaged for distribution, it's very little
  572. use to include only those configuration files which are unique to the
  573. project, if the receiving site doesn't have the standard files.
  574. Several alternatives come to mind.
  575. .IP \(bu
  576. Provide the standards as a separate distribution, along with the
  577. sources to
  578. .I imake
  579. and
  580. .I makedepend .
  581. This is perhaps inconvenient for the receiver, as it is another
  582. distribution that needs to be retrieved.
  583. .IP \(bu
  584. Copy all the standard files into the project's
  585. .I config
  586. directory and distribute along with the project.
  587. One has to be careful when doing the copying not to destroy the
  588. project's override files,
  589. the resulting distribution size is larger, and
  590. distributing the standards is unnecessary if receiving site
  591. has them already.
  592. Also, it is not clear which files are actually unique to the project
  593. when this is done.
  594. .IP \(bu
  595. Keep the project's unique configuration files in
  596. .I config
  597. (where they are normally anyway), and copies of the standard files in
  598. .I config-std .
  599. If the receiver has the latter already, they can be jettisoned easily,
  600. otherwise installed in the project's StdConfigDir.
  601. .LP
  602. It is unclear whether any of these has any compelling advantage over
  603. the others.
  604. .NH
  605. Beginning New Projects
  606. .LP
  607. If a new project has special configuration requirements, a file
  608. .I README.{project-name}
  609. should be created in
  610. .I config
  611. explaining what they are.
  612. .NH 2
  613. Define UseInstalled, or Not?
  614. .LP
  615. If a project wants to use the installed versions of
  616. .I imake
  617. and
  618. .I makedepend ,
  619. the initial makefile should be created from the the imakefile by executing
  620. .I xmkmf
  621. with no arguments (or just
  622. .B \-C
  623. .I configdir )
  624. in the project top-level directory.
  625. This will cause -DUseInstalled to be passed to
  626. .I imake
  627. which will in turn cause the version of IMAKE_CMD that
  628. includes -DUseInstalled to be selected from the configuration files.
  629. Thus -DUseInstalled will propagate nicely through all future ``make Makefile''
  630. operations.
  631. .LP
  632. If
  633. .I imake
  634. and
  635. .I makedepend
  636. are to be built in the project source tree, UseInstalled should not be defined,
  637. and you must have the source under the project.
  638. .I imake
  639. source is in
  640. .I config
  641. and
  642. .I makedepend
  643. source is in
  644. .I util/makedepend
  645. or
  646. .I util/scripts ,
  647. depending on the definition of UseCCMakeDepend.
  648. Execute ``xmkmf \fB.\fR'' (note the \fB.\fR!) in the project top-level
  649. directory.
  650. This will run
  651. .I imake
  652. without -DUseInstalled, and the proper IMAKE_CMD in the config
  653. files will be selected.
  654. .LP
  655. One problematic aspect of
  656. .I xmkmf
  657. is that it really should always pass -DUseInstalled, since it assumes there
  658. is an installed version of
  659. .I imake
  660. anyway (it doesn't specify a path to it).
  661. But then the problem becomes how to turn UseInstalled off later?
  662. You can't run ``make Makefile'' because the version of IMAKE_CMD that
  663. uses -DUseInstalled has already been selected.
  664. .NH
  665. Distribution and Availability
  666. .LP
  667. The standard WRPRC configuration files are (or will be soon)
  668. available for anonymous 
  669. .I ftp
  670. access in the
  671. .I ~ftp/pub/imake-stuff
  672. directory, in file
  673. .I config-WRPRC.shar.Z
  674. on host
  675. .I indri.primate.wisc.edu
  676. (Internet address 128.104.230.11).
  677. These files illustrate the concepts discussed in this document.
  678. .LP
  679. This distribution also includes parts of the X11R4
  680. .I mit/util
  681. source tree (where
  682. .I makedepend
  683. and
  684. .I xmkmf
  685. are found) as well as
  686. .I msub ,
  687. a locally-developed utility for yanking the values of
  688. variables directly from makefiles to produce target files from templates.
  689. .LP
  690. The X11R4 configuration files are in the same directory, in
  691. .I config-X11R4.shar.Z .
  692.