]> rtime.felk.cvut.cz Git - omk/sssa.git/blob - doc/omk-manual.texinfo
Tiny fix in html documentation makefile.
[omk/sssa.git] / doc / omk-manual.texinfo
1 \input texinfo   @c -*-texinfo-*-
2 @c %**start of header
3 @setfilename omk-manual
4 @settitle OMK: Ocera Make System
5 @c %**end of header
6
7 @copying
8 Manual for Ocera Make System (OMK)
9
10 Copyright @copyright{} 2007 Michal Sojka, Pavel Pisa
11 @end copying
12
13 @titlepage
14 @title Ocera Make System Manual
15 @page
16 @vskip 0pt plus 1filll
17 @insertcopying
18 @end titlepage
19
20 @contents
21
22 @ifnottex
23 @node Top, Overview of OMK, (dir), (dir)
24 @top Ocera Make System
25
26 @insertcopying
27 @end ifnottex
28
29
30 @menu
31 * Overview of OMK::             
32 * OMK User's Manual::           
33 * Original README::             
34 * OMK Development::             
35 * Variable Index::              
36 @end menu
37
38 @node Overview of OMK, OMK User's Manual, Top, Top
39 @chapter OMK Overview
40 @cindex overview
41
42 OMK is an advanced make system written entirely in GNU make. Compiling
43 software using OMK requires only GNU make binary and standard UNIX
44 utilities (@command{sh}, @command{sed}, @command{cmp} and
45 @command{tr}@footnote{@command{tr} is needed only for OMK to be
46 compatible with MinGW.}) installed. OMK aims to be developer friendly;
47 to use OMK, you do not need to understand (sometimes) cryptic syntax of
48 Makefiles.
49
50 You can use OMK on all platforms where you can run GNU Make including
51 Cygwin and MinGW. MS DOS was not tested.
52
53 @c @section Features
54
55 @c @itemize
56 @c @item
57 @c Easy to use for beginners.
58 @c @item
59 @c Automatic handling of dependencies.
60 @c @item
61 @c Supported host platforms: all Un*x operating system including Linux,
62 @c Cygwin, MS DOS and maybe others.
63 @c @end itemize
64
65 @menu
66 * Why to Use OMK?::             
67 * Quick Start::                 
68 * History::                     
69 @end menu
70
71 @node Why to Use OMK?, Quick Start, Overview of OMK, Overview of OMK
72 @section Why to Use OMK?
73
74 Here we list some of OMK features, which we think are important for
75 choosing of a make system.
76
77
78 @itemize
79 @item
80   Makefile in source directories are usually very @b{simple}.
81 @item
82   There is only @b{one} @file{Makefile.rules} for most of components of
83   a bigger project.
84 @item
85   OMK greatly simplifies compilation of projects, where source files are
86   spread between @b{multiple directories}.
87 @item
88   OMK handles properly @b{dependencies} of source files and libraries,
89   so it is not necessary to recompile the whole project if only several
90   files changed.
91 @item
92   OMK allows to freely @b{move} cross-dependant components @b{in
93   directory structure} without the need to update users of moved
94   component. I hate something like
95   @option{-I../../sched/rtlshwq/include} in makefiles for example. If a
96   component is renamed or version is added to the name, many Makefiles
97   in the project would require an update.
98 @item
99   The above feature is very helpful in @b{combining components}
100   (libraries) from different projects/developers to a single project by
101   simply creating symbolic links to external components.
102 @item
103   Compilation of an OMK based projects don't require to install any
104   files before successful finish of build.
105 @item
106   OMK allows to call @command{make} for a particular subdirectory in the
107   source tree.
108 @item
109   Under OMK all products of compilation are stored @b{out of source
110   directories}. This simplifies work with version control systems and
111   helps when simultaneous compilation for multiple targets/platforms is
112   needed.
113 @end itemize
114
115
116 @node Quick Start, History, Why to Use OMK?, Overview of OMK
117 @section Quick Start
118
119 If you get some sources, which are distributed with OMK, usually the
120 following commands are sufficient to compile the whole project.
121
122 @example
123 @verbatim
124 make default-config
125 make
126 @end verbatim
127 @end example
128
129 @noindent To use OMK in your own project, follow these steps:
130
131 @enumerate
132 @item
133   Take appropriate @file{Makefile.rules}, put it together with leaf
134   @file{Makefile} to the root directory of your project.
135 @item
136   Create @file{Makefile.omk} files in all directories you want to
137   compile something. Please refer to @ref{OMK User's Manual} to learn
138   what to write in @file{Makefile.omk} files.
139 @item
140   Run @command{make omkize} in the root directory.
141 @end enumerate
142
143 @noindent Your project is now ready to compile.
144
145
146 @node History,  , Quick Start, Overview of OMK
147 @section History
148
149 OMK was originally written by Pavel Pisa as a solution to have one
150 common make system for OCERA project, where we needed to compile
151 user-space programs, Linux kernel modules and RT Linux modules in one
152 package. Although this system was not accepted for the whole OCERA
153 project. Several individual developers (mostly from Czech Technical
154 University) liked it and started to use it.
155
156 As a number of projects using OMK grew it was necessary to modularize
157 the make system to support more ``targets''. Michal Sojka took care
158 about the process of modularization.
159
160 @node OMK User's Manual, Original README, Overview of OMK, Top
161 @chapter OMK User's Manual
162
163 @menu
164 * Basic Concepts::              
165 * Invoking OMK::                
166 * Compiling Programs::          
167 * Libraries::                   
168 * Multiple Directories::        
169 * Dependency Tracking::         
170 * Configuration and Conditional Compilation::  
171 * Advanced OMK Features::       
172 * Running OMK under Windows OS::  
173 * Interfacing OMK to popular IDEs::  
174 * Troubleshooting::             
175 @end menu
176
177 @node Basic Concepts, Invoking OMK, OMK User's Manual, OMK User's Manual
178 @section Basic Concepts
179
180 The main concept of OMK is very simple. In the root directory of the
181 projects resides a file called @file{Makefile.rules}. This file contains
182 all compilation rules needed for compilation of a particular
183 project. There are different @file{Makefile.rules} for different
184 platforms (Unix, RTEMS, system-less, ...). In every subdirectory a
185 @file{Makefile.omk} is stored. This file determines what should be done
186 in the respective directory (e.g. compile a program from several source
187 files). Its syntax is very simple -- see the following sections.
188
189 Since make searches by default for a @file{Makefile} and not for
190 @file{Makefile.rules} or @file{Makefile.omk}, there must be a small
191 generic @file{Makefile} in every directory, whose task is only to find
192 @file{Makefile.rules} in the actual or any parent directory and include
193 it. This search is performed only once at the beginning of compilation.
194
195 @c TODO: Pavel's note about qmake.
196
197 The compilation process itself is comprised of several passes. Every
198 pass traverses the whole directory structure@footnote{In future, we are
199 planning some optimization that allows OMK to traverse the directories
200 only once and thus decrease compilation time.} and does a particular
201 task in every directory of the project. Typically, these passes are:
202 @table @dfn
203 @anchor{include-pass}
204 @item include-pass
205     This pass takes all include files marked for ``export'' and copies
206     (or links) them to the @file{include} directory under
207     @file{_compiled} directory. @xref{Header Files}.
208
209     Also, during this pass, automatically generated header file are
210     generated according to the current
211     configuration. @xref{Configuration and Conditional Compilation}.
212 @item library-pass
213     During this pass, all include files are in place, so all libraries
214     can be compiled.
215 @item binary-pass
216     Finally, programs can be compiled and linked against libraries
217     created in the previous pass.
218 @end table
219
220 The results of compilation are stored under the @file{_compiled}
221 directory. This directory is structured as a classical Unix file-system
222 (it contains directories like @file{bin}, @file{lib} and @file{include})
223 and can be directly copied to the target device or to some directory on
224 a host computer (e.g. @file{/usr/local}).
225
226 Besides @file{_compiled} directory, there in a @file{_build}
227 directory. Under this directory are stored some temporary files and
228 intermediate compilation products (object files, dependency files etc.).
229
230 In the next section, we provide an overview of methods, how to invoke
231 OMK from command line. Section @ref{Interfacing OMK to popular IDEs}
232 covers running of OMK from popular IDEs.
233
234 Sections @ref{Compiling Programs} through @ref{Configuration and
235 Conditional Compilation} deals with the content of
236 @file{Makefile.omk}. Its syntax in usual cases compatible to GNU
237 Automake's @file{Makefile.am} syntax. Also, the scheme for naming
238 variables was inspired by Automake so most OMK variables have the name
239 like @samp{@var{target}_@var{TYPE}}.
240
241 @node Invoking OMK, Compiling Programs, Basic Concepts, OMK User's Manual
242 @section Invoking OMK
243
244 Before using OMK for the first time, you have to call:
245 @example
246 @command{make default-config}
247 @end example
248 @noindent See @ref{Configuration and Conditional Compilation} for
249 details. If you forget to do this, OMK will notice you.
250
251 To compile the whole project or only some subtree of the project, call
252 @example
253 @command{make}
254 @end example
255 @noindent in the appropriate directory.
256
257 To clean files in @file{_build} directory but not in @file{_compiled}
258 one, use:
259 @example
260 @command{make clean}
261 @end example
262
263 To clean the compilation completely, you can either remove
264 @file{_compiled} and @file{_build} directories manually, or call
265 @example
266 @command{make distclean}
267 @end example
268 @noindent which does the same. This command removes these directories
269 even if you call it from a subdirectory.
270
271 To debug compilation problems, you can use @code{V} variable (see
272 @ref{V}):
273 @example
274 @command{make V=1}
275 @end example
276
277 You can also set values of some other variables on command line for
278 temporary change something. The example below compiles the code
279 temporarily with debugging information:
280 @example
281 @command{make CFLAGS="-g -O0 -Wall"}
282 @end example
283
284
285 @anchor{V}
286 @defvar V
287 If this variable equals to @samp{1}, the whole command lines for all
288 executed commands are displayed. Otherwise, only short messages are
289 printed.
290 @end defvar
291
292 @node Compiling Programs, Libraries, Invoking OMK, OMK User's Manual
293 @section Compiling Programs
294
295 To tell OMK to compile a program, you need to set some variables in
296 @file{Makefile.omk} (usually) in the directory where program sources are
297 located.
298
299 In the example bellow a program @command{test} will be compiled from
300 source @file{test.c}.
301
302 @example
303 @verbatiminclude ../tests/programs/Makefile.omk
304 @end example
305
306 @noindent The variables are:
307
308 @defvar bin_PROGRAMS
309   Contains a list of names (whitespace separated) of programs to be
310   compiled in this directory.
311 @end defvar
312
313 @defvar xxx_SOURCES
314   For every program name @var{xxx} in @code{bin_PROGRAMS}, this variable
315   contains a list of sources that are needed to compile the
316   executable. OMK uses an extension of the filename to determine the
317   compiler to compile this source.
318 @end defvar
319
320 @defvar xxx_LIBS
321   This variable contains a list of libraries the program @var{xxx} will
322   be linked with.
323
324   @example
325   test_LIBS = m curses
326   @end example
327 @end defvar
328
329 @defvar LOADLIBES
330   This variable contains a list of libraries all programs in this
331   directory needs to be linked to.
332 @end defvar
333
334 @defvar INCLUDES
335   Directives passed to the C or C++ compiler with additional directories
336   to be searched for header files. In most cases you need to specify an
337   absolute path. To specify a directory relative to the source
338   directory, you can use the @code{$(SOURCES_DIR)} variable, which
339   refers to the directory, where @file{Makefile.omk} is located. This
340   variable applies to all compilations invoked in the current directory.
341
342   @example
343   INCLUDES = -I$(SOURCES_DIR)/my_include_dir
344   @end example
345 @end defvar
346
347 @defvar DEFS
348   Directives passed to the C or C++ compiler with preprocessor macro
349   definitions. This variable applies to all compilations invoked in the
350   current directory.
351
352   @example
353   DEFS = -DDEBUG=1
354   @end example
355 @end defvar
356
357
358 @c FIXME: INCLUDES variable should not be set by rtlinux rules.
359
360 @node Libraries, Multiple Directories, Compiling Programs, OMK User's Manual
361 @section Libraries
362
363
364 With OMK, you can easily create statically or dynamically linked
365 libraries. The way of creating libraries is very similar to how programs
366 are created. @xref{Compiling Programs}.
367
368 In @file{Makefile.omk}, you specify several variables, which defines how
369 the libraries should be compiled. In the example below the library
370 @samp{mylib} is created from two sources @file{funca.c} and
371 @file{funcb.c}. Interface of this library is defined in
372 @file{myfunc.h}. Therfore, we export this header for use by other
373 programs.
374
375 @example
376 @verbatiminclude ../tests/libraries/Makefile.omk
377 @end example
378
379 @noindent Variables for use with libraries are:
380
381 @defvar lib_LIBRARIES
382   Specifies a list of statically linked libraries to be compiled. 
383 @end defvar
384
385 @defvar shared_LIBRARIES
386   Specifies a list of dynamically linked libraries to be compiled. 
387 @end defvar
388
389 @defvar xxx_SOURCES
390   For every library name @var{xxx} in @code{lib_LIBRARIES} or
391   @code{shared_LIBRARIES}, this variable contains a list of sources that
392   are needed to compile the library. OMK uses an extension of the
393   filename to determine the compiler to compile this source.
394 @end defvar
395
396 @menu
397 * Header Files::                
398 @end menu
399
400 @node Header Files,  , Libraries, Libraries
401 @subsection Header Files
402
403 C and C++ libraries are not very useful without header files. OMK
404 provides several variables that specify activities on header files.
405
406 During compilation, header files are copied (or linked) from source
407 directories to the @file{_compiled} tree
408 (see @ref{include-pass}). Libraries and programs are then compiled against
409 these copies.
410
411 @anchor{include_HEADERS}
412 @defvar include_HEADERS
413   Specifies the list of header files to be exported for use by other
414   libraries/programs. The files are exported directly to the
415   @file{include} directory even if the file is located in a subdirectory
416   (like @file{sci_regs.h} in the example below)
417
418   @example
419   include_HEADERS = regs.h periph/sci_regs.h
420   @end example
421 @end defvar
422
423 @defvar nobase_include_HEADERS
424   Similar to @ref{include_HEADERS}, but the directory prefix is always
425   kept. To include the file exported by this variable, use
426   @code{#include <@var{prefix}/@var{header.h}>}.
427 @end defvar
428
429 @defvar renamed_include_HEADERS
430   Exports the header files under different name. The form of the items
431   in this whitespace separated list is: @var{real name}@code{->}@var{new
432   name}.
433
434 @example 
435   renamed_include_HEADERS = orte_config_omk_win32.h->orte_config.h
436 @end example
437 @end defvar
438
439 @defvar LN_INCLUDES
440   If this variable equals to @samp{y}, symbolic links to headers in
441   source directories are used in @file{_compiled} tree instead of
442   copies.
443
444   Normally, the header files are copied into @file{_compiled} directory
445   to be prepared for transfer into target location afterwards. Copying
446   ensures that resulting libraries are in correspondence with the header
447   files even if the header is changed by a developer but the library is
448   not recompiled.
449
450 @c   Another reason for having single include directory for the whole
451 @c   project is tat every component knows where to find header files of
452 @c   other components. 
453
454   On the other side, the copying could make problems during
455   development. Most @acronym{IDE}s, allows you to jump directly to the
456   place, where an error is reported by the compiler. If the error is in
457   a header file, IDE opens you the copy of the header file. If you
458   correct the error there, after the next compilation, your header file
459   will be overwritten by the old version from your source tree.
460   
461   This option is not typically used in @file{Makefile.omk}, but in the
462   top level configuration file @file{config.omk} or on command line.
463 @end defvar
464
465 @node Multiple Directories, Dependency Tracking, Libraries, OMK User's Manual
466 @section Multiple Directories
467
468 OMK is probably most useful in projects consisting of multiple
469 directories. For such projects, it is not easy to write from scratch
470 classic Makefiles that provides all the needed features.
471
472 You can instruct OMK to descend to a (sub)directory by setting the
473 @code{SUBDIRS} variable in @file{Makefile.omk}.
474
475 @defvar SUBDIRS
476   This variable contains a list of directories, in which compilation
477   must be also invoked. Usually, names of subdirectories are used, but
478   you can use any path specification here.
479
480   Compilation is invoked in these directories before it is invoked in
481   the current directory.
482 @end defvar
483 @c TODO: Write tests for this.
484
485 @defvar ALL_OMK_SUBDIRS
486   This variable is set by OMK and can be used as the value of
487   @code{SUBDIRS} variable. It contains a list of all direct
488   subdirectories, which contain @file{Makefile.omk}. This is especially
489   useful if you are combining several projects or components
490   together. In the root directory of your project, you just create
491   symbolic links the components from other projects and all the linked
492   directories automatically appears as the value of this variable.
493
494   @example
495   SUBDIRS = $(ALL_OMK_SUBDIRS)
496   @end example
497 @end defvar
498
499 @node Dependency Tracking, Configuration and Conditional Compilation, Multiple Directories, OMK User's Manual
500 @section Dependency Tracking
501
502 OMK automatically handles tracking of dependencies of files in compiled
503 projects. It uses gcc's @option{-M@var{x}} options to do this for object
504 files. This way, whenever you change some header file, OMK recompiles
505 only those files, where the changed header was really included.
506
507 Dependencies are also maintained for libraries and binaries. To find the
508 dependencies, OMK parses linker map files, so a change to some library
509 causes recompilation of all programs using that library.
510
511 @node Configuration and Conditional Compilation, Advanced OMK Features, Dependency Tracking, OMK User's Manual
512 @section Configuration and Conditional Compilation
513
514 In many projects, it is necessary to configure a compilation process. By
515 this configuring we mean, setting some parameters that influence the
516 output of compilation process. In GNU projects, @command{configure}
517 script is usually responsible for configuration. User provides some
518 parameters to @command{configure}, which is run before compilation, and
519 this script does all steps needed to configure the sources and
520 make-system in the desired way.
521
522 OMK has its own configuration mechanism, which is described in this
523 section. For future releases, we plan that this mechanism can make use
524 of GNU Autoconf, but currently there is no directly integrated support
525 for it.
526
527 In every directory you can specify some configuration parameters, which
528 can be modified by a user. Then, when @command{make default-config} is
529 run, all these parameters are found and together with their default
530 values are stored as makefile variables in
531 @file{config.omk-default}. This file is included during compilation, so
532 if you don't specify other values, these defaults are used. If you are
533 not satisfied with these defaults, you can override the values of
534 parameters in @file{config.omk}. This file is also included during
535 compilation and variables mentioned there takes precedence over those
536 specified in @file{config.omk-default}. Both @file{config.omk} and
537 @file{config.omk-default} have to be stored in the same directory as
538 @file{Makefile.rules}.
539
540 Besides overriding the default values of configuration parameters,
541 @file{config.omk} can also be used as a common place to store some
542 global settings that applies to the whole project, e.g. the compiler to
543 use or common compiler flags.
544
545 @subsection Specifying Configuration Parameters
546
547 To specify names and default values of configuration parameters use the
548 @code{default_CONFIG} variable in @file{Makefile.omk}.
549
550 @defvar default_CONFIG
551   This variable contains a list of configuration parameters and their
552   default values. The format of every item in this list is
553   @var{CONFIG_xxxx}=@var{value}. You can name the parameter as you want,
554   but it is good practice to start the name with @samp{CONFIG_} prefix.
555    
556   OMK can automatically generate header files, with C preprocessor macro
557   definitions according to the OMK's configuration parameters. The
558   actual content of generated header files depends on the form of the
559   @var{value}. The possible forms are:
560   
561 @table @code 
562 @item @samp{y}, @samp{n} or @samp{x}
563   This defines boolean parameters. If the value of the parameter is
564   @samp{y}, the @samp{#define CONFIG_@var{xxx} 1} is generated, if it is
565   @samp{n}, no @code{#define} is generated. 
566
567   @samp{x} is a special value called @emph{recessive 'n'}. The meaning
568   is that this parameter influences the component in the current
569   directory (i.e. the corresponding @code{#define} will be included in
570   @code{LOCAL_CONFIG_H}; see @ref{LOCAL_CONFIG_H}) but the default value
571   is not specified here. If the default value is not specified anywhere,
572   the behavior is the same as if @samp{n} is specified.
573 @item @samp{number}
574   Numeric parameters. The define looks like @samp{#define CONFIG_@var{xxx} @var{number}}
575 @item @samp{text}
576   Text without quotes. The define looks like @samp{#define CONFIG_@var{xxx} @var{text}}
577 @item @samp{"text"}
578   Text with quotes. The define looks like @samp{#define CONFIG_@var{xxx} "@var{text}"}
579 @end table
580 @end defvar
581
582 @noindent Example of using @code{default_CONFIG}. @file{Makefile.omk} reads like:
583 @example
584 @verbatiminclude ../tests/config/default/Makefile.omk
585 @end example
586 @noindent and @file{subdir/Makefile.omk} like:
587 @example
588 @verbatiminclude ../tests/config/default/subdir/Makefile.omk
589 @end example
590
591 @noindent After running @command{make default-config}, the content of
592 @file{config.omk-default} will be:
593 @example
594 @verbatiminclude ../tests/config/default/config.omk-correct
595 @end example
596
597 @subsection Using Configuration Parameters
598
599 Configuration parameters can be used in two ways:
600 @enumerate
601 @item
602   as variables in @file{Makefile.omk} and
603 @item
604   as C/C++ preprocessor macros in OMK generated header files.
605 @end enumerate
606
607 @noindent For the first use, your @file{Makefile.omk} may contain something like:
608 @example
609 SUBDIRS = arch/$(CONFIG_ARCH)
610
611 ifeq ($(CONFIG_DEBUG),y)
612 DEFS += -DUSE_SIMULATOR
613 endif
614 @end example
615
616 @noindent For the second use, there are several variables that control
617 the generation of header files with configuration values. These
618 variables are described here:
619
620 @anchor{LOCAL_CONFIG_H}
621 @defvar LOCAL_CONFIG_H
622   The value of this variable is the name of a header file, which will
623   contain all configuration parameters declared in the current directory
624   by @code{default_CONFIG}. This header file is accessible only by files
625   in the current directory and it should be included like @code{#include
626   "@var{myconfig.h}"}.
627
628   In @file{Makefile.omk}, the use of this variable can look like this:
629
630 @example
631 LOCAL_CONFIG_H = myconfig.h
632 @end example
633 @end defvar
634
635 @defvar config_include_HEADERS
636   This variable is similar to @code{LOCAL_CONFIG_H}. One difference is
637   that the generated header file is accessible to all sub-projects in
638   all directories, not only to the files in the same directory (the
639   header is stored in @file{_compiled} tree). The second difference is
640   that you have to specify, which configuration parameters you want to
641   appear in the header file.
642 @end defvar
643
644 @defvar xxx_DEFINES
645   This variable determines the configuration parameters that should be
646   stored in a header file specified by
647   @code{config_include_HEADERS}. The @var{xxx} in the name of this
648   variable needs to be the same as the base name (without extension) of
649   the header file.
650 @end defvar
651
652 @noindent Example of using @code{config_include_HEADERS}:
653 @example
654 default_CONFIG = CONFIG_LINCAN=y CONFIG_LINCANRTL=n CONFIG_LINCANVME=n
655 config_include_HEADERS = global.h
656 global_DEFINES = CONFIG_OC_LINCAN CONFIG_OC_LINCANRTL 
657 @end example
658
659 @noindent Here, we include only two out of the three configuration 
660 parameters defined in the current @file{Makefile.omk}. It is also
661 possible to include configuration parameters defined in a different
662 directory.
663
664 @subsection Common Variables
665
666 It is common practice to use @file{config.omk} to store project-wide
667 settings. Here is the list of variables, which are commonly set here
668 (but they can also be set elsewhere, e.g. in @file{Makefile.omk}).
669
670 You can easily ``reconfigure'' your project by changing the
671 @file{config.omk} file. It is useful to have several configurations
672 stored in different files and let @file{config.omk} be a symbolic link
673 to the desired configuration.
674
675 @vtable @code
676 @item CC
677   The name of C compiler.
678 @item CFLAGS
679   Command line options for C compiler.
680 @item CXX
681   The name of C++ compiler.
682 @item CPPFLAGS
683   Additional parameters (besides @code{CFLAGS}) to by passed to C++
684   compiler.
685 @end vtable
686
687 @node Advanced OMK Features, Running OMK under Windows OS, Configuration and Conditional Compilation, OMK User's Manual
688 @section Advanced OMK Features
689
690 In this section we list several OMK features, which are more complicated
691 or rarely used so they were omitted in previous sections.
692
693 @itemize
694 @item
695   The @file{_compiled} directory can be shared between multiple projects
696   (by using symbolic links).
697
698 @item
699   If you work on a bigger project, you usually don't need to rebuild the
700   whole project and call @command{make} only in a
701   subdirectory. Sometimes, it might be useful to rebuild the whole
702   project. You can either change working directory to the root of your
703   project and call @command{make} there or, as a shortcut, you can use
704   @code{W} variable (see @ref{W}) to compile everything directly from a
705   subdirectory.
706 @example
707 @code{make W=1}
708 @end example
709
710 @item
711   Searching for @file{Makefile.rules} works such way, that if you get
712   into sources directory over symbolic links, OMK is able to unwind your
713   steps back. This implies you can make links to component directories
714   on read-only media, copy @file{Makefile.rules}, @file{Makefile} and
715   top-level @file{Makefile.omk}, adjust @file{Makefile.omk} to contain
716   only required components and then call @command{make} in the top
717   directory or even in read-only directories after changing working
718   directory from your tree to readonly media.
719 @end itemize
720
721
722 @anchor{W}
723 @defvar W
724 If this variable equals to @samp{1}, the @b{whole} project is
725 (re)compiled, even if @command{make} is called from a subdirectory.
726 @end defvar
727
728
729
730  
731 @node Running OMK under Windows OS, Interfacing OMK to popular IDEs, Advanced OMK Features, OMK User's Manual
732 @section Running OMK under Windows OS
733
734 @node Interfacing OMK to popular IDEs, Troubleshooting, Running OMK under Windows OS, OMK User's Manual
735 @section Interfacing OMK to popular IDEs
736
737 @subsection KDevelop
738
739 KDevelop has support for custom build systems. To use KDevelop to
740 develop projects using OMK follow these steps. These steps are valid for
741 version 3.5.0 of KDevelop, but for previous versions it doesn't differ
742 much.
743
744 @enumerate
745 @item
746   Import project to KDevelop (from menu choose @emph{Project---Import
747   existing project}). Select the type of project to @emph{Generic C
748   Application (Custom Buildsystem)}.
749 @example
750   @image{kdevelop1}
751 @end example
752
753 @item
754   Then answer to following dialogs as you want.
755 @example
756   @image{kdevelop2}
757 @end example
758 @example
759   @image{kdevelop3} @image{kdevelop4}
760 @end example
761
762 @item
763   If you are working only on some small part of the bigger project, you
764   usually don't want to recompile the whole project every time. In
765   @emph{Project---Project Options}, you can specify the subdirectory where to
766   run @command{make}.
767 @example
768   @image{kdevelop5}
769 @end example
770
771 @item
772   If you want to switch between several configurations easily (see also
773   @ref{Configuration and Conditional Compilation}), in the same dialog
774   you can add @option{-e} to make options. This makes environment variables
775   have higher precedence than those in @file{config.omk-default}. Then,
776   you can define several environments with different
777   @code{CONFIG_@var{xxx}} variables and their values.
778 @example
779   @image{kdevelop6}
780 @end example
781
782 @item
783   You can easily switch the configurations from @emph{Build---Make
784   Environment}.
785 @example
786   @image{kdevelop7}
787 @end example
788 @end enumerate
789
790
791 @subsection Eclipse
792
793 @subsection Emacs, VIM, etc.
794
795 Since OMK compilation is started by executing @command{make} command,
796 many common editors can work easily with OMK.
797
798 Under Emacs, you can use @command{compile} or @command{recompile}
799 commands as you are used to do.
800
801 @node Troubleshooting,  , Interfacing OMK to popular IDEs, OMK User's Manual
802 @section Troubleshooting
803
804 Renaming of some file => dependency problems.
805
806 Manual compilation ... V=1
807
808 @node Original README, OMK Development, OMK User's Manual, Top
809 @chapter Original README
810
811 Since this manual still doesn't cover all aspects of OMK, we include
812 here a @file{README.rules} file, which was written for the first version
813 of OMK.
814
815 @b{Important notice:} This make system uses features found in recent
816 versions of GNU Make program. If you encounter problems with package
817 building, check, that you use correct version of Make program.  The
818 Make older than version 3.80, could not be used.  Even Make version
819 3.80 has annoying bug which causes building fail with misleading
820 message "virtual memory exhausted".  Please, upgrade at least to
821 version 3.81 of GNU Make.
822
823 There is list of features which we want to solve with our make system:
824 @itemize
825 @item
826 Central @file{Makefile.rules} for most of components of a bigger project.
827
828 FIXME (our CAN framework includes more libraries common with our other
829 projects, we need to separate some utility libraries etc.)
830 @item
831 The rules in more spread Makefiles are way to the hell (update for
832 different kernel, RT-Linux etc would be nightmare in other case).
833 @item
834 Make system should allow to freely move cross-dependant components in
835 directory structure without need to update users of moved component (I
836 hate somethink like @option{-I../../sched/rtlshwq/include} in CAN makefiles for
837 example. If a component is renamed or version is added to then name,
838 all Makefiles in CAN will require update).
839 @item
840 Make system should be able to compile mutually cross-dependant
841 libraries and should ensure, that change in one component sources or
842 headers would result in relink or rebuild in components linked against
843 that library or including modified header file.
844 @item
845 Make system has to enable compilation out of OCERA full source tree
846 (we would lost many users of particular components in other case).
847 @item
848 Compile should be able to do all above work without need to install
849 any files before successful finish of build.
850 @item
851 Because we use some libraries for RT-Linux build and user-space build,
852 we need to solve how to compile from same sources to both targets.
853 @item
854 The build system should allow to call make for particular source
855 subdirectory. Time of recursive make through all subdirectories is
856 unacceptable.
857 @item
858 Make system should enable to build out of sources tree (else clean or
859 working with CVS sandbox gets fussy and simultaneous multiple targets
860 gets problematic).
861 @item
862 It would be good, if there is a possibility to call make from
863 read-only media sources.
864 @item
865 Make system should store results of build in some separate directory
866 structure to simple install and testing.
867 @item
868 Makefiles in sources directories should be simple.
869 @end itemize
870
871 There is probably only one alternative fully supporting above requirements
872 and it is GNU Autoheader...Automake...Autoconf... system.
873 But it is complicated and requires big amount of support files.
874 It would be acceptable if it could be easily used for OCERA framework.
875 But there are important show stoppers for that system:
876 @itemize
877 @item
878 It would require deep revision of all OCERA CVS contents and agreement
879 on this would be problematic
880 @item
881 This system is not well prepared for dual compilation for Linux and
882 RT-Linux sub-targets. It would mean many changes in default autoconf
883 setup to support this. Probably simplest way would be to rebuild GCC
884 tool chain for something like i586-elf-rtlinux.  This would require
885 even more space for OCERA development.
886 @end itemize
887
888 The problem calls for some solution, which would have minimal impact
889 on other components and would be elegant and would be maintainable
890 and small, because our main goal is components development and not
891 make systems development.
892
893 There is result of our trial. It is OMK make system.
894 The @file{Makefile} and @file{Makefile.omk} files should be in all source
895 directories. Common @file{Makefile.rules} file is required in the toplevel
896 sources directory. Alternatively this file could be moved
897 to link tree pointing into readonly media or can be anywhere
898 else if @code{MAKERULES_DIR} and @code{SOURCES_DIR} are specified.
899
900 @c !!! tohle tam nejak zmizelo, mozna by to chtelo skontrolovat, ze to
901 @c     sedi s aktualnim stavem
902
903
904 Syntax of Makefile.omk files is for usual cases compatible
905 to Automake's Makefile.am descriptions. There are specific targets
906 for RT-Linux and Linux kernel related stuff
907
908 Makefile.omk user defined variables
909 @vtable @code
910 @item SUBDIRS
911 list of subdirectories intended for make from actual directory
912 @item lib_LIBRARIES
913 list of the user-space libraries
914 @item shared_LIBRARIES
915 list of the user-space shared libraries
916 @item kernel_LIBRARIES
917 list of the kernel-space libraries
918 @item rtlinux_LIBRARIES
919 list of the RT-Linux kernel-space libraries
920 @item include_HEADERS  
921 list of the user-space header files
922 @item nobase_include_HEADERS 
923 headers copied even with directory part
924 @item kernel_HEADERS   
925 list of the kernel-space  header files
926 @item rtlinux_HEADERS  
927 list of the RT-Linux kernel-space  header files
928 @item bin_PROGRAMS     
929 list of the require binary programs
930 @item utils_PROGRAMS   
931 list of the development utility programs
932 @item kernel_MODULES   
933 list of the kernel side modules/applications
934 @item rtlinux_MODULES  
935 list of RT-Linux the kernel side modules/applications
936 @item xxx_SOURCES      
937 list of specific target sources
938 @item INCLUDES         
939 additional include directories and defines for user-space
940 @item kernel_INCLUDES  
941 additional include directories and defines for kernel-space
942 @item rtlinux_INCLUDES 
943 additional include directories and defines for RT-Linux
944 @item default_CONFIG   
945 list of default config assignments CONFIG_XXX=y/n ...
946 @end vtable
947
948 The Makefile is same for all sources directories and is only 14 lines
949 long.  It is there only for convenience reasons to enable call "make"
950 from local directory. It contains code which locates
951 @file{Makefile.rules} in actual or any parent directory. With standard
952 BASH environment it works such way, that if you get into sources
953 directory over symbolic links, it is able to unwind yours steps back
954 => you can make links to readonly media component directories, copy
955 @file{Makefile.rules}, Makefile and toplevel Makefile.omk, adjust
956 Makefile.omk to contain only required components and then call make in
957 top or even directories after crossing from your tree to readonly
958 media.
959
960 The system compiles all files out of source directories.  The actual
961 version of system is adapted even for OCERA tree mode if
962 @code{OCERA_DIR} variable is defined in @file{Makefile.rules}
963
964 There are next predefined directory name components, which can be
965 adapted if required
966
967 @table @code
968 @item BUILD_DIR_NAME = _build
969         prefix of directory, where temporary build files are stored
970 @item COMPILED_DIR_NAME = _compiled
971         prefix of directory, where final compilation results are stored
972 @item GROUP_DIR_NAME = yyy
973         this is used for separation of build sub-trees in OCERA environment
974         where more @file{Makefile.rules} is spread in the tree
975 @end table
976
977 Next directories are used:
978
979 @table @code
980 @item KERN_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern
981         directory to store intermediate files for kernel-space targets
982 @item USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user
983         directory to store intermediate files for user-space targets
984
985 @item USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
986         directory to store exported include files which should be installed later
987         on user-space include path
988 @item USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
989         same for user-pace libraries
990 @item USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
991         utilities for testing, which would not probably be installed
992 @item USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
993         binaries, which should go into directory on standard system PATH
994         (/usr/local/bin, /usr/bin or $(prefix)/bin)
995
996 @item KERN_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include-kern
997         directory to store exported include files which should be installed later
998         on kernel-space include path
999 @item KERN_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib-kern
1000         same for kernel-pace libraries
1001 @item KERN_MODULES_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/modules
1002         builded modules for Linux kernel or RT-Linux system
1003 @end table
1004
1005 There is more recursive passes through directories to enable
1006 mutual dependant libraries and binaries to compile.
1007 Next passes are defined
1008
1009 @table @samp
1010 @item default-config
1011 generates @file{config.omk-default} or xxx-default (FIXME) configuration file
1012 @item check-dir 
1013 checks and creates required build directories
1014 @item include-pass   
1015 copies header files to @code{USER_INCLUDE_DIR} and @code{KERN_INCLUDE_DIR}
1016 @item library-pass
1017 builds objects in USER_BUILD_DIR/@var{relative path} and creates libraries
1018 in USER_LIB_DIR
1019 @item binary-pass and utils-pass
1020 links respective binaries in USER_@{BIN,UTILS@}_DIR directory. If some
1021 object file is missing it compiles it in USER_BUILD_DIR/@var{relative path}
1022 @item kernel-lib-pass
1023 builds libraries for kernel space targets
1024 @item kernel-pass 
1025 builds kernel modules
1026 @end table
1027
1028 The amount of passes is relatively high and consumes some time.  But
1029 only other way to support all required features is to assemble one big
1030 toplevel Makefile, which would contain all components and targets
1031 cross-dependencies.
1032
1033 Drawbacks of designed make system
1034 @itemize
1035 @item
1036 the system is not as fast as we would like
1037 @item
1038 it lacks Autoconf and configure extensive support for many systems
1039 from UNIX to DOS and WINDOWS
1040 @item
1041 it does not contain support for checking existence of target
1042 libraries and functionalities as GNU Autoconf
1043 @item
1044 it is heavily dependant on GNU MAKE program. But it would not be big
1045 problem, because even many commercial applications distribute GNU MAKE
1046 with them to be able to work in non-friendly systems
1047 @item
1048 the key drawback is dependence on recent MAKE version 3.80 and better
1049 and even version 3.80 of MAKE has important bug, which has been
1050 corrected in newer sources (FIXME)
1051 @end itemize
1052
1053 The last point is critical. I have not noticed it first, because
1054 I use Slackware-9.2 and it contains latest released version 
1055 of MAKE (version 3.80).
1056 The problem appears when I have tried to build bigger libraries.
1057 There is bug in version 3.80, which results in misleading
1058 error "Virtual memory exhausted". It is known bug with ID 1517
1059
1060 @smallexample
1061 * long prerequisite inside eval(call()) => vm exhausted, Paul D. Smith
1062 @end smallexample
1063
1064
1065 I have optimized some rules to not push memory to the edge,
1066 but there could be still issues with 3.80 version.
1067
1068 I have downloaded latest MAKE CVS sources. The compilation required
1069 separate lookup and download for .po files and full Autoheader... cycle.
1070 I have put together package similar to release. Only ./configure --prefix=...
1071 and make is required. CVS sources contains version 3.81beta1.
1072 You can download prepared sources archive from
1073   @indicateurl{http://paulandlesley.org/make/make-3.81beta1.tar.bz2}
1074 Or you can get our local copy from
1075   @indicateurl{http://cmp.felk.cvut.cz/~pisa/can/make-3.81beta1.tar.gz}
1076
1077 The archive contains even "make" binary build by me, which should work
1078 on other Linux distributions as well.  Older version of MAKE (3.79.x
1079 released about year 2000) found on Mandrake and RedHat are not
1080 sufficient and do not support eval feature.  I do not expect, that
1081 Debian would be more up-to-date or contain fixes to MAKE vm exhausted
1082 bug.
1083
1084 The local CTU archive with our CAN components prepared for inclusion
1085 into OCERA SF CVS could be found in my "can" directory
1086
1087   @indicateurl{http://cmp.felk.cvut.cz/~pisa/can/ocera-can-031212.tar.gz}
1088
1089 The code should build for user-space with new make on most of Linux distros
1090 when make is updated.
1091
1092 If you want to test compile for RT-Linux targets, line
1093
1094 @example
1095 #RTL_DIR := /home/cvs/ocera/ocera-build/kernel/rtlinux
1096 @end example
1097
1098 in @file{Makefile.rules} has to be activated and updated
1099 to point RT-Linux directory containing "rtl.mk".
1100 There is only one library ("ulutrtl") and test utility compiled for RT-Linux
1101 (@file{can/utils/ulut/ul_rtlchk.c}).
1102
1103 The next line, if enabled, controls compilation in OCERA project tree
1104
1105 @example
1106 #OCERA_DIR := $(shell ( cd -L $(MAKERULES_DIR)/../../.. ; pwd -L ) )
1107 @end example
1108
1109 The LinCAN driver has been updated to compile out of source directories.
1110
1111 Please, check, if you could compile CAN package and help us with integration
1112 into OCERA SF CVS. Send your comments and objections. 
1113
1114 The OMK system has been adapted to support actual OCERA configuration process.
1115 I am not happy with ocera.mk mix of defines and poor two or three rules,
1116 but OMK is able to overcome that.
1117
1118 The OMK system has integrated rules (default-config) to build default
1119 configuration file. The file is named @file{config.omk-default} for
1120 the stand-alone compilation.  The name corresponds to OCERA config +
1121 "-default" if OCERA_DIR is defined.  This file contains statements
1122 from all @code{default_CONFIG} lines in all @file{Makefile.omk}.  The
1123 file should be used for building of own @file{config.omk} file, or as
1124 list for all options if Kconfig is used.
1125
1126 @c @chapter OMK Reference
1127
1128 @node OMK Development, Variable Index, Original README, Top
1129 @chapter OMK Development
1130
1131
1132
1133 @node Variable Index,  , OMK Development, Top
1134 @unnumbered Variable Index
1135
1136 @printindex vr
1137
1138 @c @node Concept Index,  , Variable Index, Top
1139 @c @unnumbered Concept Index
1140 @c @printindex cp
1141
1142 @bye