1 # Main makefile for VLC 3rd party libraries ("contrib")
2 # Copyright (C) 2003-2011 the VideoLAN team
4 # This file is under the same license as the vlc package.
9 SRC_BUILT
:= $(TOPSRC_BUILT
)/src
10 TARBALLS
:= $(TOPSRC
)/tarballs
11 VLC_TOOLS ?
= $(TOPSRC
)/..
/extras
/tools
/build
13 PATH
:=$(abspath
$(VLC_TOOLS
)/bin
):$(PATH
)
16 PKGS_ALL
:= $(patsubst $(SRC
)/%/rules.mak
,%,$(wildcard $(SRC
)/*/rules.mak
))
17 DATE
:= $(shell date
+%Y
%m
%d
)
20 # Common download locations
21 GNU ?
= http
://ftp.gnu.org
/gnu
22 SF
:= https
://netcologne.dl.sourceforge.net
/
23 VIDEOLAN
:= http
://downloads.videolan.org
/pub
/videolan
24 CONTRIB_VIDEOLAN
:= http
://downloads.videolan.org
/pub
/contrib
25 GITHUB
:= https
://github.com
/
28 # Machine-dependent variables
31 PREFIX ?
= $(TOPDST
)/$(HOST
)
32 PREFIX
:= $(abspath
$(PREFIX
))
33 BUILDPREFIX ?
= $(TOPDST
)
34 BUILDPREFIX
:= $(abspath
$(BUILDPREFIX
))
35 BUILDBINDIR ?
= $(BUILDPREFIX
)/bin
36 ifneq ($(HOST
),$(BUILD
))
37 HAVE_CROSS_COMPILE
= 1
39 ARCH
:= $(shell $(SRC
)/get-arch.sh
$(HOST
))
41 ifeq ($(ARCH
)-$(HAVE_WIN32
),x86_64-1
)
44 ifeq ($(ARCH
)-$(HAVE_WIN32
),aarch64-1
)
48 ifdef HAVE_CROSS_COMPILE
51 ifeq ($(findstring mingw32
,$(BUILD
)),mingw32
)
52 need_pkg
= $(shell PKG_CONFIG_LIBDIR
="${PKG_CONFIG_PATH}" $(PKG_CONFIG
) $(1) || echo
1)
54 need_pkg
= $(shell $(PKG_CONFIG
) $(1) || echo
1)
58 ifeq ($(findstring mingw32
,$(BUILD
)),mingw32
)
61 ifeq ($(findstring msys
,$(BUILD
)),msys
)
66 # Default values for tools
68 ifndef HAVE_CROSS_COMPILE
69 ifneq ($(findstring $(origin CC
),undefined default
),)
72 ifneq ($(findstring $(origin CXX
),undefined default
),)
75 ifneq ($(findstring $(origin LD
),undefined default
),)
78 ifneq ($(findstring $(origin AR
),undefined default
),)
81 ifneq ($(findstring $(origin RANLIB
),undefined default
),)
84 ifneq ($(findstring $(origin STRIP
),undefined default
),)
87 ifneq ($(findstring $(origin WIDL
),undefined default
),)
90 ifneq ($(findstring $(origin WINDRES
),undefined default
),)
94 ifneq ($(findstring $(origin CC
),undefined default
),)
97 ifneq ($(findstring $(origin CXX
),undefined default
),)
100 ifneq ($(findstring $(origin LD
),undefined default
),)
103 ifneq ($(findstring $(origin AR
),undefined default
),)
106 ifneq ($(findstring $(origin RANLIB
),undefined default
),)
107 RANLIB
:= $(HOST
)-ranlib
109 ifneq ($(findstring $(origin STRIP
),undefined default
),)
110 STRIP
:= $(HOST
)-strip
112 ifneq ($(findstring $(origin WIDL
),undefined default
),)
115 ifneq ($(findstring $(origin WINDRES
),undefined default
),)
116 WINDRES
:= $(HOST
)-windres
121 ifneq ($(findstring $(origin CC
),undefined default
),)
124 ifneq ($(findstring $(origin CXX
),undefined default
),)
130 EXTRA_CXXFLAGS
+= -stdlib
=libc
++
131 ifeq ($(ARCH
),x86_64
)
133 EXTRA_LDFLAGS
+= -m64
136 EXTRA_LDFLAGS
+= -m32
139 XCODE_FLAGS
+= -arch
$(ARCH
)
147 AS
=perl
$(abspath
$(VLC_TOOLS
)/bin
/gas-preprocessor.pl
) $(CC
)
148 CCAS
=gas-preprocessor.pl
$(CC
) -c
154 ifneq ($(shell $(CC
) $(CFLAGS
) -E
-dM
-include _mingw.h
- < /dev
/null | grep
-E __MINGW64_VERSION_MAJOR
),)
157 ifndef HAVE_CROSS_COMPILE
163 ifeq ($(ARCH
),x86_64
)
165 EXTRA_LDFLAGS
+= -m64
168 EXTRA_LDFLAGS
+= -m32
173 EXTRA_CFLAGS
+= -DWINSTORECOMPAT
174 EXTRA_LDFLAGS
+= -lwinstorecompat
177 ifneq ($(findstring clang
, $(shell $(CC
) --version
2>/dev
/null
)),)
181 cppcheck
= $(shell $(CC
) $(CFLAGS
) -E
-dM
- < /dev
/null | grep
-E
$(1))
183 EXTRA_CFLAGS
+= -I
$(PREFIX
)/include
184 CPPFLAGS
:= $(CPPFLAGS
) $(EXTRA_CFLAGS
)
185 CFLAGS
:= $(CFLAGS
) $(EXTRA_CFLAGS
)
186 CXXFLAGS
:= $(CXXFLAGS
) $(EXTRA_CFLAGS
) $(EXTRA_CXXFLAGS
)
187 LDFLAGS
:= $(LDFLAGS
) -L
$(PREFIX
)/lib
$(EXTRA_LDFLAGS
)
190 CFLAGS
:= $(CFLAGS
) -gcodeview
191 CXXFLAGS
:= $(CXXFLAGS
) -gcodeview
194 # Do not export those! Use HOSTVARS.
196 # Do the FPU detection, after we have figured out our compilers and flags.
197 ifneq ($(findstring $(ARCH
),aarch64 i386 ppc ppc64 sparc sparc64 x86_64
),)
198 # This should be consistent with include/vlc_cpu.h
200 else ifneq ($(findstring $(ARCH
),arm
),)
201 ifneq ($(call cppcheck
, __VFP_FP__
)),)
202 ifeq ($(call cppcheck
, __SOFTFP__
),)
206 else ifneq ($(call cppcheck
, __mips_hard_float
),)
210 ACLOCAL_AMFLAGS
+= -I
$(PREFIX
)/share
/aclocal
211 ifneq ($(wildcard $(VLC_TOOLS
)/share
/aclocal
/*),)
212 ACLOCAL_AMFLAGS
+= -I
$(abspath
$(VLC_TOOLS
)/share
/aclocal
)
214 export ACLOCAL_AMFLAGS
220 PKG_CONFIG ?
= pkg-config
221 ifdef HAVE_CROSS_COMPILE
222 # This inhibits .pc file from within the cross-compilation toolchain sysroot.
223 # Hopefully, nobody ever needs that.
224 PKG_CONFIG_PATH
:= /usr
/share
/pkgconfig
225 PKG_CONFIG_LIBDIR
:= /usr
/$(HOST
)/lib
/pkgconfig
226 export PKG_CONFIG_LIBDIR
228 PKG_CONFIG_PATH
:= $(PREFIX
)/lib
/pkgconfig
:$(PKG_CONFIG_PATH
)
229 ifeq ($(findstring mingw32
,$(BUILD
)),mingw32
)
230 PKG_CONFIG_PATH
:= $(shell cygpath
-pm
${PKG_CONFIG_PATH})
232 export PKG_CONFIG_PATH
235 ifeq ($(shell git
--version
>/dev
/null
2>&1 || echo FAIL
),)
239 GIT ?
= $(error git not found
)
242 ifeq ($(shell svn
--version
>/dev
/null
2>&1 || echo FAIL
),)
246 SVN ?
= $(error subversion client
(svn
) not found
)
248 ifeq ($(shell curl
--version
>/dev
/null
2>&1 || echo FAIL
),)
249 download
= curl
-f
-L
-- "$(1)" > "$@"
250 else ifeq ($(shell wget
--version
>/dev
/null
2>&1 || echo FAIL
),)
251 download
= (rm -f
$@.tmp
&& \
252 wget
--passive
-c
-p
-O
$@.tmp
"$(1)" && \
255 else ifeq ($(which fetch
>/dev
/null
2>&1 || echo FAIL
),)
256 download
= (rm -f
$@.tmp
&& \
257 fetch
-p
-o
$@.tmp
"$(1)" && \
261 download
= $(error Neither curl nor wget found
)
264 download_pkg
= $(call download
,$(CONTRIB_VIDEOLAN
)/$(2)/$(lastword
$(subst /, ,$(@
)))) || \
265 ( $(call download
,$(1)) && echo
"Please upload this package $(lastword $(subst /, ,$(@))) to our FTP" )
267 ifeq ($(shell which xz
>/dev
/null
2>&1 || echo FAIL
),)
270 XZ ?
= $(error XZ
(LZMA
) compressor not found
)
273 ifeq ($(shell sha512sum
--version
>/dev
/null
2>&1 || echo FAIL
),)
274 SHA512SUM
= sha512sum
--check
275 else ifeq ($(shell shasum
--version
>/dev
/null
2>&1 || echo FAIL
),)
276 SHA512SUM
= shasum
-a
512 --check
277 else ifeq ($(shell openssl version
>/dev
/null
2>&1 || echo FAIL
),)
278 SHA512SUM
= openssl dgst
-sha512
280 SHA512SUM
= $(error SHA-512 checksumming not found
)
283 ifeq ($(shell protoc
--version
>/dev
/null
2>&1 || echo FAIL
),)
286 PROTOC ?
= $(error Protobuf compiler
(protoc
) not found
)
292 HOSTCONF
:= --prefix="$(PREFIX)"
293 HOSTCONF
+= --datarootdir
="$(PREFIX)/share"
294 HOSTCONF
+= --includedir="$(PREFIX)/include"
295 HOSTCONF
+= --libdir="$(PREFIX)/lib"
296 HOSTCONF
+= --build
="$(BUILD)" --host
="$(HOST)" --target
="$(HOST)"
297 HOSTCONF
+= --program-prefix
=""
299 HOSTCONF
+= --enable-static
--disable-shared
--disable-dependency-tracking
301 HOSTCONF
+= --without-pic
304 HOSTCONF
+= --with-pic
308 # For cross-compilation with meson, do not set compiler and flags
309 # in HOSTVARS as meson will always use them for the BUILD machine compiler!
310 MESON_HOST_FLAGS
:= \
311 CPPFLAGS
="$(CPPFLAGS)" \
313 CXXFLAGS
="$(CXXFLAGS)" \
315 ifdef HAVE_CROSS_COMPILE
316 HOSTVARS_MESON
:= PATH
="$(PREFIX)/bin:$(PATH)"
318 HOSTVARS_MESON
:= $(HOSTTOOLS
) $(MESON_HOST_FLAGS
)
321 # Add these flags after Meson consumed the CFLAGS/CXXFLAGS
322 ifndef WITH_OPTIMIZATION
323 CFLAGS
:= $(CFLAGS
) -g
-O0
324 CXXFLAGS
:= $(CXXFLAGS
) -g
-O0
326 CFLAGS
:= $(CFLAGS
) -g
-O2
327 CXXFLAGS
:= $(CXXFLAGS
) -g
-O2
331 CC
="$(CC)" CXX
="$(CXX)" LD
="$(LD)" \
332 AR
="$(AR)" CCAS
="$(CCAS)" RANLIB
="$(RANLIB)" STRIP
="$(STRIP)" \
333 PATH
="$(PREFIX)/bin:$(PATH)"
334 HOSTVARS
:= $(HOSTTOOLS
) \
335 CPPFLAGS
="$(CPPFLAGS)" \
337 CXXFLAGS
="$(CXXFLAGS)" \
339 HOSTVARS_PIC
:= $(HOSTTOOLS
) \
340 CPPFLAGS
="$(CPPFLAGS) $(PIC)" \
341 CFLAGS
="$(CFLAGS) $(PIC)" \
342 CXXFLAGS
="$(CXXFLAGS) $(PIC)" \
346 rm -Rf
-- "$(@:.tar.xz=)" && \
347 $(GIT
) init
--bare
"$(@:.tar.xz=)" && \
348 (cd
"$(@:.tar.xz=)" && \
349 $(GIT
) remote add
origin "$(1)" && \
350 $(GIT
) fetch
origin "$(2)") && \
351 (cd
"$(@:.tar.xz=)" && \
352 $(GIT
) archive
--prefix="$(notdir $(@:.tar.xz=))/" \
353 --format
=tar "$(3)") > "$(@:.xz=)" && \
354 echo
"$(3) $(@)" > "$(@:.tar.xz=.githash)" && \
355 rm -Rf
-- "$(@:.tar.xz=)" && \
356 $(XZ
) --stdout
"$(@:.xz=)" > "$@.tmp" && \
357 rm -f
"$(@:.xz=)" && \
358 mv
-f
-- "$@.tmp" "$@"
360 h
=`sed -e "s,^\([0-9a-fA-F]\{40\}\) .*/$(notdir $<),\1,g" \
361 < "$(<:.tar.xz=.githash)"` && \
365 $(foreach f
,$(filter $(TARBALLS
)/%,$^
), \
366 grep
-- " $(f:$(TARBALLS)/%=%)$$" \
367 "$(SRC)/$(patsubst .sum-%,%,$@)/$(2)SUMS" &&) \
368 (cd
$(TARBALLS
) && $(1) /dev
/stdin
) < \
369 "$(SRC)/$(patsubst .sum-%,%,$@)/$(2)SUMS"
370 CHECK_SHA512
= $(call checksum
,$(SHA512SUM
),SHA512
)
371 UNPACK
= $(RM
) -R
$@ \
372 $(foreach f
,$(filter %.
tar.gz
%.tgz
,$^
), && tar xvzfo
$(f
)) \
373 $(foreach f
,$(filter %.
tar.bz2
,$^
), && tar xvjfo
$(f
)) \
374 $(foreach f
,$(filter %.
tar.xz
,$^
), && tar xvJfo
$(f
)) \
375 $(foreach f
,$(filter %.zip
,$^
), && unzip
$(f
))
376 UNPACK_DIR
= $(patsubst %.
tar,%,$(basename $(notdir $<)))
377 APPLY
= (cd
$(UNPACK_DIR
) && patch
-fp1
) <
378 pkg_static
= (cd
$(UNPACK_DIR
) && $(SRC_BUILT
)/pkg-static.sh
$(1))
379 MOVE
= mv
$(UNPACK_DIR
) $@
&& touch
$@
381 AUTOMAKE_DATA_DIRS
=$(foreach n
,$(foreach n
,$(subst :, ,$(shell echo
$$PATH)),$(abspath
$(n
)/..
/share
)),$(wildcard $(n
)/automake
*))
382 UPDATE_AUTOCONFIG
= for
dir in
$(AUTOMAKE_DATA_DIRS
); do \
383 if
test -f
"$${dir}/config.sub" -a
-f
"$${dir}/config.guess"; then \
384 cp
"$${dir}/config.sub" "$${dir}/config.guess" $(UNPACK_DIR
); \
390 AUTORECONF
= AUTOPOINT
=true autoreconf
392 AUTORECONF
= autoreconf
394 RECONF
= mkdir
-p
-- $(PREFIX
)/share
/aclocal
&& \
395 cd
$< && $(AUTORECONF
) -fiv
$(ACLOCAL_AMFLAGS
)
396 CMAKE
= cmake .
-DCMAKE_TOOLCHAIN_FILE
=$(abspath toolchain.cmake
) \
397 -DCMAKE_INSTALL_PREFIX
=$(PREFIX
) $(CMAKE_GENERATOR
) -DCMAKE_DEBUG_POSTFIX
:STRING
=
399 CMAKE
+= -DCMAKE_LINK_LIBRARY_SUFFIX
:STRING
=.a
403 CMAKE
+= -DCMAKE_VERBOSE_MAKEFILE
:BOOL
=ON
406 MESON
= meson
--default-library static
--prefix "$(PREFIX)" --backend ninja \
408 ifndef WITH_OPTIMIZATION
409 MESON
+= --buildtype debug
411 MESON
+= --buildtype release
414 ifdef HAVE_CROSS_COMPILE
415 MESON
+= --cross-file
$(abspath crossfile.meson
)
421 REQUIRE_GPL
= @echo
"Package \"$<\" requires the GPL license." >&2; exit
1
427 @echo
"Package \"$<\" requires the version 3 of GNU licenses." >&2; \
432 # Per-package build rules
435 include $(SRC
)/*/rules.mak
437 ifeq ($(PKGS_DISABLE
), all)
443 ifneq ($(filter $(PKGS_DISABLE
),$(PKGS_ENABLE
)),)
444 $(error Same package
(s
) disabled and enabled at the same time
)
446 # Apply automatic selection (= remove distro packages):
447 PKGS_AUTOMATIC
:= $(filter-out $(PKGS_FOUND
),$(PKGS
))
448 # Apply manual selection (from bootstrap):
449 PKGS_MANUAL
:= $(sort $(PKGS_ENABLE
) $(filter-out $(PKGS_DISABLE
),$(PKGS_AUTOMATIC
)))
450 # Resolve dependencies:
451 PKGS_DEPS
:= $(filter-out $(PKGS_FOUND
) $(PKGS_MANUAL
),$(sort $(foreach p
,$(PKGS_MANUAL
),$(DEPS_
$(p
)))))
452 PKGS
:= $(sort $(PKGS_MANUAL
) $(PKGS_DEPS
))
454 fetch
: $(PKGS
:%=.sum-
%)
455 fetch-all
: $(PKGS_ALL
:%=.sum-
%)
456 install: $(PKGS
:%=.
%)
459 -$(RM
) $(foreach p
,$(PKGS_ALL
),.
$(p
) .sum-
$(p
) .dep-
$(p
))
460 -$(RM
) toolchain.cmake
461 -$(RM
) crossfile.meson
462 -$(RM
) -R
"$(PREFIX)"
463 -$(RM
) -R
"$(BUILDBINDIR)"
467 -$(RM
) $(TARBALLS
)/*.
*
473 PREBUILT_URL
=http
://download.videolan.org
/pub
/videolan
/contrib
/$(HOST
)/vlc-contrib-
$(HOST
)-latest.
tar.bz2
475 vlc-contrib-
$(HOST
)-latest.
tar.bz2
:
476 $(call download
,$(PREBUILT_URL
))
478 prebuilt
: vlc-contrib-
$(HOST
)-latest.
tar.bz2
482 cd
$(PREFIX
) && $(SRC
)/change_prefix.sh
484 ifndef HAVE_CROSS_COMPILE
485 $(RM
) `find $(PREFIX)/bin | file -f- | grep ELF | awk -F: '{print $$1}' | xargs`
493 # remove useless files
494 cd tmp
/$(notdir $(PREFIX
)); \
495 cd share
; rm -Rf man doc gtk-doc
info lua projectM
; cd ..
; \
496 rm -Rf man sbin etc lib
/lua lib
/sidplay
497 cd tmp
/$(notdir $(PREFIX
)) && $(abspath
$(SRC
))/change_prefix.sh
$(PREFIX
) @@CONTRIB_PREFIX@@
498 (cd tmp
&& tar c
$(notdir $(PREFIX
))/) | bzip2
-c
> ..
/vlc-contrib-
$(HOST
)-$(DATE
).
tar.bz2
502 @echo
' $(PKGS_ALL)' | tr
" " "\n" |
sort | tr
"\n" " " |fmt
503 @echo Distribution-provided packages
:
504 @echo
' $(PKGS_FOUND)' | tr
" " "\n" |
sort | tr
"\n" " " |fmt
505 @echo Automatically selected packages
:
506 @echo
' $(PKGS_AUTOMATIC)' | tr
" " "\n" |
sort | tr
"\n" " " |fmt
507 @echo Manually deselected packages
:
508 @echo
' $(PKGS_DISABLE)' | tr
" " "\n" |
sort | tr
"\n" " " |fmt
509 @echo Manually selected packages
:
510 @echo
' $(PKGS_ENABLE)' | tr
" " "\n" |
sort | tr
"\n" " " |fmt
511 @echo Depended-on packages
:
512 @echo
' $(PKGS_DEPS)' | tr
" " "\n" |
sort | tr
"\n" " " |fmt
513 @echo To-be-built packages
:
514 @echo
' $(PKGS)' | tr
" " "\n" |
sort | tr
"\n" " " |fmt
519 .PHONY
: all fetch fetch-all
install mostlyclean clean distclean package list help prebuilt
523 CMAKE_SYSTEM_NAME
= Windows
524 ifdef HAVE_VISUALSTUDIO
526 CMAKE_SYSTEM_NAME
= WindowsStore
528 ifdef HAVE_WINDOWSPHONE
529 CMAKE_SYSTEM_NAME
= WindowsPhone
534 CMAKE_SYSTEM_NAME
= Darwin
540 ifndef WITH_OPTIMIZATION
541 echo
"set(CMAKE_BUILD_TYPE Debug)" >> $@
543 echo
"set(CMAKE_BUILD_TYPE Release)" >> $@
545 echo
"set(CMAKE_SYSTEM_PROCESSOR $(ARCH))" >> $@
546 if
test -n
"$(CMAKE_SYSTEM_NAME)"; then \
547 echo
"set(CMAKE_SYSTEM_NAME $(CMAKE_SYSTEM_NAME))" >> $@
; \
550 ifdef HAVE_CROSS_COMPILE
551 echo
"set(CMAKE_RC_COMPILER $(WINDRES))" >> $@
555 echo
"set(CMAKE_C_FLAGS \"$(CFLAGS)\")" >> $@
556 echo
"set(CMAKE_CXX_FLAGS \"$(CXXFLAGS)\")" >> $@
557 echo
"set(CMAKE_LD_FLAGS \"$(LDFLAGS)\")" >> $@
558 echo
"set(CMAKE_AR ar CACHE FILEPATH \"Archiver\")" >> $@
560 echo
"set(CMAKE_OSX_SYSROOT $(IOS_SDK))" >> $@
562 echo
"set(CMAKE_OSX_SYSROOT $(MACOSX_SDK))" >> $@
565 echo
"set(CMAKE_AR $(AR) CACHE FILEPATH \"Archiver\")" >> $@
567 ifdef HAVE_CROSS_COMPILE
568 echo
"set(_CMAKE_TOOLCHAIN_PREFIX $(HOST)-)" >> $@
570 # cmake will overwrite our --sysroot with a native (host) one on Darwin
571 # Set it to "" right away to short-circuit this behaviour
572 echo
"set(CMAKE_CXX_SYSROOT_FLAG \"\")" >> $@
573 echo
"set(CMAKE_C_SYSROOT_FLAG \"\")" >> $@
576 echo
"set(CMAKE_C_COMPILER $(CC))" >> $@
577 echo
"set(CMAKE_CXX_COMPILER $(CXX))" >> $@
579 echo
"set(CMAKE_FIND_ROOT_PATH `cygpath -m $(PREFIX)`)" >> $@
581 echo
"set(CMAKE_FIND_ROOT_PATH $(PREFIX))" >> $@
583 echo
"set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> $@
584 ifdef HAVE_CROSS_COMPILE
585 echo
"set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> $@
586 echo
"set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> $@
587 echo
"set(PKG_CONFIG_EXECUTABLE $(PKG_CONFIG))" >> $@
592 MESON_SYSTEM_NAME
= windows
595 MESON_SYSTEM_NAME
= darwin
598 # android has also system = linux and defines HAVE_LINUX
599 MESON_SYSTEM_NAME
= linux
604 crossfile.meson
: $(SRC
)/gen-meson-crossfile.py
606 $(MESON_HOST_FLAGS
) \
607 WINDRES
="$(WINDRES)" \
608 PKG_CONFIG
="$(PKG_CONFIG)" \
609 HOST_SYSTEM
="$(MESON_SYSTEM_NAME)" \
610 HOST_ARCH
="$(subst i386,x86,$(ARCH))" \
612 $(SRC
)/gen-meson-crossfile.py
$@
615 # Default pattern rules
616 .sum-
%: $(SRC
)/%/SHA512SUMS
621 $(error Download and
check target not defined for
$*)
623 # Dummy dependency on found packages
624 $(patsubst %,.dep-
%,$(PKGS_FOUND
)): .dep-
%:
627 # Real dependency on missing packages
628 $(patsubst %,.dep-
%,$(filter-out $(PKGS_FOUND
),$(PKGS_ALL
))): .dep-
%: .
%
633 # Dependency propagation (convert 'DEPS_foo = bar' to '.foo: .bar')
634 $(foreach p
,$(PKGS_ALL
),.
$(p
)): .
%: $$(foreach d
,$$(DEPS_
$$*),.dep-
$$(d
))