source: trunk/kBuild/header.kmk@ 581

Last change on this file since 581 was 578, checked in by bird, 19 years ago

Did code changes for unix installation. Will do install goals when creating the gentoo ebuild. references #6

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.1 KB
Line 
1# $Id: header.kmk 578 2006-11-23 10:36:46Z bird $
2## @file
3#
4# kBuild - File included at top of makefile.
5#
6# Copyright (c) 2004-2005 knut st. osmundsen <bird-srcspam@anduin.net>
7#
8#
9# This file is part of kBuild.
10#
11# kBuild is free software; you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation; either version 2 of the License, or
14# (at your option) any later version.
15#
16# kBuild is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
20#
21# You should have received a copy of the GNU General Public License
22# along with kBuild; if not, write to the Free Software
23# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24#
25#
26
27ifndef __header_kmk__
28# start-of-file-content
29
30#
31# default rule
32#
33all: all_recursive
34
35#
36# The FORCE rule.
37#
38FORCE:
39
40#
41# Try avoid inference rules.
42#
43.SUFFIXES:
44SUFFIXES :=
45
46
47#
48# General purpose macros.
49#
50
51## get last word in a list.
52# @returns last word in $1.
53# @param $1 Word list.
54lastword = $(word $(words $(1)), $(1))
55
56##
57# Newline character(s).
58define NL
59
60
61endef
62
63##
64# Tab character.
65TAB := $(subst ., ,.)
66
67##
68# Space character.
69SP := $(subst ., ,.)
70
71##
72# Checks if two strings are equal.
73# @returns blank if equal
74# @returns non-blank if not equal.
75# @param $1 String 1.
76# @param $2 String 2
77STRCMP = $( todo )
78
79#
80# Assert build type.
81#
82ifndef BUILD_TYPE
83ifndef BUILD_MODE
84$(error kBuild: You must define BUILD_TYPE!)
85endif
86BUILD_TYPE := $(BUILD_MODE)
87endif
88ifeq ($(BUILD_TYPE),DEBUG)
89BUILD_TYPE := debug
90endif
91ifeq ($(BUILD_TYPE),RELEASE)
92BUILD_TYPE := release
93endif
94ifeq ($(BUILD_TYPE),PROFILE)
95BUILD_TYPE := profile
96endif
97
98
99#
100# Assert build platform.
101#
102ifndef BUILD_PLATFORM
103 $(error kBuild: BUILD_PLATFORM is undefined!)
104else
105 BUILD_PLATFORM := $(strip $(BUILD_PLATFORM))
106 ifneq ($(words $(BUILD_PLATFORM))$(filter-out darwin freebsd l4 linux nt os2 win win32 win64,$(BUILD_PLATFORM)),1)
107 # OS/2 (have uppercase legacy)
108 ifeq ($(BUILD_PLATFORM),OS2)
109 $(error kBuild: BUILD_PLATFORM must be all lowercase!)
110 endif
111 $(error kBuild: BUILD_PLATFORM value '$(BUILD_PLATFORM)' was not recognized!)
112 endif
113endif
114
115# Fill in defaults if needed.
116ifndef BUILD_PLATFORM_ARCH
117 ifeq ($(filter-out win64,$(BUILD_PLATFORM)),)
118 BUILD_PLATFORM_ARCH := amd64
119 else
120 BUILD_PLATFORM_ARCH := x86
121 endif
122endif
123ifndef BUILD_PLATFORM_CPU
124 ifeq ($(filter-out amd64,$(BUILD_PLATFORM_ARCH)),)
125 BUILD_PLATFORM_CPU:= k8
126 else
127 BUILD_PLATFORM_CPU:= i586
128 endif
129endif
130
131
132#
133# Assert target platform.
134#
135ifndef BUILD_TARGET
136# not defined, set to the same as build platform
137BUILD_TARGET := $(BUILD_PLATFORM)
138else
139 BUILD_TARGET := $(strip $(BUILD_TARGET))
140 ifneq ($(words $(BUILD_TARGET))$(filter-out darwin freebsd l4 linux nt os2 win win32 win64,$(BUILD_TARGET)),1)
141 # OS/2 (have uppercase legacy)
142 ifeq ($(BUILD_TARGET),OS2)
143 $(error kBuild: BUILD_TARGET must be all lowercase!)
144 endif
145 $(error kBuild: BUILD_TARGET value '$(BUILD_TARGET)' was not recognized!)
146 endif
147endif
148
149# Fill in defaults if needed.
150ifndef BUILD_TARGET_ARCH
151 BUILD_TARGET_ARCH := x86
152endif
153ifndef BUILD_TARGET_CPU
154 BUILD_TARGET_CPU := i586
155endif
156
157# Adjust the DEPTH definition first
158ifeq ($(strip $(DEPTH)),)
159DEPTH := .
160endif
161
162#
163# Common definitions.
164#
165PATH_CURRENT := $(abspath $(CURDIR))
166ifneq ($(strip $(SUB_DEPTH)),)
167PATH_SUB_CURRENT := $(abspath $(PATH_CURRENT)/$(SUB_DEPTH))
168else
169PATH_SUB_CURRENT := $(PATH_CURRENT)
170endif
171PATH_ROOT := $(abspath $(PATH_CURRENT)/$(DEPTH))
172
173# Subdirectory relative to the root.
174ifneq ($(PATH_ROOT),$(PATH_CURRENT))
175CURSUBDIR := $(patsubst $(PATH_ROOT)/%,%,$(PATH_SUB_CURRENT))
176else
177CURSUBDIR := .
178endif
179
180# Output directories.
181ifndef PATH_OUT_BASE
182PATH_OUT_BASE := $(PATH_ROOT)/out
183endif
184ifndef PATH_OUT
185ifdef BUILD_TARGET_SUB # (BUILD_TARGET_SUB is not currently recognized by kBuild in any other places.)
186PATH_OUT := $(PATH_OUT_BASE)/$(BUILD_TARGET).$(BUILD_TARGET_ARCH).$(BUILD_TARGET_SUB)/$(BUILD_TYPE)
187else
188PATH_OUT := $(PATH_OUT_BASE)/$(BUILD_TARGET).$(BUILD_TARGET_ARCH)/$(BUILD_TYPE)
189endif
190endif # !define PATH_OUT
191PATH_OBJ = $(PATH_OUT)/obj
192PATH_TARGET = $(PATH_OBJ)/$(CURSUBDIR)
193PATH_INS = $(PATH_OUT)
194PATH_BIN = $(PATH_INS)/bin
195PATH_DLL = $(PATH_INS)/bin
196PATH_SYS = $(PATH_INS)/bin
197PATH_LIB = $(PATH_INS)/lib
198PATH_DOC = $(PATH_INS)/doc
199
200# Usually kBuild is external to the source tree.
201ifndef PATH_KBUILD
202PATH_KBUILD := $(PATH_ROOT)/kBuild
203endif
204PATH_KBUILD := $(abspath $(PATH_KBUILD))
205# kBuild files which might be of interest.
206FILE_KBUILD_HEADER := $(PATH_KBUILD)/header.kmk
207FILE_KBUILD_CONFIG := $(PATH_KBUILD)/config.kmk
208FILE_KBUILD_FOOTER := $(PATH_KBUILD)/footer.kmk
209
210SUFF_DEP := .dep
211MAKEFILE := $(firstword $(MAKEFILE_LIST))
212
213
214#
215# Check make version.
216#
217ifdef KMK_VERSION
218 ifneq ($(KBUILD_VERSION_MAJOR).$(KBUILD_VERSION_MINOR),0.1)
219 ifneq ($(KBUILD_VERSION_MAJOR),0)
220 $(warning kBuild: kmk major version mismatch, expected '0' found '$(KBUILD_VERSION_MAJOR)'!)
221 else
222 $(warning kBuild: kmk minor version mismatch, expected '1' found '$(KBUILD_VERSION_MINOR)'!)
223 endif
224 endif
225else
226 # Vanilla GNU Make. Only supported for kBuild bootstrapping. Disable some features to make it work.
227 NO_COMPILE_CMDS_DEPS:= 1
228 NO_LINK_CMDS_DEPS := 1
229 sinclude $(PATH_KBUILD)/StampOutPredefines.kmk
230 ifndef IS_BOOTSTRAPPING_KBUILD_NOW
231 $(warning kBuild: Using vanilla GNU make isn't safe for anything but kBuild bootstrapping!)
232 endif
233endif
234
235
236#
237# Build platform setup.
238#
239# OS/2
240ifeq ($(BUILD_PLATFORM),os2)
241EXEC_X86_WIN32 := innopec.exe
242HOSTSUFF_EXE := .exe
243endif
244
245# Linux
246ifeq ($(BUILD_PLATFORM),linux)
247EXEC_X86_WIN32 := wine
248HOSTSUFF_EXE :=
249endif
250
251# Win, Win32, Win64, NT.
252ifeq ($(filter-out win32 win64 win nt,$(BUILD_PLATFORM)),)
253EXEC_X86_WIN32 :=
254HOSTSUFF_EXE := .exe
255endif
256
257# FreeBSD
258ifeq ($(BUILD_PLATFORM),freebsd)
259EXEC_X86_WIN32 := wine
260HOSTSUFF_EXE :=
261endif
262
263# Darwin / Mac OS X
264ifeq ($(BUILD_PLATFORM),darwin)
265EXEC_X86_WIN32 := false
266HOSTSUFF_EXE :=
267endif
268
269ifndef PATH_KBUILD_BIN
270 PATH_KBUILD_BIN := $(PATH_KBUILD)/bin/$(BUILD_PLATFORM_ARCH).$(BUILD_PLATFORM)
271 ifeq ($(wildcard $(PATH_KBUILD_BIN)/kmk_ash$(HOSTSUFF_EXE)),)
272 ifeq ($(BUILD_TARGET_ARCH),amd64)
273 PATH_KBUILD_BIN := $(PATH_KBUILD)/bin/x86.$(BUILD_PLATFORM)
274 endif
275 ifeq ($(wildcard $(PATH_KBUILD_BIN)/kmk_ash$(HOSTSUFF_EXE)),)
276 ifeq ($(filter-out win64 win nt ,$(BUILD_PLATFORM)),)
277 PATH_KBUILD_BIN := $(PATH_KBUILD)/bin/x86.win32
278 endif
279 endif
280 ifeq ($(wildcard $(PATH_KBUILD_BIN)/kmk_ash$(HOSTSUFF_EXE)),)
281 # give up
282 PATH_KBUILD_BIN := $(PATH_KBUILD)/bin/$(BUILD_PLATFORM_ARCH).$(BUILD_PLATFORM)
283 endif
284 endif
285endif
286
287
288#
289# Build target setup.
290#
291ifeq ($(filter-out win32 win64 win nt os2,$(BUILD_TARGET)),)
292SUFF_OBJ := .obj
293SUFF_LIB := .lib
294SUFF_DLL := .dll
295SUFF_EXE := .exe
296SUFF_SYS := .sys
297SUFF_RES := .res
298endif
299ifeq ($(BUILD_TARGET),l4)
300SUFF_OBJ := .o
301SUFF_LIB := .a
302SUFF_DLL := .s.so
303SUFF_EXE :=
304SUFF_SYS := .a
305SUFF_RES :=
306endif
307ifeq ($(BUILD_TARGET),darwin)
308SUFF_OBJ := .o
309SUFF_LIB := .a
310SUFF_DLL := .dylib
311SUFF_EXE :=
312SUFF_SYS := .a
313SUFF_RES :=
314endif
315ifndef SUFF_OBJ
316SUFF_OBJ := .o
317SUFF_LIB := .a
318SUFF_DLL := .so
319SUFF_EXE :=
320SUFF_SYS := .a
321SUFF_RES :=
322endif
323
324#
325# Standard kBuild tools.
326#
327ifeq ($(MAKE),kmk)
328MAKE := $(PATH_KBUILD_BIN)/kmk$(HOSTSUFF_EXE)
329endif
330
331DEP_EXT := $(PATH_KBUILD_BIN)/kDep$(HOSTSUFF_EXE)
332ifeq ($(filter kDep,$(KMK_BUILTIN)),kDep)
333DEP := kmk_builtin_kDep
334else
335DEP := $(DEP_EXT)
336endif
337
338DEP_IDB_EXT := $(PATH_KBUILD_BIN)/kDepIDB$(HOSTSUFF_EXE)
339ifeq ($(filter kDepPre,$(KMK_BUILTIN)),kDepIDB)
340DEP_IDB := $(if kmk_builtin_kDepIDB
341else
342DEP_IDB := $(DEP_IDB_EXT)
343endif
344
345DEP_PRE_EXT := $(PATH_KBUILD_BIN)/kDepPre$(HOSTSUFF_EXE)
346ifeq ($(filter kDepPre,$(KMK_BUILTIN)),kDepPre)
347DEP_PRE := $(if kmk_builtin_kDepPre
348else
349DEP_PRE := $(DEP_PRE_EXT)
350endif
351
352APPEND_EXT := $(PATH_KBUILD_BIN)/kmk_append$(HOSTSUFF_EXE)
353ifeq ($(filter append,$(KMK_BUILTIN)),append)
354APPEND := kmk_builtin_append
355else
356APPEND := $(APPEND_EXT)
357endif
358
359CAT_EXT := $(PATH_KBUILD_BIN)/kmk_cat$(HOSTSUFF_EXE)
360ifeq ($(filter cat,$(KMK_BUILTIN)),cat)
361CAT := kmk_builtin_cat
362else
363CAT := $(CAT_EXT)
364endif
365
366CP_EXT := $(PATH_KBUILD_BIN)/kmk_cp$(HOSTSUFF_EXE)
367ifeq ($(filter cp,$(KMK_BUILTIN)),cp)
368CP := kmk_builtin_cp
369else
370CP := $(CP_EXT)
371endif
372
373ECHO_EXT := $(PATH_KBUILD_BIN)/kmk_echo$(HOSTSUFF_EXE)
374ifeq ($(filter echo,$(KMK_BUILTIN)),echo)
375ECHO := kmk_builtin_echo
376else
377ECHO := $(ECHO_EXT)
378endif
379
380INSTALL_EXT := $(PATH_KBUILD_BIN)/kmk_install$(HOSTSUFF_EXE)
381ifeq ($(filter install,$(KMK_BUILTIN)),install)
382INSTALL := kmk_builtin_install
383else
384INSTALL := $(INSTALL_EXT)
385endif
386
387LN_EXT := $(PATH_KBUILD_BIN)/kmk_ln$(HOSTSUFF_EXE)
388ifeq ($(filter ln,$(KMK_BUILTIN)),ln)
389LN := kmk_builtin_ln
390else
391LN := $(LN_EXT)
392endif
393
394MKDIR_EXT := $(PATH_KBUILD_BIN)/kmk_mkdir$(HOSTSUFF_EXE)
395ifeq ($(filter mkdir,$(KMK_BUILTIN)),mkdir)
396MKDIR := kmk_builtin_mkdir
397else
398MKDIR := $(MKDIR_EXT)
399endif
400
401MV_EXT := $(PATH_KBUILD_BIN)/kmk_mv$(HOSTSUFF_EXE)
402ifeq ($(filter mv,$(KMK_BUILTIN)),mv)
403MV := kmk_builtin_mv
404else
405MV := $(MV_EXT)
406endif
407
408RM_EXT := $(PATH_KBUILD_BIN)/kmk_rm$(HOSTSUFF_EXE)
409ifeq ($(filter rm,$(KMK_BUILTIN)),rm)
410RM := kmk_builtin_rm
411else
412RM := $(RM_EXT)
413endif
414
415SED_EXT := $(PATH_KBUILD_BIN)/kmk_sed$(HOSTSUFF_EXE)
416ifeq ($(filter sed,$(KMK_BUILTIN)),sed)
417SED := kmk_builtin_sed
418else
419SED := $(SED_EXT)
420endif
421
422# Our default shell is the Almquist shell from *BSD.
423ASH := $(PATH_KBUILD_BIN)/kmk_ash$(HOSTSUFF_EXE)
424MAKESHELL := $(ASH)
425SHELL := $(ASH)
426export SHELL MAKESHELL
427
428# Symlinking is problematic on some platforms...
429LN_SYMLINK := $(LN) -s
430
431
432
433#
434# Message macros.
435#
436
437ifndef BUILD_QUIET
438ifdef BUILD_DEBUG
439BUILD_VERBOSE := 9
440endif
441MSG_L1 = @$(ECHO) "kBuild: $1"
442ifdef BUILD_VERBOSE
443MSG_L2 = @$(ECHO) "kBuild: $1"
444QUIET :=
445else
446QUIET := @
447MSG_L2 =
448endif
449ifdef BUILD_DEBUG
450MSG_L3 = @$(ECHO) "kBuild: $1"
451else
452MSG_L3 =
453endif
454else
455QUIET :=
456MSG_L1 =
457MSG_L2 =
458MSG_L3 =
459endif
460
461## ABSPATH - make paths absolute.
462# This implementation is clumsy and doesn't resolve '..' and '.' components.
463#
464# @param $1 The paths to make absolute.
465ABSPATH = $(abspath $(1))
466
467## DIRDEP - make create directory dependencies.
468#
469# @param $1 The paths to the directories which must be created.
470DIRDEP = $(foreach path,$(patsubst %/,%,$(1)),$(path)/)
471
472
473## Cygwin kludge.
474# This converts /cygdrive/x/% to x:%.
475#
476# @param $1 The paths to make native.
477# @remark This macro is pretty much obsolete since we don't use cygwin base make.
478ifneq ($(patsubst /cygdrive/%,%,$(CURDIR)),$(CURDIR))
479CYGPATHMIXED = $(foreach path,$(1)\
480 ,$(if $(patsubst /cygdrive/%,,$(path)),$(path),$(patsubst $(strip $(firstword $(subst /, ,$(patsubst /cygdrive/%,%,$(path)))))/%,$(strip $(firstword $(subst /, ,$(patsubst /cygdrive/%,%,$(path))))):/%,$(patsubst /cygdrive/%,%,$(path)))))
481else
482CYGPATHMIXED = $(1)
483endif
484
485#
486# Initialize some of the globals which the Config.kmk and
487# others can add stuff to if they like for processing in the footer.
488#
489
490## ALL_TARGET
491# This is the list of all targets.
492ALL_TARGETS :=
493
494## TEMPLATE_PATHS
495# List a paths (separated by space) where templates can be found.
496TEMPLATE_PATHS :=
497
498## TOOL_PATHS
499# List of paths (separated by space) where tools can be found.
500TOOL_PATHS :=
501
502## SDK_PATHS
503# List of paths (separated by space) where SDKs can be found.
504SDK_PATHS :=
505
506## Proritized list of the default makefile when walking subdirectories.
507# The user can overload this list.
508DEFAULT_MAKEFILE := Makefile.kmk makefile.kmk Makefile makefile
509
510## PROPS_SINGLE
511# The list of non-accumulative target properties.
512# A Config.kmk file can add it's own properties to this list and kBuild
513# will do the necessary inheritance from templates to targets.
514PROPS_SINGLE := TOOL ARTOOL CTOOL CXXTOOL ASTOOL LDTOOL INST NOINST
515
516## PROPS_DEFERRED
517# This list of non-accumulative target properties which are functions,
518# and thus should not be expanded until the very last moment.
519PROPS_DEFERRED := INSTFUN INSTALLER
520
521## PROPS_ACCUMULATE
522# The list of accumulative target properties.
523# A Config.kmk file can add it's own properties to this list and kBuild
524# will do the necessary inheritance from templates to targets.
525PROPS_ACCUMULATE := \
526 SDKS DEFS DEPS INCS SOURCES \
527 COPTS CFLAGS CDEFS CINCS CXXOPTS CXXFLAGS CXXDEFS CXXINCS \
528 ASOPTS ASFLAGS ASDEFS ASINCS \
529 LDFLAGS LIBS LIBPATH \
530 BLD_TYPE BLD_TRG BLD_TRG_ARCH BLD_TRG_CPU \
531 SYSSUFF EXESUFF DLLSUFF LIBSUFF ARLIBSUFF \
532
533
534## PROPS_TOOLS
535# This is a subset of the other PROPS
536PROPS_TOOLS := TOOL CTOOL CXXTOOL ASTOOL ARTOOL LDTOOL
537
538
539#
540# Pass configuration.
541#
542# The PASS_<passname>_trgs variable is listing the targets.
543# The PASS_<passname>_vars variable is listing the target variables.
544# The PASS_<passname>_pass variable is the lowercased passname.
545#
546
547## PASS: bldprogs
548# This pass builds targets which are required for building the rest.
549PASS_BLDPROGS := Build Programs
550PASS_BLDPROGS_trgs :=
551PASS_BLDPROGS_vars := _BLDPROGS
552PASS_BLDPROGS_pass := bldprogs
553
554## PASS: libraries
555# This pass builds library targets.
556PASS_LIBRARIES := Libraries
557PASS_LIBRARIES_trgs :=
558PASS_LIBRARIES_vars := _LIBS _IMPORT_LIBS _OTHER_LIBRARIES
559PASS_LIBRARIES_pass := libraries
560
561## PASS: binaries
562# This pass builds dll targets.
563PASS_DLLS := DLLs
564PASS_DLLS_trgs :=
565PASS_DLLS_vars := _DLLS _OTHER_DLLS
566PASS_DLLS_pass := dlls
567
568## PASS: binaries
569# This pass builds binary targets, i.e. programs, system modules and stuff.
570PASS_BINARIES := Programs
571PASS_BINARIES_trgs :=
572PASS_BINARIES_vars := _PROGRAMS _SYSMODS _OTHER_BINARIES
573PASS_BINARIES_pass := binaries
574
575## PASS: others
576# This pass builds other targets.
577PASS_OTHERS := Other Stuff
578PASS_OTHERS_trgs :=
579PASS_OTHERS_vars := _OTHERS
580PASS_OTHERS_pass := others
581
582## PASS: install
583# This pass installs the built entities to a sandbox area.
584PASS_INSTALLS := Install
585PASS_INSTALLS_trgs :=
586PASS_INSTALLS_vars := _INSTALLS_DIRS _INSTALLS
587PASS_INSTALLS_pass := installs
588
589## PASS: packing
590# This pass processes custom packing rules.
591PASS_PACKING := Packing
592PASS_PACKING_trgs :=
593PASS_PACKING_vars := _PACKING
594PASS_PACKING_pass := packing
595#alias
596packing: pass_packing
597
598## PASS: clean
599# This pass removes all generated files.
600PASS_CLEAN := Clean
601PASS_CLEAN_trgs := do-clean
602PASS_CLEAN_vars :=
603PASS_CLEAN_pass := clean
604# alias
605clean: pass_clean
606
607## PASS: nothing
608# This pass just walks the tree.
609PASS_NOTHING := Nothing
610PASS_NOTHING_trgs := do-nothing
611PASS_NOTHING_vars :=
612PASS_NOTHING_pass := nothing
613# alias
614nothing: pass_nothing
615
616## DEFAULT_PASSES
617# The default passes and their order.
618DEFAULT_PASSES := BLDPROGS LIBRARIES DLLS BINARIES OTHERS INSTALLS
619
620## PASSES
621# The passes that should be defined. This must include
622# all passes mentioned by DEFAULT_PASSES.
623PASSES := $(DEFAULT_PASSES) NOTHING CLEAN
624
625
626#
627# This is how we find the closest config.kmk.
628# It's a little hacky but I think it works fine.
629#
630_CFGDIR := .
631_CFGFILES := ./Config.kmk ./config.kmk
632define def_include_config
633$(eval _CFGDIR := $(_CFGDIR)/$(dir))
634_CFGFILES += $(_CFGDIR)/Config.kmk $(_CFGDIR)/config.kmk
635endef
636# walk down the _RELATIVE_ path specified by DEPTH.
637$(foreach dir,$(subst /, ,$(DEPTH)), $(eval $(def_include_config)) )
638# add the default config file.
639_CFGFILE := $(firstword $(wildcard $(_CFGFILES) $(FILE_KBUILD_CONFIG)))
640_CFGFILES :=
641_CFGDIR :=
642ifeq ($(_CFGFILE),)
643$(error kBuild: no Config.kmk file found! Check the DEPTH: DEPTH='$(DEPTH)' PATH_CURRENT='$(PATH_CURRENT)')
644endif
645
646# Include the config.kmk we found file (or the default one).
647include $(_CFGFILE)
648
649
650# end-of-file-content
651__header_kmk__ := 1
652endif # __header_kmk__
653
Note: See TracBrowser for help on using the repository browser.