# SPDX-License-Identifier: GPL-2.0

obj-$(CONFIG_CTSEC_FS) += ctsecfs.o

ctsecfs-y := dir.o  extent.o  file.o  fs.o  inode.o  sb.o sysfs.o hash_extent.o readpage.o

ctsecfs-$(CONFIG_CTSEC_FS_DATA_PROTECT) += policy.o
ctsecfs-$(CONFIG_CTSEC_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o
ctsecfs-$(CONFIG_CTSEC_FS_POSIX_ACL) += acl.o
ctsecfs-$(CONFIG_CTSEC_FS_SECURITY)	 += xattr_security.o

# Compiler and Linker
CC := $(CROSS_COMPILE)gcc
LOCAL_CFLAGS := -Wall -Wextra -std=gnu99

# Path to utilities
UTILITY_DIR := utility
BINARIES := block_hacker inspector fsync

# Utility program targets
$(UTILITY_DIR)/%: $(UTILITY_DIR)/%.c
	$(CC) $(LOCAL_CFLAGS) -o $@ $<

POLICY_GEN = utility/policy_gen
$(POLICY_GEN): utility/policy_gen.c
	$(CC) $(LOCAL_CFLAGS) -lssl -lcrypto -o $@ $<

# Testcase sources
TEST_DIR := testcases/c
TEST_SOURCES := $(wildcard $(TEST_DIR)/*.c)
TEST_OBJECTS := $(TEST_SOURCES:.c=.o)
TEST_EXECUTABLE := fs_tests

MKFS = utility/mkfs.ctsecfs
$(MKFS): utility/mkfs.ctsecfs.c
	$(CC) -std=gnu99 -g -fno-inline -Werror -Wall -Wextra -pedantic -Wcast-align -Wcast-qual -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wredundant-decls -Wshadow -Wstrict-overflow=5 -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses -fdiagnostics-show-option -o $@ $<

# Test compilation
$(TEST_EXECUTABLE): $(TEST_OBJECTS)
	$(CC) $(LOCAL_CFLAGS) -o $@ $^

# Utility program targets
$(BINARIES): %: $(UTILITY_DIR)/%.c
	$(CC) $(LOCAL_CFLAGS) -o $@ $<

# Clean up everything
clean:
	rm -f *~ $(BINARIES) $(UTILITY_DIR)/*.o
	rm -f $(TEST_OBJECTS) $(TEST_EXECUTABLE)
	rm -f $(TEST_EXECUTABLE)
	rm -f $(MKFS) $(POLICY_GEN)

# Install scripts
install: all
	install -m 755 ./testcases/sh/*.sh $(DESTDIR)/usr/bin
	install -m 755 $(BINARIES) $(DESTDIR)/usr/bin
	install -m 755 $(TEST_EXECUTABLE) $(DESTDIR)/usr/bin
	install -m 755 $(MKFS) $(DESTDIR)/usr/bin
	install -m 755 $(POLICY_GEN) $(DESTDIR)/usr/bin

all: $(BINARIES)  $(TEST_EXECUTABLE) $(MKFS) $(POLICY_GEN)

# Phony targets
.PHONY: all clean install $(TEST_EXECUTABLE) $(MKFS) $(POLICY_GEN)
