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