Makefile.kmk revision fb10afea3ee08dc993100739ee95f31a6c5a457c
2262N/A# $Id$
2262N/A## @file
2262N/A# Sub-Makefile for the VirtualBox Guest OpenGL part
2262N/A#
2262N/A
2262N/A#
2262N/A# Copyright (C) 2008 Sun Microsystems, Inc.
2262N/A#
2262N/A# This file is part of VirtualBox Open Source Edition (OSE), as
2262N/A# available from http://www.virtualbox.org. This file is free software;
2262N/A# you can redistribute it and/or modify it under the terms of the GNU
2262N/A# General Public License (GPL) as published by the Free Software
2262N/A# Foundation, in version 2 as it comes in the "COPYING" file of the
2262N/A# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2262N/A# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2262N/A#
2262N/A# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
2262N/A# Clara, CA 95054 USA or visit http://www.sun.com if you need
2262N/A# additional information or have any questions.
2262N/A#
2262N/A
2262N/ASUB_DEPTH = ../../../../../..
2262N/Ainclude $(KBUILD_PATH)/subheader.kmk
2262N/A
3232N/A#
6159N/A# Target lists.
2262N/A#
2262N/ABLDDIRS += \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/
6159N/A
2262N/ADLLS += VBoxOGL VBoxOGLarrayspu VBoxOGLpassthroughspu VBoxOGLpackspu VBoxOGLfeedbackspu
2262N/A
2342N/Aifeq ($(KBUILD_TARGET),linux)
3853N/A VBoxOGL_DRI = 1
2262N/A VBOX_PATH_MESA_SOURCE = /usr/share/mesa-source
2262N/Aendif
2262N/A
2262N/A#
4134N/A# VBoxOGL
2262N/A#
2262N/AVBoxOGL_TEMPLATE = VBOXCROGLR3GUESTDLL
2262N/AVBoxOGL_INCS = .
2262N/Aifdef VBoxOGL_DRI
2262N/A VBoxOGL_DEFS += VBOXOGL_DRI IN_DRI_DRIVER
2262N/A VBoxOGL_INCS += \
2262N/A $(VBOX_PATH_MESA_SOURCE) \
2262N/A $(VBOX_PATH_MESA_SOURCE)/include \
2262N/A $(VBOX_PATH_MESA_SOURCE)/src/mesa/ \
2262N/A $(VBOX_PATH_MESA_SOURCE)/src/mesa/glapi \
2262N/A $(VBOX_PATH_MESA_SOURCE)/src/mesa/main \
2262N/A $(PATH_ROOT)/src/VBox/Additions/x11/x11include/libdrm-2.4.5
2262N/Aendif
2342N/Aifeq ($(KBUILD_TARGET),win)
2262N/A#fixme?, INTERMEDIATES.win ain't working
2262N/A VBoxOGL_INTERMEDIATES += $(VBOX_PATH_CROGL_GENFILES)/cr_gl.h
2262N/Aendif
2262N/Aifdef VBoxOGL_DRI
2262N/A VBoxOGL_INTERMEDIATES += \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/cr_gl.h \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/DD_gl.h
2262N/Aendif
2262N/AVBoxOGL_SOURCES = \
2262N/A load.c \
2262N/A stub.c \
2262N/A context.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/getprocaddress.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/NULLfuncs.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/tsfuncs.c
2262N/AVBoxOGL_SOURCES.linux = \
2262N/A glx.c \
2262N/A xfont.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/linux_exports.asm
2262N/Aifdef VBoxOGL_DRI
2262N/A VBoxOGL_SOURCES.linux += \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/DD_gl.c \
2262N/A dri_drv.c
2262N/Aendif
2262N/AVBoxOGL_SOURCES.win = \
2262N/A wgl.c \
2262N/A icd_drv.c \
2262N/A VBoxCROGL.rc \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/windows_exports.asm \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/cropengl.def
2262N/AVBoxOGL_CLEAN = \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/getprocaddress.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/NULLfuncs.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/tsfuncs.c
2262N/AVBoxOGL_CLEAN.linux = \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/linux_exports.asm
2262N/AVBoxOGL_CLEAN.win = \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/windows_exports.asm \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/cropengl.def
2262N/Aifdef VBoxOGL_DRI
2262N/AVBoxOGL_CLEAN.linux += \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/cr_gl.h \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/DD_gl.h \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/DD_gl.c
2262N/Aendif
2262N/AVBoxOGL_LIBS = \
2262N/A $(VBOX_LIB_IPRT_GUEST_R3) \
2262N/A $(VBOX_LIB_VBGL_R3) \
2262N/A $(VBOX_LIB_OGL_CRUTIL) \
2262N/A $(PATH_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB)
2262N/Aif1of ($(KBUILD_TARGET),linux solaris)
2262N/A VBoxOGL_LIBS += \
2262N/A Xcomposite
2262N/Aendif
2262N/A
2262N/A#
2262N/A# Generate files for VBoxOGL.
2262N/A#
2262N/A$(VBOX_PATH_CROGL_GENFILES)/NULLfuncs.c: $(PATH_SUB_CURRENT)/NULLfuncs.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A$(VBOX_PATH_CROGL_GENFILES)/tsfuncs.c: $(PATH_SUB_CURRENT)/tsfuncs.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A
2262N/Aifeq ($(KBUILD_TARGET),win)
2262N/A$(VBOX_PATH_CROGL_GENFILES)/getprocaddress.c: $(PATH_SUB_CURRENT)/windows_getprocaddress.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A$(VBOX_PATH_CROGL_GENFILES)/cropengl.def: $(PATH_SUB_CURRENT)/defs.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A$(VBOX_PATH_CROGL_GENFILES)/cr_gl.h: $(PATH_SUB_CURRENT)/cr_gl.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A$(VBOX_PATH_CROGL_GENFILES)/windows_exports.asm: \
2262N/A $(PATH_SUB_CURRENT)/windows_i386_exports.py \
2262N/A $(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \
2262N/A | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/Aelse ifeq ($(KBUILD_TARGET),linux)
2262N/Aifndef VBoxOGL_DRI
2262N/A$(VBOX_PATH_CROGL_GENFILES)/getprocaddress.c: $(PATH_SUB_CURRENT)/getprocaddress.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A$(VBOX_PATH_CROGL_GENFILES)/linux_exports.asm: \
2262N/A $(PATH_SUB_CURRENT)/Linux_i386_exports.py \
2262N/A $(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \
2262N/A | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/Aelse
2262N/A$(VBOX_PATH_CROGL_GENFILES)/getprocaddress.c: $(PATH_SUB_CURRENT)/getprocaddress_dri.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A$(VBOX_PATH_CROGL_GENFILES)/cr_gl.h: $(PATH_SUB_CURRENT)/cr_gl.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A $(VBOX_PATH_CROGL_GENFILES)/DD_gl.h: $(PATH_SUB_CURRENT)/DD_glh.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A $(VBOX_PATH_CROGL_GENFILES)/DD_gl.c: $(PATH_SUB_CURRENT)/DD_glc.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A $(VBOX_PATH_CROGL_GENFILES)/linux_exports.asm: \
2262N/A $(PATH_SUB_CURRENT)/Linux_i386_exports_dri.py \
2262N/A $(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \
2262N/A | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/Aendif
2262N/Aendif
2262N/A
2262N/A#
2262N/A# VBoxOGLarrayspu
2262N/A#
2262N/AVBoxOGLarrayspu_TEMPLATE = VBOXCROGLR3GUESTDLL
2262N/AVBoxOGLarrayspu_INCS = \
2262N/A array
2262N/AVBoxOGLarrayspu_INCS.darwin += $(PATH_OUT)/obj/VBoxOGL
2262N/AVBoxOGLarrayspu_INTERMEDIATES = \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/state/cr_currentpointers.h \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/state/cr_statefuncs.h
2262N/AVBoxOGLarrayspu_SOURCES = \
2262N/A array/arrayspu.c \
2262N/A array/arrayspu_config.c \
2262N/A array/arrayspu_init.c
2262N/AVBoxOGLarrayspu_SOURCES.win = \
2262N/A array/arrayspu.def
2262N/AVBoxOGLarrayspu_LIBS = \
2262N/A $(VBOX_LIB_OGL_CRUTIL) \
2262N/A $(PATH_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB) \
2262N/A $(PATH_LIB)/additions/VBoxOGLcrstate$(VBOX_SUFF_LIB)
2262N/A
2262N/A#
2262N/A# VBoxOGLpassthroughspu
2262N/A#
2262N/AVBoxOGLpassthroughspu_TEMPLATE = VBOXCROGLR3GUESTDLL
2262N/AVBoxOGLpassthroughspu_INCS = \
2262N/A passthrough
2262N/AVBoxOGLpassthroughspu_SOURCES = \
2262N/A passthrough/passthroughspu_init.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/passthroughspu.c
2262N/AVBoxOGLpassthroughspu_SOURCES.win = \
2262N/A passthrough/passthrough.def
2262N/AVBoxOGLpassthroughspu_CLEAN = \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/passthroughspu.c
2262N/AVBoxOGLpassthroughspu_LIBS = \
2262N/A $(VBOX_LIB_OGL_CRUTIL)
2262N/A
2262N/A#
2262N/A# Generate files for VBoxOGLpassthroughspu.
2262N/A#
2262N/A$(VBOX_PATH_CROGL_GENFILES)/passthroughspu.c: $(PATH_SUB_CURRENT)/passthrough/passthrough.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
2262N/A
2262N/A#
2262N/A# VBoxOGLpackspu
2262N/A#
2262N/AVBoxOGLpackspu_TEMPLATE = VBOXCROGLR3GUESTDLL
2262N/AVBoxOGLpackspu_DEFS = TRACKS_STATE=1 PACKS=1
2262N/AVBoxOGLpackspu_INCS = \
2262N/A pack
2262N/AVBoxOGLpackspu_INTERMEDIATES = \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/packspu_proto.h
2262N/AVBoxOGLpackspu_SOURCES = \
2262N/A pack/packspu_bufferobject.c \
2262N/A pack/packspu_client.c \
2262N/A pack/packspu_config.c \
2262N/A pack/packspu_context.c \
2262N/A pack/packspu_getstring.c \
2262N/A pack/packspu_init.c \
2262N/A pack/packspu_misc.c \
2262N/A pack/packspu_net.c \
2262N/A pack/packspu_swapbuf.c \
2262N/A pack/packspu_pixel.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/packspu.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/packspu_get.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/packspu_flush.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/packspu_beginend.c
2262N/AVBoxOGLpackspu_SOURCES.win = \
2262N/A pack/pack.def
2262N/AVBoxOGLpackspu_CLEAN = \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/packspu_proto.h \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/packspu.c \
3853N/A $(VBOX_PATH_CROGL_GENFILES)/packspu_get.c \
3853N/A $(VBOX_PATH_CROGL_GENFILES)/packspu_flush.c \
4134N/A $(VBOX_PATH_CROGL_GENFILES)/packspu_beginend.c
4134N/AVBoxOGLpackspu_LIBS = \
4134N/A $(VBOX_LIB_OGL_CRUTIL) \
4134N/A $(PATH_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB) \
3853N/A $(PATH_LIB)/additions/VBoxOGLcrstate$(VBOX_SUFF_LIB) \
2262N/A $(PATH_LIB)/additions/VBoxOGLcrpacker$(VBOX_SUFF_LIB)
2262N/A
2262N/A#
2262N/A# Generate files for VBoxOGLpackspu.
2262N/A#
2262N/A$(VBOX_PATH_CROGL_GENFILES)/packspu.c: $(addprefix $(PATH_SUB_CURRENT)/pack/,pack.py packspu_special packspu_unimplemented_special) $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) $(<D)
2262N/A
2262N/A$(VBOX_PATH_CROGL_GENFILES)/packspu_get.c: $(PATH_SUB_CURRENT)/pack/packspu_get.py $(PATH_SUB_CURRENT)/pack/packspu_special $(PATH_ROOT)/src/VBox/HostServices/SharedOpenGL/crserverlib/get_sizes.py $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) $(<D)
2262N/A
2262N/A$(VBOX_PATH_CROGL_GENFILES)/packspu_flush.c: $(PATH_SUB_CURRENT)/pack/packspu_flush.py $(PATH_SUB_CURRENT)/pack/packspu_flush_special $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) $(<D)
2262N/A
2262N/A$(VBOX_PATH_CROGL_GENFILES)/packspu_beginend.c: $(PATH_SUB_CURRENT)/pack/packspu_beginend.py $(PATH_SUB_CURRENT)/pack/packspu_vertex_special $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) $(<D)
2262N/A
2262N/A$(VBOX_PATH_CROGL_GENFILES)/packspu_proto.h: $(addprefix $(PATH_SUB_CURRENT)/pack/,packspu_proto.py packspu_special packspu_unimplemented_special) $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) $(<D)
2262N/A
2262N/A#
2262N/A# VBoxOGLfeedbackspu
2262N/A#
2262N/AVBoxOGLfeedbackspu_TEMPLATE = VBOXCROGLR3GUESTDLL
2262N/AVBoxOGLfeedbackspu_INCS = \
2262N/A feedback
2262N/AVBoxOGLarrayspu_INTERMEDIATES = \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/feedbackspu_proto.h
2262N/AVBoxOGLfeedbackspu_SOURCES = \
2262N/A feedback/feedbackspu_config.c \
2262N/A feedback/feedbackspu_init.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/feedbackspu.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/feedbackspu_state.c
2262N/AVBoxOGLfeedbackspu_SOURCES.win = \
2262N/A feedback/feedback.def
2262N/AVBoxOGLfeedbackspu_CLEAN = \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/feedbackspu_proto.h \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/feedbackspu.c \
2262N/A $(VBOX_PATH_CROGL_GENFILES)/feedbackspu_state.c
2262N/AVBoxOGLfeedbackspu_LIBS = \
2262N/A $(VBOX_LIB_OGL_CRUTIL) \
2262N/A $(PATH_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB) \
2262N/A $(PATH_LIB)/additions/VBoxOGLcrstate$(VBOX_SUFF_LIB)
2262N/A
2262N/A#
2262N/A# Generate files for VBoxOGLfeedbackspu.
2262N/A#
6159N/A$(VBOX_PATH_CROGL_GENFILES)/feedbackspu.c: $(addprefix $(PATH_SUB_CURRENT)/feedback/,feedback.py feedback_special select_special feedback_state_special) $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) $(<D)
2262N/A
2262N/A$(VBOX_PATH_CROGL_GENFILES)/feedbackspu_state.c: $(addprefix $(PATH_SUB_CURRENT)/feedback/,feedback_state.py feedback_state_special) $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) $(<D)
2262N/A
2262N/A$(VBOX_PATH_CROGL_GENFILES)/feedbackspu_proto.h: $(addprefix $(PATH_SUB_CURRENT)/feedback/,feedbackspu_proto.py feedback_special select_special feedback_state_special) $(VBOX_CROGL_API_FILES) | $$(dir $$@)
2262N/A $(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) $(<D)
2262N/A
2262N/Ainclude $(KBUILD_PATH)/subfooter.kmk
2262N/A
2262N/A