1OS       ?= $(shell uname -s)
2CC       ?= cc
3CXX      ?= c++
4RM       ?= rm -f
5CP       ?= cp -a
6MKDIR    ?= mkdir
7RMDIR    ?= rmdir
8WINDRES  ?= windres
9# Solaris/Illumos flavors
10# ginstall from coreutils
11ifeq ($(OS),SunOS)
12INSTALL  ?= ginstall
13endif
14INSTALL  ?= install
15CFLAGS   ?= -Wall
16CXXFLAGS ?= -Wall
17LDFLAGS  ?= -Wall
18ifndef COVERAGE
19  CFLAGS   += -O2
20  CXXFLAGS += -O2
21  LDFLAGS  += -O2
22else
23  CFLAGS   += -O1 -fno-omit-frame-pointer
24  CXXFLAGS += -O1 -fno-omit-frame-pointer
25  LDFLAGS  += -O1 -fno-omit-frame-pointer
26endif
27CAT ?= $(if $(filter $(OS),Windows_NT),type,cat)
28
29ifneq (,$(findstring /cygdrive/,$(PATH)))
30	UNAME := Cygwin
31else
32ifneq (,$(findstring Windows_NT,$(OS)))
33	UNAME := Windows
34else
35ifneq (,$(findstring mingw32,$(MAKE)))
36	UNAME := Windows
37else
38ifneq (,$(findstring MINGW32,$(shell uname -s)))
39	UNAME := Windows
40else
41	UNAME := $(shell uname -s)
42endif
43endif
44endif
45endif
46
47ifndef LIBSASS_VERSION
48	ifneq ($(wildcard ./.git/ ),)
49		LIBSASS_VERSION ?= $(shell git describe --abbrev=4 --dirty --always --tags)
50	endif
51	ifneq ($(wildcard VERSION),)
52		LIBSASS_VERSION ?= $(shell $(CAT) VERSION)
53	endif
54endif
55ifdef LIBSASS_VERSION
56	CFLAGS   += -DLIBSASS_VERSION="\"$(LIBSASS_VERSION)\""
57	CXXFLAGS += -DLIBSASS_VERSION="\"$(LIBSASS_VERSION)\""
58endif
59
60LIBSASS_CPPSTD ?= c++11
61CXXFLAGS += -std=$(LIBSASS_CPPSTD)
62LDFLAGS  += -std=$(LIBSASS_CPPSTD)
63
64ifeq (Windows,$(UNAME))
65	ifneq ($(BUILD),shared)
66		STATIC_ALL     ?= 1
67	endif
68	STATIC_LIBGCC    ?= 1
69	STATIC_LIBSTDCPP ?= 1
70else
71	STATIC_ALL       ?= 0
72	STATIC_LIBGCC    ?= 0
73	STATIC_LIBSTDCPP ?= 0
74endif
75
76ifndef SASS_LIBSASS_PATH
77	SASS_LIBSASS_PATH = $(CURDIR)
78endif
79ifdef SASS_LIBSASS_PATH
80	CFLAGS   += -I $(SASS_LIBSASS_PATH)/include
81	CXXFLAGS += -I $(SASS_LIBSASS_PATH)/include
82else
83	# this is needed for mingw
84	CFLAGS   += -I include
85	CXXFLAGS += -I include
86endif
87
88CFLAGS   += $(EXTRA_CFLAGS)
89CXXFLAGS += $(EXTRA_CXXFLAGS)
90LDFLAGS  += $(EXTRA_LDFLAGS)
91
92LDLIBS = -lm
93ifneq ($(BUILD),shared)
94	ifneq ($(STATIC_LIBSTDCPP),1)
95		LDLIBS += -lstdc++
96	endif
97endif
98
99# link statically into lib
100# makes it a lot more portable
101# increases size by about 50KB
102ifeq ($(STATIC_ALL),1)
103	LDFLAGS += -static
104endif
105ifeq ($(STATIC_LIBGCC),1)
106	LDFLAGS += -static-libgcc
107endif
108ifeq ($(STATIC_LIBSTDCPP),1)
109	LDFLAGS += -static-libstdc++
110endif
111
112ifeq ($(UNAME),Darwin)
113	CFLAGS += -stdlib=libc++
114	CXXFLAGS += -stdlib=libc++
115	LDFLAGS += -stdlib=libc++
116endif
117
118ifneq (Windows,$(UNAME))
119	ifneq (FreeBSD,$(UNAME))
120		ifneq (OpenBSD,$(UNAME))
121			LDFLAGS += -ldl
122			LDLIBS += -ldl
123		endif
124	endif
125endif
126
127ifneq ($(BUILD),shared)
128	BUILD := static
129endif
130ifeq ($(DEBUG),1)
131	BUILD := debug-$(BUILD)
132endif
133
134ifndef TRAVIS_BUILD_DIR
135	ifeq ($(OS),SunOS)
136		PREFIX ?= /opt/local
137	else
138		PREFIX ?= /usr/local
139	endif
140else
141	PREFIX ?= $(TRAVIS_BUILD_DIR)
142endif
143
144SASS_SASSC_PATH ?= sassc
145SASS_SPEC_PATH ?= sass-spec
146SASS_SPEC_SPEC_DIR ?= spec
147LIBSASS_SPEC_PATH ?= libsass-spec
148LIBSASS_SPEC_SPEC_DIR ?= spec
149SASSC_BIN = $(SASS_SASSC_PATH)/bin/sassc
150RUBY_BIN = ruby
151
152RESOURCES =
153STATICLIB = lib/libsass.a
154SHAREDLIB = lib/libsass.so
155LIB_STATIC = $(SASS_LIBSASS_PATH)/lib/libsass.a
156LIB_SHARED = $(SASS_LIBSASS_PATH)/lib/libsass.so
157ifeq ($(UNAME),Darwin)
158	SHAREDLIB = lib/libsass.dylib
159	LIB_SHARED = $(SASS_LIBSASS_PATH)/lib/libsass.dylib
160endif
161ifeq (Windows,$(UNAME))
162	SASSC_BIN = $(SASS_SASSC_PATH)/bin/sassc.exe
163	RESOURCES += res/resource.rc
164	SHAREDLIB  = lib/libsass.dll
165	ifeq (shared,$(BUILD))
166		CFLAGS    += -D ADD_EXPORTS
167		CXXFLAGS  += -D ADD_EXPORTS
168		LIB_SHARED  = $(SASS_LIBSASS_PATH)/lib/libsass.dll
169	endif
170else
171ifneq (Cygwin,$(UNAME))
172	CFLAGS   += -fPIC
173	CXXFLAGS += -fPIC
174	LDFLAGS  += -fPIC
175endif
176endif
177
178include Makefile.conf
179OBJECTS = $(addprefix src/,$(SOURCES:.cpp=.o))
180COBJECTS = $(addprefix src/,$(CSOURCES:.c=.o))
181RCOBJECTS = $(RESOURCES:.rc=.o)
182
183DEBUG_LVL ?= NONE
184
185CLEANUPS ?=
186CLEANUPS += $(RCOBJECTS)
187CLEANUPS += $(COBJECTS)
188CLEANUPS += $(OBJECTS)
189CLEANUPS += $(LIBSASS_LIB)
190
191all: $(BUILD)
192
193debug: $(BUILD)
194
195debug-static: LDFLAGS := -g $(filter-out -O2,$(LDFLAGS))
196debug-static: CFLAGS := -g -DDEBUG -DDEBUG_LVL="$(DEBUG_LVL)" $(filter-out -O2,$(CFLAGS))
197debug-static: CXXFLAGS := -g -DDEBUG -DDEBUG_LVL="$(DEBUG_LVL)" $(filter-out -O2,$(CXXFLAGS))
198debug-static: static
199
200debug-shared: LDFLAGS := -g $(filter-out -O2,$(LDFLAGS))
201debug-shared: CFLAGS := -g -DDEBUG -DDEBUG_LVL="$(DEBUG_LVL)" $(filter-out -O2,$(CFLAGS))
202debug-shared: CXXFLAGS := -g -DDEBUG -DDEBUG_LVL="$(DEBUG_LVL)" $(filter-out -O2,$(CXXFLAGS))
203debug-shared: shared
204
205lib:
206	$(MKDIR) lib
207
208lib/libsass.a: $(COBJECTS) $(OBJECTS) | lib
209	$(AR) rcvs $@ $(COBJECTS) $(OBJECTS)
210
211lib/libsass.so: $(COBJECTS) $(OBJECTS) | lib
212	$(CXX) -shared $(LDFLAGS) -o $@ $(COBJECTS) $(OBJECTS) $(LDLIBS)
213
214lib/libsass.dylib: $(COBJECTS) $(OBJECTS) | lib
215	$(CXX) -shared $(LDFLAGS) -o $@ $(COBJECTS) $(OBJECTS) $(LDLIBS) \
216	-install_name @rpath/libsass.dylib
217
218lib/libsass.dll: $(COBJECTS) $(OBJECTS) $(RCOBJECTS) | lib
219	$(CXX) -shared $(LDFLAGS) -o $@ $(COBJECTS) $(OBJECTS) $(RCOBJECTS) $(LDLIBS) \
220	-s -Wl,--subsystem,windows,--out-implib,lib/libsass.a
221
222%.o: %.c
223	$(CC) $(CFLAGS) -c -o $@ $<
224
225%.o: %.rc
226	$(WINDRES) -i $< -o $@
227
228%.o: %.cpp
229	$(CXX) $(CXXFLAGS) -c -o $@ $<
230
231%: %.o static
232	$(CXX) $(CXXFLAGS) -o $@ $+ $(LDFLAGS) $(LDLIBS)
233
234install: install-$(BUILD)
235
236static: $(STATICLIB)
237shared: $(SHAREDLIB)
238
239$(DESTDIR)$(PREFIX):
240	$(MKDIR) $(DESTDIR)$(PREFIX)
241
242$(DESTDIR)$(PREFIX)/lib: | $(DESTDIR)$(PREFIX)
243	$(MKDIR) $(DESTDIR)$(PREFIX)/lib
244
245$(DESTDIR)$(PREFIX)/include: | $(DESTDIR)$(PREFIX)
246	$(MKDIR) $(DESTDIR)$(PREFIX)/include
247
248$(DESTDIR)$(PREFIX)/include/sass: | $(DESTDIR)$(PREFIX)/include
249	$(MKDIR) $(DESTDIR)$(PREFIX)/include/sass
250
251$(DESTDIR)$(PREFIX)/include/%.h: include/%.h \
252                                 | $(DESTDIR)$(PREFIX)/include/sass
253	$(INSTALL) -v -m0644 "$<" "$@"
254
255install-headers: $(DESTDIR)$(PREFIX)/include/sass.h \
256                 $(DESTDIR)$(PREFIX)/include/sass2scss.h \
257                 $(DESTDIR)$(PREFIX)/include/sass/base.h \
258                 $(DESTDIR)$(PREFIX)/include/sass/version.h \
259                 $(DESTDIR)$(PREFIX)/include/sass/values.h \
260                 $(DESTDIR)$(PREFIX)/include/sass/context.h \
261                 $(DESTDIR)$(PREFIX)/include/sass/functions.h
262
263$(DESTDIR)$(PREFIX)/lib/%.a: lib/%.a \
264                             | $(DESTDIR)$(PREFIX)/lib
265	@$(INSTALL) -v -m0755 "$<" "$@"
266
267$(DESTDIR)$(PREFIX)/lib/%.so: lib/%.so \
268                             | $(DESTDIR)$(PREFIX)/lib
269	@$(INSTALL) -v -m0755 "$<" "$@"
270
271$(DESTDIR)$(PREFIX)/lib/%.dll: lib/%.dll \
272                               | $(DESTDIR)$(PREFIX)/lib
273	@$(INSTALL) -v -m0755 "$<" "$@"
274
275$(DESTDIR)$(PREFIX)/lib/%.dylib: lib/%.dylib \
276                               | $(DESTDIR)$(PREFIX)/lib
277	@$(INSTALL) -v -m0755 "$<" "$@"
278
279install-static: $(DESTDIR)$(PREFIX)/lib/libsass.a
280
281install-shared: $(DESTDIR)$(PREFIX)/$(SHAREDLIB) \
282                install-headers
283
284$(SASSC_BIN): $(BUILD)
285	$(MAKE) -C $(SASS_SASSC_PATH) build-$(BUILD)
286
287sassc: $(SASSC_BIN)
288	$(SASSC_BIN) -v
289
290version: $(SASSC_BIN)
291	$(SASSC_BIN) -v
292
293test: test_build
294
295$(SASS_SPEC_PATH):
296	git clone https://github.com/sass/sass-spec $(SASS_SPEC_PATH)
297
298$(LIBSASS_SPEC_PATH):
299	git clone https://github.com/mgreter/libsass-spec $(LIBSASS_SPEC_PATH)
300
301test_build: $(SASSC_BIN) $(SASS_SPEC_PATH) $(LIBSASS_SPEC_PATH)
302	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
303	--cmd-args "-I $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)" \
304	$(LOG_FLAGS) $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)
305	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
306	--cmd-args "-I $(LIBSASS_SPEC_PATH)/$(LIBSASS_SPEC_SPEC_DIR)" \
307	$(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/$(LIBSASS_SPEC_SPEC_DIR)
308	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
309	--cmd-args "-I $(LIBSASS_SPEC_PATH)/styles/compressed -t compressed" \
310	$(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/styles/compressed
311	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
312	--cmd-args "-I $(LIBSASS_SPEC_PATH)/styles/nested -t nested" \
313	$(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/styles/nested
314
315test_full: $(SASSC_BIN) $(SASS_SPEC_PATH) $(LIBSASS_SPEC_PATH)
316	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
317	--cmd-args "-I $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)" \
318	--run-todo $(LOG_FLAGS) $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)
319	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
320	--cmd-args "-I $(LIBSASS_SPEC_PATH)/$(LIBSASS_SPEC_SPEC_DIR)" \
321	--run-todo $(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/$(LIBSASS_SPEC_SPEC_DIR)
322	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
323	--cmd-args "-I $(LIBSASS_SPEC_PATH)/styles/compressed -t compressed" \
324	--run-todo $(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/styles/compressed
325	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
326	--cmd-args "-I $(LIBSASS_SPEC_PATH)/styles/nested -t nested" \
327	--run-todo $(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/styles/nested
328
329test_probe: $(SASSC_BIN) $(SASS_SPEC_PATH) $(LIBSASS_SPEC_PATH)
330	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
331	--cmd-args "-I $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)" \
332	--probe-todo $(LOG_FLAGS) $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)
333	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
334	--cmd-args "-I $(LIBSASS_SPEC_PATH)/$(LIBSASS_SPEC_SPEC_DIR)" \
335	--probe-todo $(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/$(LIBSASS_SPEC_SPEC_DIR)
336	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
337	--cmd-args "-I $(LIBSASS_SPEC_PATH)/styles/compressed -t compressed" \
338	--probe-todo $(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/styles/compressed
339	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
340	--cmd-args "-I $(LIBSASS_SPEC_PATH)/styles/nested -t nested" \
341	--probe-todo $(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/styles/nested
342
343test_interactive: $(SASSC_BIN) $(SASS_SPEC_PATH) $(LIBSASS_SPEC_PATH)
344	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
345	--cmd-args "-I $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)" \
346	--interactive $(LOG_FLAGS) $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)
347	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
348	--cmd-args "-I $(LIBSASS_SPEC_PATH)/$(LIBSASS_SPEC_SPEC_DIR)" \
349	--interactive $(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/$(LIBSASS_SPEC_SPEC_DIR)
350	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
351	--cmd-args "-I $(LIBSASS_SPEC_PATH)/styles/compressed -t compressed" \
352	--interactive $(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/styles/compressed
353	$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) --impl libsass \
354	--cmd-args "-I $(LIBSASS_SPEC_PATH)/styles/nested -t nested" \
355	--interactive $(LOG_FLAGS) $(LIBSASS_SPEC_PATH)/styles/nested
356
357clean-objects: | lib
358	-$(RM) lib/*.a lib/*.so lib/*.dll lib/*.dylib lib/*.la
359	-$(RMDIR) lib
360clean: clean-objects
361	$(RM) $(CLEANUPS)
362
363clean-all:
364	$(MAKE) -C $(SASS_SASSC_PATH) clean
365
366lib-file: lib-file-$(BUILD)
367lib-opts: lib-opts-$(BUILD)
368
369lib-file-static:
370	@echo $(LIB_STATIC)
371lib-file-shared:
372	@echo $(LIB_SHARED)
373lib-opts-static:
374	@echo -L"$(SASS_LIBSASS_PATH)/lib"
375lib-opts-shared:
376	@echo -L"$(SASS_LIBSASS_PATH)/lib -lsass"
377
378.PHONY: all static shared sassc \
379        version install-headers \
380        clean clean-all clean-objects \
381        debug debug-static debug-shared \
382        install install-static install-shared \
383        lib-opts lib-opts-shared lib-opts-static \
384        lib-file lib-file-shared lib-file-static \
385        test test_build test_full test_probe
386.DELETE_ON_ERROR:
387