Big reorganization of the makefile

This commit is contained in:
Adrien Bourmault 2019-03-17 22:32:52 +01:00
parent 77b9f2d066
commit bc53c696fc
12 changed files with 145 additions and 242 deletions

223
Makefile
View File

@ -22,117 +22,182 @@
# along with OS/K. If not, see <https://www.gnu.org/licenses/>. # # along with OS/K. If not, see <https://www.gnu.org/licenses/>. #
#=----------------------------------------------------------------------------=# #=----------------------------------------------------------------------------=#
.PHONY: all ## VARIABLES ----------------------------------------------------------------- #
#Programs #Programs
ASM=nasm ASM=nasm
LD=ld LD=ld
CCNAME=x86_64-elf-gcc
ASMFLAGS=-f elf64 ASMFLAGS=-f elf64
LDFLAGS=-melf_x86_64 LDFLAGS=-melf_x86_64
COPTIM=-O2
CWARNS=-Wall -Wextra # -Werror=implicit-function-declaration
CINCLUDES=-Ikaleid/include
CFLAGS1=-nostdlib -ffreestanding -mcmodel=large # -std=gnu11
CFLAGS2= -c -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -fno-strict-aliasing
CFLAGS=$(CFLAGS1) $(CFLAGS2) -DNDEBUG
KCC=$(CCNAME) $(COPTIM) $(CWARNS) $(CFLAGS) $(CINCLUDES) -D_OSK_SOURCE -D_KALEID_KERNEL
#Folders #Folders
MBRDIR=boot/grub MBRDIR=boot/grub
LOADERDIR=boot/loader LOADERDIR=boot/loader
KERNELDIR=kaleid
OBJDIR=build/obj OBJDIR=build/obj
BINDIR=build/bin BINDIR=build/bin
# Object to link (temp)
l_objects=./build/obj/kaleid/crtlib/memory.o \
./build/obj/kaleid/crtlib/rand.o \
./build/obj/kaleid/crtlib/string.o \
./build/obj/kaleid/crtlib/ultoa.o \
./build/obj/kaleid/crtlib/utoa.o \
./build/obj/kaleid/crtlib/ctype.o \
./build/obj/kaleid/crtlib/itoa.o \
./build/obj/kaleid/crtlib/ltoa.o \
./build/obj/kaleid/crtlib/sprintf.o \
./build/obj/kaleid/extras/prog.o \
./build/obj/kaleid/extras/argv.o \
./build/obj/kaleid/kernel/init/table.o \
./build/obj/kaleid/kernel/init/init.o \
./build/obj/kaleid/kernel/io/vga.o \
./build/obj/kaleid/kernel/io/cursor.o \
./build/obj/kaleid/kernel/io/term.o \
./build/obj/kaleid/kernel/ke/panic.o \
./build/obj/boot/loader.o
#Color codes #Color codes
CL='\033[0;32m' CL='\033[0;32m'
CL2='\033[1;36m' CL2='\033[1;36m'
CL3='\033[0m' CL3='\033[0m'
NC='\033[1;37m' NC='\033[1;37m'
kernel: ## MAIN MAKEFILE ------------------------------------------------------------- #
@echo ${CL2}[[kernel]]${NC} Making kernel...${CL3} .PHONY: all
@cpp ./Makefile.in > build/Makefile.out all : kernel
@python build/idttool.py
@make kernel -f build/Makefile.out.2
@rm build/Makefile.out build/Makefile.out.2
@echo ${CL2}[[kernel]]${CL} Terminated without error.${CL3}
tests:
cpp -D_TESTS ./Makefile.in > build/Makefile.out
python build/idttool.py
make tests -f build/Makefile.out.2
rm build/Makefile.out build/Makefile.out.2
boot.mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg .PHONY: test
@mkdir -p $(BINDIR)/disk test: all
@echo ${CL2}[boot.mbr]${NC} Installing MBR on image...${CL3}
@$(MBRDIR)/grub-install.sh $(BINDIR)/disk.img $(BINDIR)/disk $(MBRDIR)/grub.cfg
@tail -1 grub.log | head -1 | grep "Installation terminée, sans erreur."
@rmdir $(BINDIR)/disk
@echo ${CL2}[boot.mbr]${CL} Terminated without error.${CL3}
boot.loader.asm: $(LOADERDIR)/loader.asm
@echo ${CL2}[boot.loader.asm]${NC} Making loader...${CL3}
@$(ASM) $(ASMFLAGS) $(LOADERDIR)/loader.asm -o $(OBJDIR)/boot/loader.o > /dev/null
@echo ${CL2}[boot.loader.asm]${CL} OK${CL3}
loader: boot.loader.asm link copykernel
copykernel:
@mkdir -p $(BINDIR)/disk
@echo ${CL2}[disk]${NC} Integrating kernel...${CL3}
@$(MBRDIR)/mount.sh $(BINDIR)/disk.img $(BINDIR)/disk
@cp $(BINDIR)/kaleid $(BINDIR)/disk/boot/kaleid
@$(MBRDIR)/umount.sh $(BINDIR)/disk
@echo ${CL2}[disk]${CL} OK${CL3}
@rmdir $(BINDIR)/disk
make_disk:
@echo ${CL2}[make_disk]${NC} Constructing disk image...${CL3}
@$(MBRDIR)/create_disk.sh $(BINDIR)/disk.img
@echo ${CL2}[make_disk]${CL} OK${CL3}
kaleid: kernel loader
test: kaleid
@qemu-system-x86_64 -hda build/bin/disk.img -d cpu_reset,guest_errors,pcall,int -enable-kvm 2> qemu.log & @qemu-system-x86_64 -hda build/bin/disk.img -d cpu_reset,guest_errors,pcall,int -enable-kvm 2> qemu.log &
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > loader_disasm64.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > loader_disasm64.asm
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > loader_disasm32.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > loader_disasm32.asm
.PHONY: test32
test32: test32: all
@qemu-system-i386 -hda build/bin/disk.img -d cpu_reset,guest_errors,pcall,int -enable-kvm 2> qemu.log & @qemu-system-i386 -hda build/bin/disk.img -d cpu_reset,guest_errors,pcall,int -enable-kvm 2> qemu.log &
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > loader_disasm64.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > loader_disasm64.asm
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > loader_disasm32.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > loader_disasm32.asm
debug: kaleid .PHONY: debug
debug: all
@qemu-system-x86_64 -hda build/bin/disk.img -d cpu_reset,guest_errors,pcall,int -s -S -enable-kvm 2> qemu.log & @qemu-system-x86_64 -hda build/bin/disk.img -d cpu_reset,guest_errors,pcall,int -s -S -enable-kvm 2> qemu.log &
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > loader_disasm64.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > loader_disasm64.asm
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > loader_disasm32.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > loader_disasm32.asm
boot: make_disk boot.mbr
@echo ${CL2}[[boot]]${CL} Terminated without error.${CL3}
all: boot kaleid .PHONY: kernel
@echo ${CL2}[[all]]${CL} Terminated without error.${CL3} kernel: $(BINDIR)/kaleid $(BINDIR)/disk.img
@mkdir -p $(BINDIR)/disk
@echo ${CL2}[[$@]] ${NC}Integrating kernel...${CL3}
-@$(MBRDIR)/umount.sh $(BINDIR)/disk
@$(MBRDIR)/mount.sh $(BINDIR)/disk.img $(BINDIR)/disk
@cp $(BINDIR)/kaleid $(BINDIR)/disk/boot/kaleid
@$(MBRDIR)/umount.sh $(BINDIR)/disk
@echo ${CL2}[[$@]] ${CL}Success.${CL3}
@rmdir $(BINDIR)/disk
link: .PHONY: install_mbr
@$(LD) $(LDFLAGS) -T build/kernel.ld $(l_objects) -o $(OBJDIR)/boot/kaleid.x86_64 install_mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg
@x86_64-elf-objcopy -I elf64-x86-64 -O elf32-i386 $(OBJDIR)/boot/kaleid.x86_64 $(BINDIR)/kaleid @mkdir -p $(BINDIR)/disk
@echo ${CL2}[$@] ${NC}Installing MBR on image...${CL3}
-@$(MBRDIR)/umount.sh $(BINDIR)/disk
@$(MBRDIR)/grub-install.sh $(BINDIR)/disk.img $(BINDIR)/disk $(MBRDIR)/grub.cfg
@tail -1 grub.log | head -1 | grep "Installation terminée, sans erreur."
@rmdir $(BINDIR)/disk
@echo ${CL2}[$@] ${CL}Success.${CL3}
.PHONY: clean
clean: clean:
@rm -Rf $(BINDIR)/* -@$(MBRDIR)/umount.sh $(BINDIR)/disk
@rm -Rf $(OBJDIR)/*/*/*/*.o @rm -Rvf $(BINDIR)/*.*
@rm -Rvf $(OBJDIR)/*.o
@rm -Rvf $(OBJDIR)/*/*.o
@rm -Rvf $(OBJDIR)/*/*/*.o
.PHONY: kal_com
kal_com: $(OBJDIR)/kaleid/atoi.o $(OBJDIR)/kaleid/ctype.o \
$(OBJDIR)/kaleid/itoa.o $(OBJDIR)/kaleid/memory.o \
$(OBJDIR)/kaleid/rand.o $(OBJDIR)/kaleid/sprintf.o \
$(OBJDIR)/kaleid/status.o $(OBJDIR)/kaleid/string.o \
$(OBJDIR)/kaleid/strtol.o $(OBJDIR)/kaleid/argv.o \
$(OBJDIR)/kaleid/prog.o $(OBJDIR)/kaleid/atol.o \
$(OBJDIR)/kaleid/atou.o $(OBJDIR)/kaleid/atoul.o \
$(OBJDIR)/kaleid/utoa.o $(OBJDIR)/kaleid/ltoa.o \
$(OBJDIR)/kaleid/ultoa.o
.PHONY: kal_kern
kal_kern: $(OBJDIR)/kaleid/kernel/cpuid.o $(OBJDIR)/kaleid/kernel/init.o \
$(OBJDIR)/kaleid/kernel/table.o $(OBJDIR)/kaleid/kernel/cursor.o \
$(OBJDIR)/kaleid/kernel/term.o $(OBJDIR)/kaleid/kernel/vga.o \
$(OBJDIR)/kaleid/kernel/panic.o
$(BINDIR)/kaleid: $(OBJDIR)/boot/kaleid.x86_64
@echo ${CL2}[$@] ${NC}Objcopy...${CL3}
@x86_64-elf-objcopy -I elf64-x86-64 -O elf32-i386 $(OBJDIR)/boot/kaleid.x86_64 $(BINDIR)/kaleid
@echo ${CL2}[$@] ${CL}Success.${CL3}
$(OBJDIR)/boot/kaleid.x86_64: $(OBJDIR)/boot/loader.o kal_com kal_kern
@echo ${CL2}[$@] ${NC}Linking kernel objects...${CL3}
@$(LD) $(LDFLAGS) -T build/kernel.ld \
$(OBJDIR)/boot/loader.o \
$(OBJDIR)/kaleid/*.o \
$(OBJDIR)/kaleid/kernel/*.o \
-o $(OBJDIR)/boot/kaleid.x86_64
@echo ${CL2}[$@] ${CL}Success.${CL3}
$(OBJDIR)/boot/loader.o: $(LOADERDIR)/loader.asm
@echo ${CL2}[$@] ${NC}Making loader...${CL3}
@$(ASM) $(ASMFLAGS) $(LOADERDIR)/loader.asm -o $(OBJDIR)/boot/loader.o > /dev/null
@echo ${CL2}[$@] ${CL}Success.${CL3}
$(BINDIR)/disk.img: $(MBRDIR)/create_disk.sh
@echo ${CL2}[$@]${NC} Constructing disk image...${CL3}
-@$(MBRDIR)/umount.sh $(BINDIR)/disk
@$(MBRDIR)/create_disk.sh $(BINDIR)/disk.img
@make install_mbr
@echo ${CL2}[$@]${NC} Constructing disk image...${CL3}
## KALEID MAKEFILE ----------------------------------------------------------- #
# Crtlib objects
$(OBJDIR)/kaleid/atoi.o: $(KERNELDIR)/crtlib/atoi.c
@$(KCC) -D_NEED_ATOI $< -o $@
$(OBJDIR)/kaleid/atol.o: $(KERNELDIR)/crtlib/atoi.c
@$(KCC) -D_NEED_ATOL $< -o $@
$(OBJDIR)/kaleid/atou.o: $(KERNELDIR)/crtlib/atoi.c
@$(KCC) -D_NEED_ATOU $< -o $@
$(OBJDIR)/kaleid/atoul.o: $(KERNELDIR)/crtlib/atoi.c
@$(KCC) -D_NEED_ATOUL $< -o $@
$(OBJDIR)/kaleid/ctype.o: $(KERNELDIR)/crtlib/ctype.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/itoa.o: $(KERNELDIR)/crtlib/itoa.c
@$(KCC) -D_NEED_ITOA $< -o $@
$(OBJDIR)/kaleid/ltoa.o: $(KERNELDIR)/crtlib/itoa.c
@$(KCC) -D_NEED_LTOA $< -o $@
$(OBJDIR)/kaleid/utoa.o: $(KERNELDIR)/crtlib/itoa.c
@$(KCC) -D_NEED_UTOA $< -o $@
$(OBJDIR)/kaleid/ultoa.o: $(KERNELDIR)/crtlib/itoa.c
@$(KCC) -D_NEED_ULTOA $< -o $@
$(OBJDIR)/kaleid/memory.o: $(KERNELDIR)/crtlib/memory.c
@$(KCC) -fno-strict-aliasing $< -o $@
$(OBJDIR)/kaleid/rand.o: $(KERNELDIR)/crtlib/rand.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/sprintf.o: $(KERNELDIR)/crtlib/sprintf.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/status.o: $(KERNELDIR)/crtlib/status.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/string.o: $(KERNELDIR)/crtlib/string.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/strtol.o: $(KERNELDIR)/crtlib/strtol.c
@$(KCC) $< -o $@
# Extra objects
$(OBJDIR)/kaleid/argv.o: $(KERNELDIR)/extras/argv.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/prog.o: $(KERNELDIR)/extras/prog.c
@$(KCC) $< -o $@
# Kernel objects
$(OBJDIR)/kaleid/kernel/cpuid.o: $(KERNELDIR)/kernel/cpu/cpuid.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/kernel/init.o: $(KERNELDIR)/kernel/init/init.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/kernel/table.o: $(KERNELDIR)/kernel/init/table.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/kernel/cursor.o: $(KERNELDIR)/kernel/io/cursor.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/kernel/term.o: $(KERNELDIR)/kernel/io/term.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/kernel/vga.o: $(KERNELDIR)/kernel/io/vga.c
@$(KCC) $< -o $@
$(OBJDIR)/kaleid/kernel/panic.o: $(KERNELDIR)/kernel/ke/panic.c
@$(KCC) $< -o $@

View File

@ -1,104 +0,0 @@
// -*- Mode: Makefile -*-
//----------------------------------------------------------------------------//
// GNU GPL OS/K //
// //
// Desc: Project Makefile //
// //
// //
// Copyright © 2018-2019 The OS/K Team //
// //
// This file is part of OS/K. //
// //
// OS/K is free software: you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation, either version 3 of the License, or //
// any later version. //
// //
// OS/K is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY//without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
//----------------------------------------------------------------------------//
// The madman's Makefile
#include "build/preproc.h"
CCNAME=x86_64-elf-gcc
CC2NAME=gcc
COPTIM=-O2
CWARNS=-Wall -Wextra // -Werror=implicit-function-declaration
CINCLUDES=-Ikaleid/include
CFLAGS1=-nostdlib -ffreestanding -mcmodel=large // -std=gnu11
CFLAGS2=_ASMTYPE -mno-red-zone -mno-mmx -mno-sse -mno-sse2
CFLAGS=$(CFLAGS1) $(CFLAGS2) -DNDEBUG
CC=$(CCNAME) $(COPTIM) $(CWARNS) $(CFLAGS) $(CINCLUDES)
BINDIR=build/bin
OBJDIR=build/obj
BOOTDIR=boot
COMMDIR=kaleid/crtlib
KERNDIR=kaleid/kernel
SYSTDIR=kaleid/system
LINXDIR=kaleid/test
// COMMON MAKEFILE
COBJDIR=$(OBJDIR)/$(COMMDIR)
LOBJDIR=$(OBJDIR)/$(LINXDIR)
COMMOBJS=COBJ6(string, status, rand, memory, strtol, sprintf) COBJ4(itoa, ltoa, utoa, ultoa) COBJ4(atoi, atol, atou, atoul) COBJ3(../extras/prog, ../extras/argv, ctype)
TCC=$(CC2NAME) $(COPTIM) $(CWARNS) $(CINCLUDES)
KCC=$(CC) -D_OSK_SOURCE -D_KALEID_KERNEL
comm-convert:
@COMPILE_CONVRT1(itoa) -D_NEED_ITOA
@COMPILE_CONVRT1(ltoa) -D_NEED_LTOA
@COMPILE_CONVRT1(utoa) -D_NEED_UTOA
@COMPILE_CONVRT1(ultoa) -D_NEED_ULTOA
@COMPILE_CONVRT2(atoi) -D_NEED_ATOI
@COMPILE_CONVRT2(atol) -D_NEED_ATOL
@COMPILE_CONVRT2(atou) -D_NEED_ATOU
@COMPILE_CONVRT2(atoul) -D_NEED_ATOUL
common: comm-convert
@COMPILE_COMMON(rand)
@COMPILE_COMMON(ctype)
@COMPILE_COMMON(string)
@COMPILE_COMMON(status)
@COMPILE_COMMON(memory) -fno-strict-aliasing
@COMPILE_COMMON(strtol)
@COMPILE_COMMON(sprintf)
@COMPILE_COMMON(../extras/prog)
@COMPILE_COMMON(../extras/argv)
tests: common
$(TCC) -c $(LINXDIR)/test-common.c -o $(LOBJDIR)/test-common.o
$(TCC) $(COMMOBJS) $(LOBJDIR)/test-common.o -o $(BINDIR)/comm-test
//----------------------------------------------------------------------------#
// KERNEL MAKEFILE
KOBJDIR=$(OBJDIR)/$(KERNDIR)
KERNOBJS=KOBJ6(init/init, init/table, ke/panic, io/term, io/cursor, io/vga)
kernel: common
@COMPILE_KERNEL(init/init)
@COMPILE_KERNEL(init/table)
@COMPILE_KERNEL(ke/panic)
@COMPILE_KERNEL(io/cursor)
@COMPILE_KERNEL(io/term)
@COMPILE_KERNEL(io/vga)
//LINK_KERNEL(kaleid-kernel.elf)
//----------------------------------------------------------------------------#

View File

@ -1,14 +0,0 @@
# don't mind this file
f1 = open("build/Makefile.out", "r+")
f2 = open("build/Makefile.out.2", "w+")
fl = f1.readlines()
for ln in fl:
if ln[0] == ' ' and ln[1] != ' ':
f2.write('\t')
f2.write(ln)
f1.close()
f2.close()

View File

@ -1,44 +0,0 @@
// be careful with this file
#ifdef _TESTS
# define CCC TCC
#else
# define CCC KCC
#endif
#ifdef _TO_ASM
# define _CSPREF -S
# define _OUTFIX S
# define _ASMTYPE -masm=intel
# define LINK_KERNEL(out)
#else
# define _CSPREF -c
# define _OUTFIX o
# define _ASMTYPE
# define LINK_KERNEL(out) $(KCC) -T ./build/kernel.ld $(CLDSCR) $(COMMOBJS) $(KERNOBJS) -o $(BINDIR)/out
#endif
#define COMPILE_CONVRT1(file) $(CCC) _CSPREF $(COMMDIR)/itoa.c -o $(COBJDIR)/file._OUTFIX
#define COMPILE_CONVRT2(file) $(CCC) _CSPREF $(COMMDIR)/atoi.c -o $(COBJDIR)/file._OUTFIX
#define COMPILE_COMMON(file) $(CCC) _CSPREF $(COMMDIR)/file.c -o $(COBJDIR)/file._OUTFIX
#define COMPILE_KERNEL(file) $(KCC) _CSPREF $(KERNDIR)/file.c -o $(KOBJDIR)/file._OUTFIX
#define COBJ1(x1) $(COBJDIR)/x1.o
#define COBJ2(x1,x2) COBJ1(x1) $(COBJDIR)/x2.o
#define COBJ3(x1,x2,x3) COBJ2(x1,x2) $(COBJDIR)/x3.o
#define COBJ4(x1,x2,x3,x4) COBJ3(x1,x2,x3) $(COBJDIR)/x4.o
#define COBJ5(x1,x2,x3,x4,x5) COBJ4(x1,x2,x3,x4) $(COBJDIR)/x5.o
#define COBJ6(x1,x2,x3,x4,x5,x6) COBJ5(x1,x2,x3,x4,x5) $(COBJDIR)/x6.o
#define COBJ7(x1,x2,x3,x4,x5,x6,x7) COBJ6(x1,x2,x3,x4,x5,x6) $(COBJDIR)/x7.o
#define COBJ8(x1,x2,x3,x4,x5,x6,x7,x8) COBJ7(x1,x2,x3,x4,x5,x6,x7) $(COBJDIR)/x8.o
#define KOBJ1(x1) $(KOBJDIR)/x1.o
#define KOBJ2(x1,x2) KOBJ1(x1) $(KOBJDIR)/x2.o
#define KOBJ3(x1,x2,x3) KOBJ2(x1,x2) $(KOBJDIR)/x3.o
#define KOBJ4(x1,x2,x3,x4) KOBJ3(x1,x2,x3) $(KOBJDIR)/x4.o
#define KOBJ5(x1,x2,x3,x4,x5) KOBJ4(x1,x2,x3,x4) $(KOBJDIR)/x5.o
#define KOBJ6(x1,x2,x3,x4,x5,x6) KOBJ5(x1,x2,x3,x4,x5) $(KOBJDIR)/x6.o
#define KOBJ7(x1,x2,x3,x4,x5,x6,x7) KOBJ6(x1,x2,x3,x4,x5,x6) $(KOBJDIR)/x7.o
#define KOBJ8(x1,x2,x3,x4,x5,x6,x7,x8) KOBJ7(x1,x2,x3,x4,x5,x6,x7) $(KOBJDIR)/x8.o

View File

@ -22,4 +22,4 @@
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. // // along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//
int stub;