chore: display kernel version
This commit is contained in:
parent
bd7468e69c
commit
cfeeea957c
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -35,3 +35,4 @@ bochsrc.bxrc
|
||||||
*.mod
|
*.mod
|
||||||
webring.json
|
webring.json
|
||||||
webring.txt
|
webring.txt
|
||||||
|
kernel/const.inc
|
||||||
|
|
|
@ -17,6 +17,10 @@ SRCS = kernel.asm \
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: $(KERNEL)
|
all: $(KERNEL)
|
||||||
|
|
||||||
|
PHONY: const.inc
|
||||||
|
const.inc: const.inc.in
|
||||||
|
sh $(TOOLSDIR)/version.sh $< $@
|
||||||
|
|
||||||
$(KERNEL): $(SRCS)
|
$(KERNEL): $(SRCS)
|
||||||
$(AS) kernel.asm $@
|
$(AS) kernel.asm $@
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,11 @@ PSIZE = 0x1000
|
||||||
STPDBOOT_MAGIC = 0x53545044
|
STPDBOOT_MAGIC = 0x53545044
|
||||||
|
|
||||||
; --------- VERSION -------------
|
; --------- VERSION -------------
|
||||||
VERSION_MAJOR = 1
|
VERSION_MAJOR = @MAJOR@
|
||||||
VERSION_MINOR = 0
|
VERSION_MINOR = @MINOR@
|
||||||
VERSION_COMMIT = "@COMMIT@"
|
VERSION_COMMIT equ "@COMMIT@"
|
||||||
|
VERSION_FULL equ "@FULLVERSION@"
|
||||||
|
BUILD_DATE equ "@DATE@"
|
||||||
|
|
||||||
; ------------- OTHER -----------
|
; ------------- OTHER -----------
|
||||||
CR = 0x0D
|
CR = 0x0D
|
|
@ -16,7 +16,10 @@ vga_console_clear:
|
||||||
rep stosb
|
rep stosb
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;; Function: vga_console_putc
|
||||||
|
;;
|
||||||
|
;; In:
|
||||||
|
;; AL - charactere to print
|
||||||
vga_console_putc:
|
vga_console_putc:
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
irq_timer:
|
|
||||||
iret
|
|
||||||
|
|
|
@ -1,9 +1,15 @@
|
||||||
|
;; File: isr.inc
|
||||||
macro ISR [name,error] {
|
macro ISR [name,error] {
|
||||||
forward
|
forward
|
||||||
dd isr_#name
|
dd isr_#name
|
||||||
|
forward
|
||||||
|
local szIntName
|
||||||
|
szIntName db `name#, 0
|
||||||
forward
|
forward
|
||||||
isr_#name#:
|
isr_#name#:
|
||||||
cli
|
cli
|
||||||
|
mov esi, szIntName
|
||||||
|
call klog
|
||||||
if error eq 0
|
if error eq 0
|
||||||
push 0
|
push 0
|
||||||
end if
|
end if
|
||||||
|
@ -25,6 +31,17 @@ idt_setup:
|
||||||
inc ecx
|
inc ecx
|
||||||
cmp ecx, 32
|
cmp ecx, 32
|
||||||
jb @b
|
jb @b
|
||||||
|
@@:
|
||||||
|
mov eax, irq_dummy
|
||||||
|
mov [aInterruptGate + (ecx * 8)], ax
|
||||||
|
mov [aInterruptGate + (ecx * 8) + 2], word 0x08
|
||||||
|
|
||||||
|
mov [aInterruptGate + (ecx * 8) + 5], word 0x8E
|
||||||
|
shr eax, 16
|
||||||
|
mov [aInterruptGate + (ecx * 8) + 6], ax
|
||||||
|
inc ecx
|
||||||
|
cmp ecx, 0x30
|
||||||
|
jb @b
|
||||||
|
|
||||||
mov ecx, 0x42
|
mov ecx, 0x42
|
||||||
mov eax, isr_syscall
|
mov eax, isr_syscall
|
||||||
|
@ -49,6 +66,9 @@ aInterruptGate:
|
||||||
.end:
|
.end:
|
||||||
|
|
||||||
|
|
||||||
|
irq_dummy:
|
||||||
|
iret
|
||||||
|
|
||||||
isr_common:
|
isr_common:
|
||||||
pusha
|
pusha
|
||||||
|
|
||||||
|
@ -61,6 +81,9 @@ isr_common:
|
||||||
mov fs, ax
|
mov fs, ax
|
||||||
mov gs, ax
|
mov gs, ax
|
||||||
|
|
||||||
|
mov eax, [esp+IntFrame.intno]
|
||||||
|
push eax
|
||||||
|
|
||||||
mov esi, szMsgInterrupt
|
mov esi, szMsgInterrupt
|
||||||
call klog
|
call klog
|
||||||
|
|
||||||
|
@ -110,4 +133,4 @@ ISR \
|
||||||
security_exception, 0, \
|
security_exception, 0, \
|
||||||
reserved31, 0
|
reserved31, 0
|
||||||
|
|
||||||
szMsgInterrupt db "Interrupt", 0
|
szMsgInterrupt db "Interrupt (int: %x)", 0
|
||||||
|
|
|
@ -63,7 +63,7 @@ kmain:
|
||||||
|
|
||||||
call idt_setup
|
call idt_setup
|
||||||
|
|
||||||
int 0x42
|
;int 0x42
|
||||||
|
|
||||||
.halt:
|
.halt:
|
||||||
hlt
|
hlt
|
||||||
|
@ -84,7 +84,7 @@ kmain:
|
||||||
include 'pic.inc'
|
include 'pic.inc'
|
||||||
|
|
||||||
|
|
||||||
szMsgKernelAlive db "Kernel is alive", 0
|
szMsgKernelAlive db "Kernel (", VERSION_FULL , ") is alive", 0
|
||||||
szErrorBootProtocol db "Error: wrong magic number", 0
|
szErrorBootProtocol db "Error: wrong magic number", 0
|
||||||
|
|
||||||
boot_structure BootInfo
|
boot_structure BootInfo
|
||||||
|
|
|
@ -50,6 +50,20 @@ pic_init:
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;; Function: pic_eoi
|
||||||
|
;;
|
||||||
|
;; In:
|
||||||
|
;; EAX - irq
|
||||||
|
pic_eoi:
|
||||||
|
cmp eax, 8
|
||||||
|
jb @f
|
||||||
|
mov al, PIC_EOI
|
||||||
|
out PIC2_COMMAND, al
|
||||||
|
@@:
|
||||||
|
mov al, PIC_EOI
|
||||||
|
out PIC1_COMMAND, al
|
||||||
|
ret
|
||||||
|
|
||||||
pic_disable:
|
pic_disable:
|
||||||
mov al, 0xFF
|
mov al, 0xFF
|
||||||
out PIC1_DATA, al
|
out PIC1_DATA, al
|
||||||
|
|
|
@ -133,7 +133,7 @@ struc IDTGate {
|
||||||
;; > +--------------- |----------------+-----------------|-----------------+
|
;; > +--------------- |----------------+-----------------|-----------------+
|
||||||
|
|
||||||
|
|
||||||
struc intframe {
|
struc IntFrame {
|
||||||
;; registers
|
;; registers
|
||||||
.edi dd ?
|
.edi dd ?
|
||||||
.esi dd ?
|
.esi dd ?
|
||||||
|
@ -161,3 +161,7 @@ struc intframe {
|
||||||
.useresp dd ?
|
.useresp dd ?
|
||||||
.ss dd ?
|
.ss dd ?
|
||||||
}
|
}
|
||||||
|
virtual at 0
|
||||||
|
IntFrame IntFrame
|
||||||
|
sizeof.IntFrame:
|
||||||
|
end virtual
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
SYSCALL_EXIT = 0x01
|
SYSCALL_EXIT = 0x01
|
||||||
SYSCALL_FORK = 0x02
|
SYSCALL_FORK = 0x02
|
||||||
|
SYSCALL_READ = 0x03
|
||||||
|
SYSCALL_WRITE = 0x04
|
||||||
|
|
||||||
isr_syscall:
|
isr_syscall:
|
||||||
push eax
|
push eax
|
||||||
|
|
452
tools/fat.c
452
tools/fat.c
|
@ -1,226 +1,226 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t jmp[3];
|
uint8_t jmp[3];
|
||||||
uint8_t OEM[8];
|
uint8_t OEM[8];
|
||||||
uint16_t bytes_per_sector;
|
uint16_t bytes_per_sector;
|
||||||
uint8_t sectors_per_cluster;
|
uint8_t sectors_per_cluster;
|
||||||
uint16_t reserved_sectors;
|
uint16_t reserved_sectors;
|
||||||
uint8_t number_of_FATs;
|
uint8_t number_of_FATs;
|
||||||
uint16_t root_entries;
|
uint16_t root_entries;
|
||||||
uint16_t logical_sectors;
|
uint16_t logical_sectors;
|
||||||
uint8_t media_descriptor;
|
uint8_t media_descriptor;
|
||||||
uint16_t sectors_per_FAT;
|
uint16_t sectors_per_FAT;
|
||||||
uint16_t sectors_per_track;
|
uint16_t sectors_per_track;
|
||||||
uint16_t heads_per_cylinder;
|
uint16_t heads_per_cylinder;
|
||||||
uint32_t hidden_sectors;
|
uint32_t hidden_sectors;
|
||||||
uint32_t total_sectors;
|
uint32_t total_sectors;
|
||||||
|
|
||||||
/* EBPB */
|
/* EBPB */
|
||||||
uint8_t drive_number;
|
uint8_t drive_number;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
uint8_t signature;
|
uint8_t signature;
|
||||||
uint32_t serial;
|
uint32_t serial;
|
||||||
uint8_t label[11];
|
uint8_t label[11];
|
||||||
uint8_t fs_type[8];
|
uint8_t fs_type[8];
|
||||||
} __attribute__((packed)) BiosParamBlock;
|
} __attribute__((packed)) BiosParamBlock;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t name[8];
|
uint8_t name[8];
|
||||||
uint8_t ext[3];
|
uint8_t ext[3];
|
||||||
uint8_t attr;
|
uint8_t attr;
|
||||||
uint16_t reserved0;
|
uint16_t reserved0;
|
||||||
uint16_t creation_time;
|
uint16_t creation_time;
|
||||||
uint16_t creation_date;
|
uint16_t creation_date;
|
||||||
uint16_t access_date;
|
uint16_t access_date;
|
||||||
uint16_t reserved1;
|
uint16_t reserved1;
|
||||||
uint16_t mod_time;
|
uint16_t mod_time;
|
||||||
uint16_t mod_date;
|
uint16_t mod_date;
|
||||||
uint16_t start;
|
uint16_t start;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
} __attribute__((packed)) Entry;
|
} __attribute__((packed)) Entry;
|
||||||
|
|
||||||
static const char *prg_name;
|
static const char *prg_name;
|
||||||
static int sector_size = 512;
|
static int sector_size = 512;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fatal(const char *str, ...)
|
fatal(const char *str, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
fprintf(stderr, "%s: ", prg_name);
|
fprintf(stderr, "%s: ", prg_name);
|
||||||
va_start(ap, str);
|
va_start(ap, str);
|
||||||
vfprintf(stderr, str, ap);
|
vfprintf(stderr, str, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
read_sector(uint8_t *dest, int sect, FILE *fp)
|
read_sector(uint8_t *dest, int sect, FILE *fp)
|
||||||
{
|
{
|
||||||
if (fseek(fp, sect*sector_size, SEEK_SET) != 0) goto fatal_sect;
|
if (fseek(fp, sect*sector_size, SEEK_SET) != 0) goto fatal_sect;
|
||||||
if (fread(dest, 1, sector_size, fp) != sector_size) goto fatal_sect;
|
if (fread(dest, 1, sector_size, fp) != sector_size) goto fatal_sect;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fatal_sect:
|
fatal_sect:
|
||||||
fatal("Can't read sector %d", sect);
|
fatal("Can't read sector %d", sect);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dump_bpb(BiosParamBlock *bpb)
|
dump_bpb(BiosParamBlock *bpb)
|
||||||
{
|
{
|
||||||
char label[12];
|
char label[12];
|
||||||
|
|
||||||
printf("Bytes per logical sector: %hd\n", bpb->bytes_per_sector);
|
printf("Bytes per logical sector: %hd\n", bpb->bytes_per_sector);
|
||||||
sector_size = bpb->bytes_per_sector;
|
sector_size = bpb->bytes_per_sector;
|
||||||
printf("Logical sectors per cluster: %d\n", bpb->sectors_per_cluster);
|
printf("Logical sectors per cluster: %d\n", bpb->sectors_per_cluster);
|
||||||
printf("Reserved logical sectors: %hd\n", bpb->reserved_sectors);
|
printf("Reserved logical sectors: %hd\n", bpb->reserved_sectors);
|
||||||
printf("Number of FATs: %d\n", bpb->number_of_FATs);
|
printf("Number of FATs: %d\n", bpb->number_of_FATs);
|
||||||
printf("Root directory entries: %hd\n", bpb->root_entries);
|
printf("Root directory entries: %hd\n", bpb->root_entries);
|
||||||
printf("Total logical sectors: %hd\n", bpb->logical_sectors);
|
printf("Total logical sectors: %hd\n", bpb->logical_sectors);
|
||||||
printf("Logical sectors per FAT: %hd\n", bpb->sectors_per_FAT);
|
printf("Logical sectors per FAT: %hd\n", bpb->sectors_per_FAT);
|
||||||
printf("Serial: %X\n", bpb->serial);
|
printf("Serial: %X\n", bpb->serial);
|
||||||
memset(label, 0, 12);
|
memset(label, 0, 12);
|
||||||
strncpy(label, bpb->label, 11);
|
strncpy(label, bpb->label, 11);
|
||||||
printf("Label: '%s'\n", label);
|
printf("Label: '%s'\n", label);
|
||||||
printf("signature: %X\n", bpb->signature);
|
printf("signature: %X\n", bpb->signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dump_entry(Entry *entry)
|
dump_entry(Entry *entry)
|
||||||
{
|
{
|
||||||
char filename[9];
|
char filename[9];
|
||||||
char ext[4];
|
char ext[4];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (entry->name[0] == 0x0) return;
|
if (entry->name[0] == 0x0) return;
|
||||||
|
|
||||||
memset(filename, 0, 9);
|
memset(filename, 0, 9);
|
||||||
strncpy(filename, entry->name, 8);
|
strncpy(filename, entry->name, 8);
|
||||||
memset(ext, 0, 4);
|
memset(ext, 0, 4);
|
||||||
strncpy(ext, entry->ext, 3);
|
strncpy(ext, entry->ext, 3);
|
||||||
for (i = 7; i > 0; i--)
|
for (i = 7; i > 0; i--)
|
||||||
{
|
{
|
||||||
if (filename[i] == ' ')
|
if (filename[i] == ' ')
|
||||||
{
|
{
|
||||||
filename[i] = '\0';
|
filename[i] = '\0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%s.%s\n", filename, ext);
|
printf("%s.%s\n", filename, ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dump(const char *img)
|
dump(const char *img)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
BiosParamBlock *bpb;
|
BiosParamBlock *bpb;
|
||||||
uint8_t buffer[512];
|
uint8_t buffer[512];
|
||||||
int root_start;
|
int root_start;
|
||||||
int root_size;
|
int root_size;
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
fp = fopen(img, "rb");
|
fp = fopen(img, "rb");
|
||||||
if (fp == NULL) fatal("Can't open '%s': %s", img, strerror(errno));
|
if (fp == NULL) fatal("Can't open '%s': %s", img, strerror(errno));
|
||||||
|
|
||||||
read_sector(buffer, 0, fp);
|
read_sector(buffer, 0, fp);
|
||||||
if (buffer[511] != 0xAA || buffer[510] != 0x55)
|
if (buffer[511] != 0xAA || buffer[510] != 0x55)
|
||||||
{
|
{
|
||||||
fatal("MBR not found");
|
fatal("MBR not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
bpb = (BiosParamBlock *)buffer;
|
bpb = (BiosParamBlock *)buffer;
|
||||||
|
|
||||||
dump_bpb(bpb);
|
dump_bpb(bpb);
|
||||||
|
|
||||||
root_start = bpb->sectors_per_FAT * bpb->number_of_FATs;
|
root_start = bpb->sectors_per_FAT * bpb->number_of_FATs;
|
||||||
root_start += bpb->reserved_sectors;
|
root_start += bpb->reserved_sectors;
|
||||||
|
|
||||||
root_size = bpb->root_entries / (sector_size >> 0x5);
|
root_size = bpb->root_entries / (sector_size >> 0x5);
|
||||||
|
|
||||||
for (i = 0; i < root_size; i++)
|
for (i = 0; i < root_size; i++)
|
||||||
{
|
{
|
||||||
read_sector(buffer, root_start + i, fp);
|
read_sector(buffer, root_start + i, fp);
|
||||||
for (j = 0; j < sector_size; j+=32)
|
for (j = 0; j < sector_size; j+=32)
|
||||||
{
|
{
|
||||||
dump_entry((Entry *)(buffer + j));
|
dump_entry((Entry *)(buffer + j));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage(int retcode)
|
usage(int retcode)
|
||||||
{
|
{
|
||||||
if (retcode == EXIT_FAILURE)
|
if (retcode == EXIT_FAILURE)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Try '%s -h' form more information.\n", prg_name);
|
fprintf(stderr, "Try '%s -h' form more information.\n", prg_name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("Usage: %s [-hV] [-D IMG] [-b BIN]\n", prg_name);
|
printf("Usage: %s [-hV] [-D IMG] [-b BIN]\n", prg_name);
|
||||||
printf("\t-h\tdisplay this help and exit\n");
|
printf("\t-h\tdisplay this help and exit\n");
|
||||||
printf("\t-V\toutput version information\n");
|
printf("\t-V\toutput version information\n");
|
||||||
printf("\t-D IMG\tdump fs information from IMG\n");
|
printf("\t-D IMG\tdump fs information from IMG\n");
|
||||||
|
|
||||||
printf("\nReport bugs to <%s>\n", MK_BUGREPORT);
|
printf("\nReport bugs to <%s>\n", MK_BUGREPORT);
|
||||||
}
|
}
|
||||||
exit(retcode);
|
exit(retcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
version(void)
|
version(void)
|
||||||
{
|
{
|
||||||
printf("%s commit %s\n", prg_name, MK_COMMIT);
|
printf("%s commit %s\n", prg_name, MK_COMMIT);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
prg_name = argv[0];
|
prg_name = argv[0];
|
||||||
|
|
||||||
while ((argc > 1) && (argv[1][0] == '-'))
|
while ((argc > 1) && (argv[1][0] == '-'))
|
||||||
{
|
{
|
||||||
switch (argv[1][1])
|
switch (argv[1][1])
|
||||||
{
|
{
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(EXIT_SUCCESS);
|
usage(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
version();
|
version();
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
argv++;
|
argv++;
|
||||||
argc--;
|
argc--;
|
||||||
if (argc <= 1) usage(EXIT_FAILURE);
|
if (argc <= 1) usage(EXIT_FAILURE);
|
||||||
dump(argv[1]);
|
dump(argv[1]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage(EXIT_FAILURE);
|
usage(EXIT_FAILURE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
argv++;
|
argv++;
|
||||||
argc--;
|
argc--;
|
||||||
}
|
}
|
||||||
return (EXIT_SUCCESS);
|
return (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
10
tools/git-version → tools/version.sh
Executable file → Normal file
10
tools/git-version → tools/version.sh
Executable file → Normal file
|
@ -6,6 +6,9 @@ if [ ! -n "$vers" ]; then
|
||||||
vers="0.0"
|
vers="0.0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
major="$(echo -n "${vers}" | cut -d. -f1)"
|
||||||
|
minor="$(echo -n "${vers}" | cut -d. -f1)"
|
||||||
|
|
||||||
commit="$(git rev-parse --short HEAD)"
|
commit="$(git rev-parse --short HEAD)"
|
||||||
|
|
||||||
full_vers="${vers}-${commit}"
|
full_vers="${vers}-${commit}"
|
||||||
|
@ -13,4 +16,9 @@ if [ -n "$(git status)" ]; then
|
||||||
full_vers="${full_vers}-dirty"
|
full_vers="${full_vers}-dirty"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -n "${full_vers}"
|
sed -e "s/@MAJOR@/${major}/g" \
|
||||||
|
-e "s/@MINOR@/${minor}/g" \
|
||||||
|
-e "s/@COMMIT@/${commit}/g"\
|
||||||
|
-e "s/@FULLVERSION@/${full_vers}/g" \
|
||||||
|
-e "s/@DATE@/$(date)/g" \
|
||||||
|
"$1" > "$2"
|
Loading…
Reference in a new issue