main.mak 11.6 KB
Newer Older
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
1 2 3 4 5 6 7
# Main makefile for VLC 3rd party libraries ("contrib")
# Copyright (C) 2003-2011 the VideoLAN team
#
# This file is under the same license as the vlc package.

all: install

8 9 10 11 12 13 14 15
# bootstrap configuration
include config.mak

TOPSRC ?= ../../contrib
TOPDST ?= ..
SRC := $(TOPSRC)/src
TARBALLS := $(TOPSRC)/tarballs

16 17 18
PATH :=$(abspath ../../extras/tools/build/bin):$(PATH)
export PATH

19
PKGS_ALL := $(patsubst $(SRC)/%/rules.mak,%,$(wildcard $(SRC)/*/rules.mak))
20
DATE := $(shell date +%Y%m%d)
21
VPATH := $(TARBALLS)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
22 23 24 25 26 27 28 29 30 31

# Common download locations
GNU := http://ftp.gnu.org/gnu
SF := http://heanet.dl.sourceforge.net/sourceforge
VIDEOLAN := http://downloads.videolan.org/pub/videolan
CONTRIB_VIDEOLAN := $(VIDEOLAN)/testing/contrib

#
# Machine-dependent variables
#
32

33
PREFIX ?= $(TOPDST)/$(HOST)
34
PREFIX := $(abspath $(PREFIX))
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
35 36 37
ifneq ($(HOST),$(BUILD))
HAVE_CROSS_COMPILE = 1
endif
38
ARCH := $(shell $(SRC)/get-arch.sh $(HOST))
39 40 41
ifneq ($(findstring $(ARCH),i386 sparc sparc64 ppc ppc64 x86_64),)
# This should be consistent with include/vlc_cpu.h
HAVE_FPU = 1
42 43
else ifneq ($(findstring $(ARCH),arm),)
ifneq ($(call cppcheck, __VFP_FP__)),)
Rafaël Carré's avatar
Rafaël Carré committed
44
ifeq ($(call cppcheck, __SOFTFP__),)
45 46 47
HAVE_FPU = 1
endif
endif
48
endif
49 50 51
ifeq ($(ARCH)-$(HAVE_WIN32),x86_64-1)
HAVE_WIN64 := 1
endif
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

ifdef HAVE_CROSS_COMPILE
need_pkg = 1
else
need_pkg = $(shell $(PKG_CONFIG) $(1) || echo 1)
endif

#
# Default values for tools
#
ifndef HAVE_CROSS_COMPILE
ifneq ($(findstring $(origin CC),undefined default),)
CC := gcc
endif
ifneq ($(findstring $(origin CXX),undefined default),)
CXX := g++
endif
ifneq ($(findstring $(origin LD),undefined default),)
LD := ld
endif
ifneq ($(findstring $(origin AR),undefined default),)
AR := ar
endif
ifneq ($(findstring $(origin RANLIB),undefined default),)
RANLIB := ranlib
endif
ifneq ($(findstring $(origin STRIP),undefined default),)
STRIP := strip
endif
else
ifneq ($(findstring $(origin CC),undefined default),)
CC := $(HOST)-gcc
endif
ifneq ($(findstring $(origin CXX),undefined default),)
CXX := $(HOST)-g++
endif
ifneq ($(findstring $(origin LD),undefined default),)
LD := $(HOST)-ld
endif
ifneq ($(findstring $(origin AR),undefined default),)
AR := $(HOST)-ar
endif
ifneq ($(findstring $(origin RANLIB),undefined default),)
RANLIB := $(HOST)-ranlib
endif
ifneq ($(findstring $(origin STRIP),undefined default),)
STRIP := $(HOST)-strip
endif
endif

102
ifdef HAVE_ANDROID
103 104
CC :=  $(HOST)-gcc --sysroot=$(ANDROID_NDK)/platforms/android-9/arch-$(PLATFORM_SHORT_ARCH)
CXX := $(HOST)-g++ --sysroot=$(ANDROID_NDK)/platforms/android-9/arch-$(PLATFORM_SHORT_ARCH)
105 106
endif

107
ifdef HAVE_MACOSX
108
MIN_OSX_VERSION=10.6
109 110 111 112 113 114
CC=xcrun gcc
CXX=xcrun g++
AR=xcrun ar
LD=xcrun ld
STRIP=xcrun strip
RANLIB=xcrun ranlib
115 116
EXTRA_CFLAGS += -isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MIN_OSX_VERSION) -DMACOSX_DEPLOYMENT_TARGET=$(MIN_OSX_VERSION)
EXTRA_LDFLAGS += -Wl,-syslibroot,$(MACOSX_SDK) -mmacosx-version-min=$(MIN_OSX_VERSION) -isysroot $(MACOSX_SDK) -DMACOSX_DEPLOYMENT_TARGET=$(MIN_OSX_VERSION)
117 118 119 120
ifeq ($(ARCH),x86_64)
EXTRA_CFLAGS += -m64
EXTRA_LDFLAGS += -m64
else
121 122 123
EXTRA_CFLAGS += -m32
EXTRA_LDFLAGS += -m32
endif
Rafaël Carré's avatar
Rafaël Carré committed
124 125

XCODE_FLAGS = -sdk macosx$(OSX_VERSION)
126
ifeq ($(shell xcodebuild -version 2>/dev/null | tee /dev/null|head -1|cut -d\  -f2|cut -d. -f1),3)
127
XCODE_FLAGS += ARCHS=$(ARCH)
Rafaël Carré's avatar
Rafaël Carré committed
128 129 130 131 132
# XCode 3 doesn't support -arch
else
XCODE_FLAGS += -arch $(ARCH)
endif

133
endif
134

135 136 137
ifdef HAVE_IOS
CC=xcrun clang
CXX=xcrun clang++
138 139 140 141 142
ifeq ($(ARCH), arm)
AS=perl $(abspath ../../extras/tools/build/bin/gas-preprocessor.pl) $(CC)
else
AS=xcrun as
endif
143 144 145 146
AR=xcrun ar
LD=xcrun ld
STRIP=xcrun strip
RANLIB=xcrun ranlib
147
ifeq ($(ARCH), arm)
148
EXTRA_CFLAGS += -arch armv7 -mcpu=cortex-a8
149 150 151 152 153
EXTRA_LDFLAGS += -arch armv7
else
EXTRA_CFLAGS += -m32
EXTRA_LDFLAGS += -m32
endif
154 155 156 157
EXTRA_CFLAGS += -isysroot $(SDKROOT)  -miphoneos-version-min=5.0
EXTRA_LDFLAGS += -Wl,-syslibroot,$(SDKROOT) -isysroot $(SDKROOT) -miphoneos-version-min=5.0
endif

158 159 160 161 162 163
ifdef HAVE_WIN32
ifneq ($(shell $(CC) $(CFLAGS) -E -dM -include _mingw.h - < /dev/null | grep -E __MINGW64_VERSION_MAJOR),)
HAVE_MINGW_W64 := 1
endif
endif

164
cppcheck = $(shell $(CC) $(CFLAGS) -E -dM - < /dev/null | grep -E $(1))
165

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
166 167
EXTRA_CFLAGS += -I$(PREFIX)/include
CPPFLAGS := $(CPPFLAGS) $(EXTRA_CFLAGS)
168 169
CFLAGS := $(CFLAGS) $(EXTRA_CFLAGS) -g
CXXFLAGS := $(CXXFLAGS) $(EXTRA_CFLAGS) -g
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
170 171 172 173 174 175 176 177 178 179 180
EXTRA_LDFLAGS += -L$(PREFIX)/lib
LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS)
# Do not export those! Use HOSTVARS.

ACLOCAL_AMFLAGS += -I$(PREFIX)/share/aclocal
export ACLOCAL_AMFLAGS

PKG_CONFIG ?= pkg-config
ifdef HAVE_CROSS_COMPILE
# This inhibits .pc file from within the cross-compilation toolchain sysroot.
# Hopefully, nobody ever needs that.
181 182
PKG_CONFIG_PATH := /usr/share/pkgconfig
PKG_CONFIG_LIBDIR := /usr/$(HOST)/lib/pkgconfig
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
183 184
export PKG_CONFIG_LIBDIR
endif
185
PKG_CONFIG_PATH := $(PKG_CONFIG_PATH):$(PREFIX)/lib/pkgconfig
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
186 187
export PKG_CONFIG_PATH

188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
ifndef GIT
ifeq ($(shell git --version >/dev/null 2>&1 || echo FAIL),)
GIT = git
endif
endif
GIT ?= $(error git not found!)

ifndef SVN
ifeq ($(shell svn --version >/dev/null 2>&1 || echo FAIL),)
SVN = svn
endif
endif
SVN ?= $(error subversion client (svn) not found!)

ifeq ($(shell curl --version >/dev/null 2>&1 || echo FAIL),)
203 204 205
download = curl -f -L -- "$(1)" > "$@"
else ifeq ($(shell wget --version >/dev/null 2>&1 || echo FAIL),)
download = rm -f $@.tmp && \
206
	wget --passive -c -p -O $@.tmp "$(1)" && \
207 208
	touch $@.tmp && \
	mv $@.tmp $@
209 210 211 212 213
else ifeq ($(which fetch >/dev/null 2>&1 || echo FAIL),)
download = rm -f $@.tmp && \
	fetch -p -o $@.tmp "$(1)" && \
	touch $@.tmp && \
	mv $@.tmp $@
214 215
else
download = $(error Neither curl nor wget found!)
216
endif
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
217

218 219 220 221 222 223 224 225
ifeq ($(shell gzcat --version >/dev/null 2>&1 || echo FAIL),)
ZCAT = gzcat
else ifeq ($(shell zcat --version >/dev/null 2>&1 || echo FAIL),)
ZCAT = zcat
else
ZCAT ?= $(error Gunzip client (zcat) not found!)
endif

226
ifeq ($(shell sha512sum --version >/dev/null 2>&1 || echo FAIL),)
227
SHA512SUM = sha512sum --check
228
else ifeq ($(shell shasum --version >/dev/null 2>&1 || echo FAIL),)
229 230 231
SHA512SUM = shasum -a 512 --check
else ifeq ($(shell openssl version >/dev/null 2>&1 || echo FAIL),)
SHA512SUM = openssl dgst -sha512
232 233 234 235
else
SHA512SUM = $(error SHA-512 checksumming not found!)
endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
236 237 238 239 240 241 242
#
# Common helpers
#
HOSTCONF := --prefix="$(PREFIX)"
HOSTCONF += --build="$(BUILD)" --host="$(HOST)" --target="$(HOST)"
HOSTCONF += --program-prefix=""
# libtool stuff:
243
HOSTCONF += --enable-static --disable-shared --disable-dependency-tracking
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
244 245
ifdef HAVE_WIN32
HOSTCONF += --without-pic
246
PIC :=
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
247 248
else
HOSTCONF += --with-pic
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
PIC := -fPIC
endif

HOSTTOOLS := \
	CC="$(CC)" CXX="$(CXX)" LD="$(LD)" \
	AR="$(AR)" RANLIB="$(RANLIB)" STRIP="$(STRIP)" \
	PATH="$(PREFIX)/bin:$(PATH)"
HOSTVARS := $(HOSTTOOLS) \
	CPPFLAGS="$(CPPFLAGS)" \
	CFLAGS="$(CFLAGS)" \
	CXXFLAGS="$(CXXFLAGS)" \
	LDFLAGS="$(LDFLAGS)"
HOSTVARS_PIC := $(HOSTTOOLS) \
	CPPFLAGS="$(CPPFLAGS) $(PIC)" \
	CFLAGS="$(CFLAGS) $(PIC)" \
	CXXFLAGS="$(CXXFLAGS) $(PIC)" \
	LDFLAGS="$(LDFLAGS)"
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
266

267 268 269
download_git = \
	rm -Rf $(@:.tar.xz=) && \
	$(GIT) clone $(2:%=--branch %) $(1) $(@:.tar.xz=) && \
270
	(cd $(@:.tar.xz=) && $(GIT) checkout $(3:%= %)) && \
271 272
	rm -Rf $(@:%.tar.xz=%)/.git && \
	(cd $(dir $@) && \
Rafaël Carré's avatar
Rafaël Carré committed
273
	tar cvJ $(notdir $(@:.tar.xz=))) > $@ && \
274
	rm -Rf $(@:.tar.xz=)
275 276 277 278
checksum = \
	$(foreach f,$(filter $(TARBALLS)/%,$^), \
		grep -- " $(f:$(TARBALLS)/%=%)$$" \
			"$(SRC)/$(patsubst .sum-%,%,$@)/$(2)SUMS" &&) \
279
	(cd $(TARBALLS) && $(1) /dev/stdin) < \
280
		"$(SRC)/$(patsubst .sum-%,%,$@)/$(2)SUMS"
281
CHECK_SHA512 = $(call checksum,$(SHA512SUM),SHA512)
282 283 284 285 286
UNPACK = $(RM) -R $@ \
	$(foreach f,$(filter %.tar.gz %.tgz,$^), && tar xvzf $(f)) \
	$(foreach f,$(filter %.tar.bz2,$^), && tar xvjf $(f)) \
	$(foreach f,$(filter %.tar.xz,$^), && tar xvJf $(f)) \
	$(foreach f,$(filter %.zip,$^), && unzip $(f))
287 288
UNPACK_DIR = $(basename $(basename $(notdir $<)))
APPLY = (cd $(UNPACK_DIR) && patch -p1) <
289
pkg_static = (cd $(UNPACK_DIR) && ../../../contrib/src/pkg-static.sh $(1))
290
MOVE = mv $(UNPACK_DIR) $@ && touch $@
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
291

292
AUTOMAKE_DATA_DIRS=$(foreach n,$(foreach n,$(subst :, ,$(shell echo $$PATH)),$(abspath $(n)/../share)),$(wildcard $(n)/automake*))
293 294
UPDATE_AUTOCONFIG = for dir in $(AUTOMAKE_DATA_DIRS); do \
		if test -f "$${dir}/config.sub" -a -f "$${dir}/config.guess"; then \
295
			cp "$${dir}/config.sub" "$${dir}/config.guess" $(UNPACK_DIR); \
296 297 298 299
			break; \
		fi; \
	done

300 301
RECONF = mkdir -p -- $(PREFIX)/share/aclocal && \
	cd $< && autoreconf -fiv $(ACLOCAL_AMFLAGS)
302 303 304
CMAKE = cmake . -DCMAKE_TOOLCHAIN_FILE=$(abspath toolchain.cmake) \
		-DCMAKE_INSTALL_PREFIX=$(PREFIX)

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
305 306 307
#
# Per-package build rules
#
308
PKGS_FOUND :=
309
include $(SRC)/*/rules.mak
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
310

311 312 313
ifeq ($(PKGS_DISABLE), all)
PKGS :=
endif
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
314 315 316
#
# Targets
#
317 318 319
ifneq ($(filter $(PKGS_DISABLE),$(PKGS_ENABLE)),)
$(error Same package(s) disabled and enabled at the same time)
endif
320 321 322 323 324 325 326
# Apply automatic selection (= remove distro packages):
PKGS_AUTOMATIC := $(filter-out $(PKGS_FOUND),$(PKGS))
# Apply manual selection (from bootstrap):
PKGS_MANUAL := $(sort $(PKGS_ENABLE) $(filter-out $(PKGS_DISABLE),$(PKGS_AUTOMATIC)))
# Resolve dependencies:
PKGS_DEPS := $(filter-out $(PKGS_FOUND) $(PKGS_MANUAL),$(sort $(foreach p,$(PKGS_MANUAL),$(DEPS_$(p)))))
PKGS := $(sort $(PKGS_MANUAL) $(PKGS_DEPS))
327

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
328
fetch: $(PKGS:%=.sum-%)
329
fetch-all: $(PKGS_ALL:%=.sum-%)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
330 331 332
install: $(PKGS:%=.%)

mostlyclean:
333
	-$(RM) $(foreach p,$(PKGS_ALL),.$(p) .sum-$(p) .dep-$(p))
334
	-$(RM) toolchain.cmake
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
335
	-$(RM) -R "$(PREFIX)"
336
	-$(RM) -R */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
337 338 339 340 341 342 343 344

clean: mostlyclean
	-$(RM) $(TARBALLS)/*.*

distclean: clean
	$(RM) config.mak
	unlink Makefile

345
PREBUILT_URL=ftp://ftp.videolan.org/pub/videolan/contrib/$(HOST)/vlc-contrib-$(HOST)-latest.tar.bz2
346

347
vlc-contrib-$(HOST)-latest.tar.bz2:
348 349
	$(call download,$(PREBUILT_URL))

350
prebuilt: vlc-contrib-$(HOST)-latest.tar.bz2
351 352
	-$(UNPACK)
	mv $(HOST) $(TOPDST)
353
	cd $(TOPDST)/$(HOST) && $(SRC)/change_prefix.sh
354

355
package: install
356 357 358 359 360 361 362
	rm -Rf tmp/
	mkdir -p tmp/
	cp -r $(PREFIX) tmp/
	# remove useless files
	cd tmp/$(notdir $(PREFIX)); \
		cd share; rm -Rf man doc gtk-doc info lua projectM gettext; cd ..; \
		rm -Rf man sbin etc lib/lua lib/sidplay
363
	cd tmp/$(notdir $(PREFIX)) && $(abspath $(SRC))/change_prefix.sh $(PREFIX) @@CONTRIB_PREFIX@@
364
	(cd tmp && tar c $(notdir $(PREFIX))/) | bzip2 -c > ../vlc-contrib-$(HOST)-$(DATE).tar.bz2
365

366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
list:
	@echo All packages:
	@echo '  $(PKGS_ALL)' | fmt
	@echo Distribution-provided packages:
	@echo '  $(PKGS_FOUND)' | fmt
	@echo Automatically selected packages:
	@echo '  $(PKGS_AUTOMATIC)' | fmt
	@echo Manually deselected packages:
	@echo '  $(PKGS_DISABLE)' | fmt
	@echo Manually selected packages:
	@echo '  $(PKGS_ENABLE)' | fmt
	@echo Depended-on packages:
	@echo '  $(PKGS_DEPS)' | fmt
	@echo To-be-built packages:
	@echo '  $(PKGS)' | fmt

382
.PHONY: all fetch fetch-all install mostlyclean clean distclean package list prebuilt
383

384 385 386 387 388 389 390
# CMake toolchain
toolchain.cmake:
	$(RM) $@
ifdef HAVE_WIN32
	echo "set(CMAKE_SYSTEM_NAME Windows)" >> $@
	echo "set(CMAKE_RC_COMPILER $(HOST)-windres)" >> $@
endif
391
ifdef HAVE_DARWIN_OS
392 393
	echo "set(CMAKE_SYSTEM_NAME Darwin)" >> $@
	echo "set(CMAKE_C_FLAGS $(CFLAGS))" >> $@
394
	echo "set(CMAKE_CXX_FLAGS $(CFLAGS))" >> $@
395 396 397 398 399 400 401 402 403
	echo "set(CMAKE_LD_FLAGS $(LDFLAGS))" >> $@
endif
	echo "set(CMAKE_C_COMPILER $(CC))" >> $@
	echo "set(CMAKE_CXX_COMPILER $(CXX))" >> $@
	echo "set(CMAKE_FIND_ROOT_PATH $(PREFIX))" >> $@
	echo "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> $@
	echo "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> $@
	echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> $@

404 405 406 407 408
# Default pattern rules
.sum-%: $(SRC)/%/SHA512SUMS
	$(CHECK_SHA512)
	touch $@

409 410 411
.sum-%:
	$(error Download and check target not defined for $*)

412 413 414 415 416 417 418 419 420 421 422 423 424
# Dummy dependency on found packages
$(patsubst %,.dep-%,$(PKGS_FOUND)): .dep-%:
	touch $@

# Real dependency on missing packages
$(patsubst %,.dep-%,$(filter-out $(PKGS_FOUND),$(PKGS_ALL))): .dep-%: .%
	touch -r $< $@

.SECONDEXPANSION:

# Dependency propagation (convert 'DEPS_foo = bar' to '.foo: .bar')
$(foreach p,$(PKGS_ALL),.$(p)): .%: $$(foreach d,$$(DEPS_$$*),.dep-$$(d))

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
425
.DELETE_ON_ERROR: