CC       ?= cc
CXX      ?= c++
RM       ?= rm -f
CP       ?= cp -a
CHDIR    ?= chdir
MKDIR    ?= mkdir
WINDRES  ?= windres
INSTALL  ?= install
CFLAGS   ?= -Wall
CXXFLAGS ?= -Wall
LDFLAGS  ?= -Wall
ifneq "$(COVERAGE)" "yes"
  CFLAGS   += -O2
  CXXFLAGS += -O2
  LDFLAGS  += -O2
endif
LDFLAGS  += -Wl,-undefined,error
CAT      ?= $(if $(filter $(OS),Windows_NT),type,cat)

# If you run this under windows cmd.com interpreter:
# You must provide UnxUtils rm.exe and cp.exe in path
# Otherwise certain targets may not work as intended!
# Note: It seems impossible to replace `mkdir` command

ifneq (,$(findstring /cygdrive/,$(PATH)))
	UNAME := Cygwin
	TARGET := Windows
else ifneq (,$(findstring Windows_NT,$(OS)))
	UNAME := Windows
	TARGET := Windows
else ifneq (,$(findstring mingw32,$(MAKE)))
	UNAME := MinGW
	TARGET := Windows
else ifneq (,$(findstring MINGW32,$(shell uname -s)))
	UNAME := MinGW
	TARGET := Windows
else
	UNAME := $(shell uname -s)
	TARGET := $(shell uname -s)
endif

ifeq ($(SASS_SASSC_PATH),)
	SASS_SASSC_PATH = $(abspath $(CURDIR))
endif
ifeq ($(SASS_LIBSASS_PATH),)
	SASS_LIBSASS_PATH = $(abspath $(CURDIR)/..)
endif

ifeq ($(SASSC_VERSION),)
	ifneq ($(wildcard ./.git/ ),)
		SASSC_VERSION ?= $(shell git describe --abbrev=4 --dirty --always --tags)
	endif
endif

ifeq ($(SASSC_VERSION),)
	ifneq ($(wildcard VERSION),)
		SASSC_VERSION ?= $(shell $(CAT) VERSION)
	endif
endif

ifneq ($(SASSC_VERSION),)
	CFLAGS   += -DSASSC_VERSION="\"$(SASSC_VERSION)\""
	CXXFLAGS += -DSASSC_VERSION="\"$(SASSC_VERSION)\""
endif

# enable mandatory flag
ifeq (Windows,$(TARGET))
	ifneq ($(BUILD),shared)
		STATIC_ALL     ?= 1
	endif
	STATIC_LIBGCC    ?= 1
	STATIC_LIBSTDCPP ?= 1
	CXXFLAGS += -std=c++11
	LDFLAGS  += -std=c++11
else
	STATIC_ALL       ?= 0
	STATIC_LIBGCC    ?= 0
	STATIC_LIBSTDCPP ?= 0
	CXXFLAGS += -std=c++11
	LDFLAGS  += -std=c++11
endif

ifneq ($(SASS_LIBSASS_PATH),)
	CFLAGS   += -I $(SASS_LIBSASS_PATH)/include
	CXXFLAGS += -I $(SASS_LIBSASS_PATH)/include
	# only needed to support old source tree
	# we have moved the files to src folder
	CFLAGS   += -I $(SASS_LIBSASS_PATH)
	CXXFLAGS += -I $(SASS_LIBSASS_PATH)
else
	# this is needed for mingw
	CFLAGS   += -I include
	CXXFLAGS += -I include
endif

ifneq ($(EXTRA_CFLAGS),)
	CFLAGS   += $(EXTRA_CFLAGS)
endif
ifneq ($(EXTRA_CXXFLAGS),)
	CXXFLAGS += $(EXTRA_CXXFLAGS)
endif
ifneq ($(EXTRA_LDFLAGS),)
	LDFLAGS  += $(EXTRA_LDFLAGS)
endif

LDLIBS = -lm

ifneq ($(BUILD),shared)
	LDLIBS += -lstdc++
endif

# link statically into lib
# makes it a lot more portable
# increases size by about 50KB
ifeq ($(STATIC_ALL),1)
	LDFLAGS += -static
endif
ifeq ($(STATIC_LIBGCC),1)
	LDFLAGS += -static-libgcc
endif
ifeq ($(STATIC_LIBSTDCPP),1)
	LDFLAGS += -static-libstdc++
endif

ifeq ($(UNAME),Darwin)
	CFLAGS += -stdlib=libc++
	CXXFLAGS += -stdlib=libc++
	LDFLAGS += -stdlib=libc++
endif

ifneq (Windows,$(TARGET))
	ifneq (FreeBSD,$(UNAME))
    ifneq (OpenBSD,$(UNAME))
			LDFLAGS += -ldl
			LDLIBS += -ldl
		endif
	endif
endif

ifneq ($(BUILD),shared)
	BUILD = static
endif

ifeq (,$(PREFIX))
	ifeq (,$(TRAVIS_BUILD_DIR))
		PREFIX = /usr/local
	else
		PREFIX = $(TRAVIS_BUILD_DIR)
	endif
endif

SOURCES = sassc.c

LIB_STATIC = $(SASS_LIBSASS_PATH)/lib/libsass.a
LIB_SHARED = $(SASS_LIBSASS_PATH)/lib/libsass.so

RESOURCES =
SASSC_EXE = bin/sassc
ifeq ($(UNAME),Darwin)
	SHAREDLIB = lib/libsass.dylib
	LIB_SHARED = $(SASS_LIBSASS_PATH)/lib/libsass.dylib
endif
ifeq (Windows,$(TARGET))
	RESOURCES = libsass.res
	SASSC_EXE = bin/sassc.exe
	ifeq (shared,$(BUILD))
		CFLAGS     += -D ADD_EXPORTS
		CXXFLAGS   += -D ADD_EXPORTS
		LIB_SHARED  = $(SASS_LIBSASS_PATH)/lib/libsass.dll
	endif
else
	CFLAGS   += -fPIC
	CXXFLAGS += -fPIC
	LDFLAGS  += -fPIC
endif

OBJECTS = $(SOURCES:.c=.o)
SPEC_PATH = $(SASS_SPEC_PATH)
all: sassc

%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

%.o: %.rc
	$(WINDRES) -i $< -o $@

%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c -o $@ $<

sassc: $(SASSC_EXE)
build: build-$(BUILD)
libsass: libsass-$(BUILD)

$(SASSC_EXE): libsass build

$(DESTDIR)$(PREFIX)/:
	$(MKDIR) $(DESTDIR)$(PREFIX)

$(DESTDIR)$(PREFIX)/bin/:
	$(MKDIR) $(DESTDIR)$(PREFIX)/bin

$(DESTDIR)$(PREFIX)/bin/%: bin/%
	$(INSTALL) -D -v -m0755 "$<" "$@"

install: libsass-install-$(BUILD) \
	$(DESTDIR)$(PREFIX)/$(SASSC_EXE)

build-static: $(RESOURCES) $(OBJECTS) $(LIB_STATIC)
	$(CC) $(LDFLAGS) -o $(SASSC_EXE) $^ $(LDLIBS)

build-shared: $(RESOURCES) $(OBJECTS) $(LIB_SHARED)
	$(CC) $(LDFLAGS) -o $(SASSC_EXE) $(RESOURCES) $(OBJECTS) \
		-Wl,-rpath,$(DESTDIR)$(PREFIX)/lib \
		-Wl,-rpath,$(SASS_LIBSASS_PATH)/lib \
		$(LDLIBS) -L$(SASS_LIBSASS_PATH)/lib -lsass

$(LIB_STATIC): libsass-static
$(LIB_SHARED): libsass-shared

libsass-static:
ifdef SASS_LIBSASS_PATH
	$(MAKE) BUILD="static" -C $(SASS_LIBSASS_PATH)
else
	$(error SASS_LIBSASS_PATH must be defined)
endif

libsass-shared:
ifdef SASS_LIBSASS_PATH
	$(MAKE) BUILD="shared" -C $(SASS_LIBSASS_PATH)
else
	$(error SASS_LIBSASS_PATH must be defined)
endif

# nothing to do for static
libsass-install-static: libsass-static
ifdef SASS_LIBSASS_PATH
	$(MAKE) BUILD="static" -C $(SASS_LIBSASS_PATH) install
else
	$(error SASS_LIBSASS_PATH must be defined)
endif

# install shared library
libsass-install-shared: libsass-shared
ifdef SASS_LIBSASS_PATH
	$(MAKE) BUILD="shared" -C $(SASS_LIBSASS_PATH) install
else
	$(error SASS_LIBSASS_PATH must be defined)
endif

test: all
	$(MAKE) -C $(SASS_LIBSASS_PATH) version

libsass.res:
	$(WINDRES) res/libsass.rc -O coff libsass.res

specs: all
ifdef SASS_LIBSASS_PATH
	$(MAKE) -C $(SASS_LIBSASS_PATH) test_build
else
	$(error SASS_LIBSASS_PATH must be defined)
endif

clean:
	rm -f $(OBJECTS) $(SASSC_EXE) \
	      bin/*.so bin/*.dll bin/*.dylib libsass.res
ifdef SASS_LIBSASS_PATH
	$(MAKE) -C $(SASS_LIBSASS_PATH) clean
endif

.PHONY: test specs clean sassc \
        all build-static build-shared \
        libsass libsass-static libsass-shared
.DELETE_ON_ERROR: