#
# Makefile
# Copyright (C) 2005 Robin KAY. All rights reserved.
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#

PREFIX = /opt/local
CC = /opt/csw/gcc3/bin/gcc
CFLAGS = -g -Wall
LDFLAGS =

TOOL_SRC = fsrewrite.c
TOOL_NAME = fsrewrite
MAN_PAGE = fsrewrite.1

LIB_SRC = mallory.c tracker.c utils.c
LIB_NAME = libfsrewrite.so
MAPFILE_IN = mapfile.in.h
OBJECT32_DIR = object32
OBJECT64_DIR = object64

TEST_BINARIES = test_dupdents

BIN_PREFIX = $(PREFIX)/bin
MAN_PREFIX = $(PREFIX)/man/man1
LIB_PREFIX = $(PREFIX)/lib
LIB_INST_PATH = $(LIB_PREFIX)/$(LIB_NAME)
LIB64_PREFIX_SCRIPT = \
  case "`uname -p`" in \
    sparc) \
      echo lib/sparcv9 \
    ;; \
    i386) \
      echo lib/amd64 \
    ;; \
  esac
LIB64_PREFIX = $(PREFIX)/$(LIB64_PREFIX_SCRIPT:sh)
LIB64_INST_PATH = $(LIB64_PREFIX)/$(LIB_NAME)

LIB32_TARGET = $(OBJECT32_DIR)/$(LIB_NAME)
LIB32_OBJS = $(LIB_SRC:%.c=$(OBJECT32_DIR)/%.o)
LIB32_MAPFILE = $(OBJECT32_DIR)/mapfile
LIB32_DEPS = $(LIB32_OBJS) $(LIB32_MAPFILE)
LIB32_CFLAGS = $(CFLAGS) -fpic
LIB32_LDFLAGS = $(LDFLAGS) -G -Wl,-M,$(LIB32_MAPFILE)

LIB64_TARGET = $(OBJECT64_DIR)/libfsrewrite.so
LIB64_OBJS = $(LIB_SRC:%.c=$(OBJECT64_DIR)/%.o)
LIB64_MAPFILE = $(OBJECT64_DIR)/mapfile
LIB64_DEPS = $(LIB64_OBJS) $(LIB64_MAPFILE)
LIB64_CFLAGS = $(CFLAGS) -m64 -fpic
LIB64_LDFLAGS = $(LDFLAGS) -m64 -G -Wl,-M,$(LIB64_MAPFILE)

.PHONY: all all32 check install install32 clean

all: all32 $(LIB64_TARGET)

all32: $(TOOL_NAME) $(LIB32_TARGET)

$(TOOL_NAME): $(TOOL_SRC)
	$(CC) -o $@ $(CFLAGS) $(LDFLAGS) \
  -DLIB_INST_PATH=\"$(LIB_INST_PATH)\" \
  -DLIB64_INST_PATH=\"$(LIB64_INST_PATH)\" \
  fsrewrite.c

test_dupdents: test_dupdents.c
	$(CC) -o $@ $(CFLAGS) $(LDFLAGS) test_dupdents.c

check: $(LIB32_TARGET) $(TEST_BINARIES)
	for x in $(TEST_BINARIES); do \
  echo Running $$x... \\c && \
  FSREWRITE_RULES=:1\\+1\\ \
  FSREWRITE_PWD=$(PWD) \
  LD_PRELOAD=$(PWD)/$(LIB32_TARGET) \
  ./$$x && echo passed || echo failed; done

install: all install32
	install -d $(LIB64_PREFIX)
	install -f $(LIB64_PREFIX) $(LIB64_TARGET)

install32: all32
	install -d $(BIN_PREFIX)
	install -f $(BIN_PREFIX) $(TOOL_NAME)
	install -d $(MAN_PREFIX)
	install -f $(MAN_PREFIX) $(MAN_PAGE)
	install -d $(LIB_PREFIX)
	install -f $(LIB_PREFIX) $(LIB32_TARGET)

clean:
	rm -f $(TOOL_NAME)
	rm -f $(TEST_BINARIES)
	rm -f $(LIB32_TARGET) $(LIB32_OBJS) $(LIB32_MAPFILE)
	rm -f $(LIB64_TARGET) $(LIB64_OBJS) $(LIB64_MAPFILE)

$(LIB32_TARGET): $(LIB32_DEPS)
	$(CC) $(LIB32_LDFLAGS) $(LIB32_OBJS) -o $@

$(OBJECT32_DIR)/%.o: %.c
	$(CC) $(LIB32_CFLAGS) -c $< -o $@

$(LIB32_MAPFILE): $(MAPFILE_IN)
	$(CC) $(LIB32_CFLAGS) -E $(MAPFILE_IN) >$@

$(LIB64_TARGET): $(LIB64_DEPS)
	$(CC) $(LIB64_LDFLAGS) $(LIB64_OBJS) -o $@

$(OBJECT64_DIR)/%.o: %.c
	$(CC) $(LIB64_CFLAGS) -c $< -o $@

$(LIB64_MAPFILE): $(MAPFILE_IN)
	$(CC) $(LIB64_CFLAGS) -E $(MAPFILE_IN) >$@
