chore: sync repo
This commit is contained in:
parent
e2ce2c52d2
commit
ffd7be38f8
18 changed files with 279 additions and 55 deletions
3
Makefile
3
Makefile
|
@ -15,7 +15,10 @@ export ASMDIR = /usr/asm
|
||||||
|
|
||||||
export AS = fasm
|
export AS = fasm
|
||||||
export CC ?= gcc
|
export CC ?= gcc
|
||||||
|
export LD = $(TOOLSDIR)/ld
|
||||||
export RM = rm -f
|
export RM = rm -f
|
||||||
|
export TOOL_CC ?= gcc
|
||||||
|
export TOOL_LD ?= ld
|
||||||
|
|
||||||
export MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\"
|
export MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\"
|
||||||
export MK_COMMIT := \"$(shell git rev-parse --short HEAD)\"
|
export MK_COMMIT := \"$(shell git rev-parse --short HEAD)\"
|
||||||
|
|
5
bin/ar/main.c
Normal file
5
bin/ar/main.c
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
builtins:
|
builtins:
|
||||||
db 2, 'cd'
|
db 2, 'cd'
|
||||||
db 1, '.'
|
db 1, '.'
|
||||||
db 3, 'set'
|
db 3, 'set'
|
||||||
db 5, 'unset'
|
db 5, 'unset'
|
||||||
db 4, 'exit'
|
db 4, 'exit'
|
35
bin/ld/coff.c
Normal file
35
bin/ld/coff.c
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "coff.h"
|
||||||
|
#include "ld.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
coff_output(LDState *state, FILE *fp)
|
||||||
|
{
|
||||||
|
FILHDR file_header;
|
||||||
|
AOUTHDR opt_header;
|
||||||
|
|
||||||
|
file_header.f_magic = F_MACH_I386;
|
||||||
|
file_header.f_timdat = 0;
|
||||||
|
file_header.f_opthdr = AOUTHSZ;
|
||||||
|
file_header.f_flags = F_RELFLG | F_EXEC | F_LNNO | F_LSYMS | F_LITTLE;
|
||||||
|
|
||||||
|
opt_header.magic = ZMAGIC;
|
||||||
|
opt_header.vstamp = 0;
|
||||||
|
|
||||||
|
fwrite(&file_header, FILHSZ, 1, fp);
|
||||||
|
fwrite(&opt_header, AOUTHSZ, 1, fp);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int coff_load(LDState *state, FILE *fp)
|
||||||
|
{
|
||||||
|
FILHDR file_header;
|
||||||
|
AOUTHDR opt_header;
|
||||||
|
|
||||||
|
fread(&file_header, FILHSZ, 1, fp);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
13
bin/ld/ld.h
Normal file
13
bin/ld/ld.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef LD_H
|
||||||
|
# define LD_H
|
||||||
|
|
||||||
|
# include <stdio.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
} LDState;
|
||||||
|
|
||||||
|
int coff_output(LDState *state, FILE *fp);
|
||||||
|
int coff_load(LDState *state, FILE *fp);
|
||||||
|
|
||||||
|
#endif /* !LD_H */
|
|
@ -87,7 +87,5 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
if (argc <= 1) usage(EXIT_FAILURE);
|
if (argc <= 1) usage(EXIT_FAILURE);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return (EXIT_SUCCESS);
|
return (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
/*
|
/*
|
||||||
* File: main.pls
|
* File: main.pls
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Procedure: main
|
* Procedure: main
|
||||||
*
|
*
|
||||||
* Program entry point.
|
* Program entry point.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
PROC main;
|
PROC main;
|
||||||
DCL in AS File;
|
DCL in AS File;
|
||||||
DCL line AS String;
|
DCL line AS String;
|
||||||
DCL now AS DateTime;
|
DCL now AS DateTime;
|
||||||
|
|
||||||
now = [[DateTime allocate] now];
|
now = [[DateTime allocate] now];
|
||||||
IF now == NIL THEN exit(1);
|
IF now == NIL THEN exit(1);
|
||||||
in = [[File allocate] initOpen:"/etc/motd"];
|
in = [[File allocate] initOpen:"/etc/motd"];
|
||||||
IF in == NIL THEN exit(1);
|
IF in == NIL THEN exit(1);
|
||||||
|
|
||||||
WHILE [in readLine:line] != EOF;
|
WHILE [in readLine:line] != EOF;
|
||||||
print(line);
|
print(line);
|
||||||
END;
|
END;
|
||||||
|
|
||||||
[in release];
|
[in release];
|
||||||
[now release];
|
[now release];
|
||||||
END;
|
END;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
_____ _ _ _ _____ _____
|
_____ _ _ _ _____ _____
|
||||||
/ ___| | (_) | | _ / ___|
|
/ ___| | (_) | | _ / ___|
|
||||||
\ `--.| |_ _ _ _ __ _ __| | | | \ `--.
|
\ `--.| |_ _ _ _ __ _ __| | | | \ `--.
|
||||||
`--. \ __| | | | '_ \| |/ _` | | | |`--. \
|
`--. \ __| | | | '_ \| |/ _` | | | |`--. \
|
||||||
/\__/ / |_| |_| | |_) | | (_| \ \_/ /\__/ /
|
/\__/ / |_| |_| | |_) | | (_| \ \_/ /\__/ /
|
||||||
\____/ \__|\__,_| .__/|_|\__,_|\___/\____/
|
\____/ \__|\__,_| .__/|_|\__,_|\___/\____/
|
||||||
| |
|
| |
|
||||||
|_| v$(version)
|
|_| v$(version)
|
||||||
|
|
||||||
$(datetime)
|
$(datetime)
|
||||||
|
|
5
bin/ranlib/main.c
Normal file
5
bin/ranlib/main.c
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -24,9 +24,38 @@ static const struct {
|
||||||
{F_MACH_UNKNOWN, "unknown"}
|
{F_MACH_UNKNOWN, "unknown"}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
int flag;
|
||||||
|
char *str;
|
||||||
|
} FLAGS[] = {
|
||||||
|
{F_RELFLG, "F_RELFLG"},
|
||||||
|
{F_EXEC, "F_EXEC"},
|
||||||
|
{F_LNNO, "F_LNNO"},
|
||||||
|
{F_LSYMS, "F_LSYMS"},
|
||||||
|
{F_LITTLE, "F_LITTLE"},
|
||||||
|
{F_BIG, "F_BIG"},
|
||||||
|
{F_SYMMERGE, "F_SYMMERGE"},
|
||||||
|
|
||||||
|
{0, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
int16_t mag;
|
||||||
|
char *str;
|
||||||
|
} AOUTMAG[] = {
|
||||||
|
{OMAGIC, "OMAGIC"},
|
||||||
|
{NMAGIC, "NMAGIC"},
|
||||||
|
{ZMAGIC, "ZMAGIC"},
|
||||||
|
{STMAGIC, "STMAGIC"},
|
||||||
|
{SHMAGIC, "SHMAGIC"},
|
||||||
|
|
||||||
|
{0, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static const char *prg_name;
|
static const char *prg_name;
|
||||||
static const char *mach = NULL;
|
static const char *mach = NULL;
|
||||||
|
static const char *aoutmag = NULL;
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static int display_header = 0;
|
static int display_header = 0;
|
||||||
|
@ -138,7 +167,15 @@ main(int argc, char **argv)
|
||||||
printf(" Start of Symbol Table: %d (bytes into file)\n", file_header.f_symptr);
|
printf(" Start of Symbol Table: %d (bytes into file)\n", file_header.f_symptr);
|
||||||
printf(" Number of Symbols: %d\n", file_header.f_nsyms);
|
printf(" Number of Symbols: %d\n", file_header.f_nsyms);
|
||||||
printf(" Size of optional header: %hu\n", file_header.f_opthdr);
|
printf(" Size of optional header: %hu\n", file_header.f_opthdr);
|
||||||
printf(" Flags: 0x%hx\n\n", file_header.f_flags);
|
printf(" Flags: ");
|
||||||
|
for (idx = 0; FLAGS[idx].str != NULL; idx++)
|
||||||
|
{
|
||||||
|
if (file_header.f_flags & FLAGS[idx].flag)
|
||||||
|
{
|
||||||
|
printf("%s ", FLAGS[idx].str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (display_optional_header)
|
if (display_optional_header)
|
||||||
|
@ -146,8 +183,16 @@ main(int argc, char **argv)
|
||||||
if (file_header.f_opthdr)
|
if (file_header.f_opthdr)
|
||||||
{
|
{
|
||||||
fread(&aout_header, 1, AOUTHSZ, fp);
|
fread(&aout_header, 1, AOUTHSZ, fp);
|
||||||
|
for (idx = 0; AOUTMAG[idx].str != NULL; idx++)
|
||||||
|
{
|
||||||
|
if (aout_header.magic == AOUTMAG[idx].mag)
|
||||||
|
{
|
||||||
|
aoutmag = AOUTMAG[idx].str;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
printf("A.out header\n");
|
printf("A.out header\n");
|
||||||
printf(" Magic: %hx\n", aout_header.magic);
|
printf(" Magic: %s\n", aoutmag);
|
||||||
printf(" Entry: 0x%08X\n", aout_header.entry);
|
printf(" Entry: 0x%08X\n", aout_header.entry);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,30 @@ efi_memory_init:
|
||||||
mov ecx, [eax + EFI_BOOT_SERVICES.GetMemoryMap]
|
mov ecx, [eax + EFI_BOOT_SERVICES.GetMemoryMap]
|
||||||
mov [fnGetMemoryMap], ecx
|
mov [fnGetMemoryMap], ecx
|
||||||
|
|
||||||
|
call efi_get_memory_map
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
efi_get_memory_map:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
sub esp, 4
|
||||||
|
|
||||||
|
lea eax, [ebp - 4]
|
||||||
|
EFI_CALL [fnGetMemoryMap], uMemMapSize, 0, eax, uDescSize, uDescVer
|
||||||
|
|
||||||
|
add dword [uMemMapSize], 4096
|
||||||
|
|
||||||
|
EFI_CALL [fnAllocatePool], EFI_LOADER_DATA, [uMemMapSize], pMemMap
|
||||||
|
|
||||||
|
LOG szRes2, eax
|
||||||
|
|
||||||
|
EFI_CALL [fnGetMemoryMap], uMemMapSize, [pMemMap], eax, uDescSize, uDescVer
|
||||||
|
|
||||||
|
LOG szRes, eax
|
||||||
|
|
||||||
|
leave
|
||||||
ret
|
ret
|
||||||
|
|
||||||
section '.data' data readable writeable
|
section '.data' data readable writeable
|
||||||
|
@ -23,3 +47,11 @@ fnAllocatePool dd ?
|
||||||
fnFreePool dd ?
|
fnFreePool dd ?
|
||||||
;; Variable: fnGetMemoryMap
|
;; Variable: fnGetMemoryMap
|
||||||
fnGetMemoryMap dd ?
|
fnGetMemoryMap dd ?
|
||||||
|
|
||||||
|
uMemMapSize dd 0
|
||||||
|
uDescSize dd 0
|
||||||
|
uDescVer dd 0
|
||||||
|
pMemMap dd 0
|
||||||
|
|
||||||
|
szRes du "Result: %x", 0
|
||||||
|
szRes2 du "Result: %x", 0
|
||||||
|
|
|
@ -287,6 +287,24 @@ struc EFI_BOOT_SERVICES
|
||||||
}
|
}
|
||||||
DEFN EFI_BOOT_SERVICES
|
DEFN EFI_BOOT_SERVICES
|
||||||
|
|
||||||
|
EFI_RESERVED_MEMORY_TYPE = 0
|
||||||
|
EFI_LOADER_CODE = 1
|
||||||
|
EFI_LOADER_DATA = 2
|
||||||
|
EFI_BOOT_SERVICES_CODE = 3
|
||||||
|
EFI_BOOT_SERVICES_DATA = 4
|
||||||
|
EFI_RUNTIME_SERVICES_CODE = 5
|
||||||
|
EFI_RUNTIME_SERVICES_DATA = 6
|
||||||
|
EFI_CONVENTIONAL_MEMORY = 7
|
||||||
|
EFI_UNUSABLE_MEMORY = 8
|
||||||
|
EFI_ACPI_RECLAIM_MEMORY = 9
|
||||||
|
EFI_ACPI_MEMORY_NVS = 10
|
||||||
|
EFI_MEMORY_MAPPED_IO = 11
|
||||||
|
EFI_MEMORY_MAPPED_IO_PORT_SPACE = 12
|
||||||
|
EFI_PAL_CODE = 13
|
||||||
|
EFI_PERSISTENT_MEMORY = 14
|
||||||
|
EFI_UNACCEPTED_MEMORY_TYPE = 15
|
||||||
|
EFI_MAX_MEMORY_TYPE = 16
|
||||||
|
|
||||||
EFI_LOCATE_SEARCH_ALL_HANDLES = 0x0
|
EFI_LOCATE_SEARCH_ALL_HANDLES = 0x0
|
||||||
EFI_LOCATE_SEARCH_BY_REGISTER_NOTIFY = 0x1
|
EFI_LOCATE_SEARCH_BY_REGISTER_NOTIFY = 0x1
|
||||||
EFI_LOCATE_SEARCH_BY_PROTOCOL = 0x2
|
EFI_LOCATE_SEARCH_BY_PROTOCOL = 0x2
|
||||||
|
@ -298,6 +316,30 @@ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER = 0x00000008
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER = 0x00000010
|
EFI_OPEN_PROTOCOL_BY_DRIVER = 0x00000010
|
||||||
EFI_OPEN_PROTOCOL_EXCLUSIVE = 0x00000020
|
EFI_OPEN_PROTOCOL_EXCLUSIVE = 0x00000020
|
||||||
|
|
||||||
|
struc EFI_MEMORY_DESCRIPTOR {
|
||||||
|
.type UINT32
|
||||||
|
.physical_start UINT64
|
||||||
|
.virtual_start UINT64
|
||||||
|
.number_of_pages UINT64
|
||||||
|
.attribute UINT64
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_MEMORY_DESCRIPTOR_VERSION = 1
|
||||||
|
|
||||||
|
EFI_MEMORY_UC = 0x0000000000000001
|
||||||
|
EFI_MEMORY_WC = 0x0000000000000002
|
||||||
|
EFI_MEMORY_WT = 0x0000000000000004
|
||||||
|
EFI_MEMORY_WB = 0x0000000000000008
|
||||||
|
EFI_MEMORY_UCE = 0x0000000000000010
|
||||||
|
EFI_MEMORY_WP = 0x0000000000001000
|
||||||
|
EFI_MEMORY_RP = 0x0000000000002000
|
||||||
|
EFI_MEMORY_XP = 0x0000000000004000
|
||||||
|
EFI_MEMORY_NV = 0x0000000000008000
|
||||||
|
EFI_MEMORY_MORE_RELIABLE = 0x0000000000010000
|
||||||
|
EFI_MEMORY_RO = 0x0000000000020000
|
||||||
|
EFI_MEMORY_SP = 0x0000000000040000
|
||||||
|
EFI_MEMORY_CPU_CRYPTO = 0x0000000000080000
|
||||||
|
EFI_MEMORY_RUNTIME = 0x8000000000000000
|
||||||
;; ========================================================================
|
;; ========================================================================
|
||||||
;; EFI_RUNTIMES_SERVICES
|
;; EFI_RUNTIMES_SERVICES
|
||||||
;; ========================================================================
|
;; ========================================================================
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
SYSINCS = errno.h
|
SYSINCS = errno.h
|
||||||
INCS = coff.h elf.h $(addprefix sys/, $(SYSINCS))
|
INCS = coff.h elf.h ar.h ranlib.h $(addprefix sys/, $(SYSINCS))
|
||||||
|
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
26
include/ar.h
Normal file
26
include/ar.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef AR_H
|
||||||
|
# define AR_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
# define ARMAG "!<arch>\n"
|
||||||
|
# define SARMAG 8
|
||||||
|
|
||||||
|
# define ARFMAG "`\n"
|
||||||
|
|
||||||
|
# define AR_SYMTAB_NAME "__.SYMDEF"
|
||||||
|
|
||||||
|
typedef struct arhdr {
|
||||||
|
uint8_t ar_name[16];
|
||||||
|
uint8_t ar_date[12];
|
||||||
|
uint8_t ar_uid[6];
|
||||||
|
uint8_t ar_gid[6];
|
||||||
|
uint8_t ar_mode[8];
|
||||||
|
uint8_t ar_size[10];
|
||||||
|
uint8_t ar_fmag[2];
|
||||||
|
} AR_HDR;
|
||||||
|
|
||||||
|
# define SAR_HDR 60
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !AR_H */
|
|
@ -64,6 +64,7 @@ typedef struct aouthdr
|
||||||
# define AOUTHSZ sizeof(AOUTHDR)
|
# define AOUTHSZ sizeof(AOUTHDR)
|
||||||
|
|
||||||
# define OMAGIC 0404
|
# define OMAGIC 0404
|
||||||
|
# define NMAGIC 0410
|
||||||
# define ZMAGIC 0413
|
# define ZMAGIC 0413
|
||||||
# define STMAGIC 0401
|
# define STMAGIC 0401
|
||||||
# define SHMAGIC 0443
|
# define SHMAGIC 0443
|
||||||
|
|
11
include/ranlib.h
Normal file
11
include/ranlib.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef RANLIB_H
|
||||||
|
# define RANLIB_H 1
|
||||||
|
|
||||||
|
# define SYNTAB "__.SYMDEF"
|
||||||
|
|
||||||
|
struct ranlib {
|
||||||
|
int ran_strx;
|
||||||
|
int ran_off;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* !RANLIB_H */
|
|
@ -13,6 +13,8 @@
|
||||||
|
|
||||||
jmp short kmain
|
jmp short kmain
|
||||||
|
|
||||||
|
;; XXX: kernel header
|
||||||
|
|
||||||
;; Function: kmain
|
;; Function: kmain
|
||||||
;; Kernel entry point
|
;; Kernel entry point
|
||||||
;;
|
;;
|
||||||
|
@ -132,7 +134,6 @@ kmain:
|
||||||
szMsgKernelAlive db "Kernel (", VERSION_FULL , ") is alive", 0
|
szMsgKernelAlive db "Kernel (", VERSION_FULL , ") is alive", 0
|
||||||
szMsgBuildDate db "Built ", BUILD_DATE, 0
|
szMsgBuildDate db "Built ", BUILD_DATE, 0
|
||||||
szErrorBootProtocol db "Error: wrong magic number", 0
|
szErrorBootProtocol db "Error: wrong magic number", 0
|
||||||
szKernelHeapStr db "KERNEL-HEAP", 0
|
|
||||||
;; Variable: stBootInfo
|
;; Variable: stBootInfo
|
||||||
;; <BootInfo>
|
;; <BootInfo>
|
||||||
stBootInfo BootInfo
|
stBootInfo BootInfo
|
||||||
|
|
|
@ -1,22 +1,29 @@
|
||||||
TARGET = coff-ld$(EXEXT) parted$(EXEXT) readcoff$(EXEXT) elf2coff$(EXEXT)
|
TARGET = ld$(EXEXT) parted$(EXEXT) readcoff$(EXEXT) elf2coff$(EXEXT) ar$(EXEXT) ranlib$(EXEXT)
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: $(TARGET)
|
all: $(TARGET)
|
||||||
|
|
||||||
coff-ld$(EXEXT): ../bin/ld/main.c
|
ld$(EXEXT): ../bin/ld/main.c
|
||||||
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
$(TOOL_CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
readcoff$(EXEXT): ../bin/readcoff/main.c
|
readcoff$(EXEXT): ../bin/readcoff/main.c
|
||||||
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
$(TOOL_CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
elf2coff$(EXEXT): ../bin/elf2coff/main.c
|
elf2coff$(EXEXT): ../bin/elf2coff/main.c
|
||||||
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
$(TOOL_CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
parted$(EXEXT): ../sbin/parted/main.c
|
parted$(EXEXT): ../sbin/parted/main.c
|
||||||
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
$(TOOL_CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
|
ranlib$(EXEXT): ../bin/ranlib/main.c
|
||||||
|
$(TOOL_CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
|
ar$(EXEXT): ../bin/ar/main.c
|
||||||
|
$(TOOL_CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
.PHONY: install
|
.PHONY: install
|
||||||
install: $(TARGET)
|
install: $(TARGET)
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
|
$(RM) $(TARGET)
|
||||||
|
|
Loading…
Reference in a new issue