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