1#
2# Copyright (C) 2006-2012 OpenWrt.org
3#
4# This is free software, licensed under the GNU General Public License v2.
5# See /LICENSE for more information.
6#
7
8OPENWRT_GIT = http://git.openwrt.org
9
10ifdef PKG_SOURCE_VERSION
11PKG_VERSION ?= $(if $(PKG_SOURCE_DATE),$(PKG_SOURCE_DATE)-)$(call version_abbrev,$(PKG_SOURCE_VERSION))
12PKG_SOURCE_SUBDIR ?= $(PKG_NAME)-$(PKG_VERSION)
13PKG_SOURCE ?= $(PKG_SOURCE_SUBDIR).tar.xz
14endif
15
16DOWNLOAD_RDEP=$(STAMP_PREPARED) $(HOST_STAMP_PREPARED)
17
18# Try to guess the download method from the URL
19define dl_method
20$(strip \
21  $(if $(2),$(2), \
22    $(if $(filter @APACHE/% @GITHUB/% @GNOME/% @GNU/% @KERNEL/% @SF/% @SAVANNAH/% ftp://% http://% https://% file://%,$(1)),default, \
23      $(if $(filter git://%,$(1)),git, \
24        $(if $(filter svn://%,$(1)),svn, \
25          $(if $(filter cvs://%,$(1)),cvs, \
26            $(if $(filter hg://%,$(1)),hg, \
27              $(if $(filter sftp://%,$(1)),bzr, \
28                unknown \
29              ) \
30            ) \
31          ) \
32        ) \
33      ) \
34    ) \
35  ) \
36)
37endef
38
39# code for creating tarballs from cvs/svn/git/bzr/hg/darcs checkouts - useful for mirror support
40dl_pack/bz2=$(TAR) cjf $(1) $(2)
41dl_pack/gz=$(TAR) czf $(1) $(2)
42dl_pack/xz=$(TAR) c $(2) | xz -zc > $(1)
43dl_pack/unknown=echo "ERROR: Unknown pack format for file $(1)"; false
44define dl_pack
45	$(if $(dl_pack/$(call ext,$(1))),$(dl_pack/$(call ext,$(1))),$(dl_pack/unknown))
46endef
47
48define DownloadMethod/unknown
49	@echo "ERROR: No download method available"; false
50endef
51
52define DownloadMethod/default
53	$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(HASH)" "$(URL_FILE)" $(foreach url,$(URL),"$(url)")
54endef
55
56define wrap_mirror
57$(if $(if $(MIRROR),$(filter-out x,$(MIRROR_HASH))),$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(MIRROR_HASH)" "" || ( $(1) ),$(1))
58endef
59
60define DownloadMethod/cvs
61	$(call wrap_mirror, \
62		echo "Checking out files from the cvs repository..."; \
63		mkdir -p $(TMP_DIR)/dl && \
64		cd $(TMP_DIR)/dl && \
65		rm -rf $(SUBDIR) && \
66		[ \! -d $(SUBDIR) ] && \
67		cvs -d $(URL) export $(VERSION) $(SUBDIR) && \
68		echo "Packing checkout..." && \
69		$(call dl_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \
70		mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \
71		rm -rf $(SUBDIR); \
72	)
73endef
74
75define DownloadMethod/svn
76	$(call wrap_mirror, \
77		echo "Checking out files from the svn repository..."; \
78		mkdir -p $(TMP_DIR)/dl && \
79		cd $(TMP_DIR)/dl && \
80		rm -rf $(SUBDIR) && \
81		[ \! -d $(SUBDIR) ] && \
82		( svn help export | grep -q trust-server-cert && \
83		svn export --non-interactive --trust-server-cert -r$(VERSION) $(URL) $(SUBDIR) || \
84		svn export --non-interactive -r$(VERSION) $(URL) $(SUBDIR) ) && \
85		echo "Packing checkout..." && \
86		$(call dl_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \
87		mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \
88		rm -rf $(SUBDIR); \
89	)
90endef
91
92define DownloadMethod/git
93	$(call wrap_mirror, \
94		echo "Checking out files from the git repository..."; \
95		mkdir -p $(TMP_DIR)/dl && \
96		cd $(TMP_DIR)/dl && \
97		rm -rf $(SUBDIR) && \
98		[ \! -d $(SUBDIR) ] && \
99		git clone $(URL) $(SUBDIR) && \
100		(cd $(SUBDIR) && git checkout $(VERSION) && \
101		git submodule update --init --recursive) && \
102		echo "Packing checkout..." && \
103		rm -rf $(SUBDIR)/.git && \
104		$(call dl_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \
105		mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \
106		rm -rf $(SUBDIR); \
107	)
108endef
109
110define DownloadMethod/bzr
111	$(call wrap_mirror, \
112		echo "Checking out files from the bzr repository..."; \
113		mkdir -p $(TMP_DIR)/dl && \
114		cd $(TMP_DIR)/dl && \
115		rm -rf $(SUBDIR) && \
116		[ \! -d $(SUBDIR) ] && \
117		bzr export -r$(VERSION) $(SUBDIR) $(URL) && \
118		echo "Packing checkout..." && \
119		$(call dl_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \
120		mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \
121		rm -rf $(SUBDIR); \
122	)
123endef
124
125define DownloadMethod/hg
126	$(call wrap_mirror, \
127		echo "Checking out files from the hg repository..."; \
128		mkdir -p $(TMP_DIR)/dl && \
129		cd $(TMP_DIR)/dl && \
130		rm -rf $(SUBDIR) && \
131		[ \! -d $(SUBDIR) ] && \
132		hg clone -r $(VERSION) $(URL) $(SUBDIR) && \
133		find $(SUBDIR) -name .hg | xargs rm -rf && \
134		echo "Packing checkout..." && \
135		$(call dl_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \
136		mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \
137		rm -rf $(SUBDIR); \
138	)
139endef
140
141define DownloadMethod/darcs
142	$(call wrap_mirror, \
143		echo "Checking out files from the darcs repository..."; \
144		mkdir -p $(TMP_DIR)/dl && \
145		cd $(TMP_DIR)/dl && \
146		rm -rf $(SUBDIR) && \
147		[ \! -d $(SUBDIR) ] && \
148		darcs get -t $(VERSION) $(URL) $(SUBDIR) && \
149		find $(SUBDIR) -name _darcs | xargs rm -rf && \
150		echo "Packing checkout..." && \
151		$(call dl_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \
152		mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \
153		rm -rf $(SUBDIR); \
154	)
155endef
156
157Validate/cvs=VERSION SUBDIR
158Validate/svn=VERSION SUBDIR
159Validate/git=VERSION SUBDIR
160Validate/bzr=VERSION SUBDIR
161Validate/hg=VERSION SUBDIR
162Validate/darcs=VERSION SUBDIR
163
164define Download/Defaults
165  URL:=
166  FILE:=
167  URL_FILE:=
168  PROTO:=
169  HASH=$$(MD5SUM)
170  MD5SUM:=x
171  SUBDIR:=
172  MIRROR:=1
173  MIRROR_HASH=$$(MIRROR_MD5SUM)
174  MIRROR_MD5SUM:=x
175  VERSION:=
176endef
177
178define Download/default
179  FILE:=$(PKG_SOURCE)
180  URL:=$(PKG_SOURCE_URL)
181  SUBDIR:=$(PKG_SOURCE_SUBDIR)
182  PROTO:=$(PKG_SOURCE_PROTO)
183  $(if $(PKG_SOURCE_MIRROR),MIRROR:=$(filter 1,$(PKG_MIRROR)))
184  $(if $(PKG_MIRROR_MD5SUM),MIRROR_MD5SUM:=$(PKG_MIRROR_MD5SUM))
185  $(if $(PKG_MIRROR_HASH),MIRROR_HASH:=$(PKG_MIRROR_HASH))
186  VERSION:=$(PKG_SOURCE_VERSION)
187  $(if $(PKG_MD5SUM),MD5SUM:=$(PKG_MD5SUM))
188  $(if $(PKG_HASH),HASH:=$(PKG_HASH))
189endef
190
191define Download
192  $(eval $(Download/Defaults))
193  $(eval $(Download/$(1)))
194  $(foreach FIELD,URL FILE $(Validate/$(call dl_method,$(URL),$(PROTO))),
195    ifeq ($($(FIELD)),)
196      $$(error Download/$(1) is missing the $(FIELD) field.)
197    endif
198  )
199
200  $(foreach dep,$(DOWNLOAD_RDEP),
201    $(dep): $(DL_DIR)/$(FILE)
202  )
203  download: $(DL_DIR)/$(FILE)
204
205  $(DL_DIR)/$(FILE):
206	mkdir -p $(DL_DIR)
207	$(call locked,$(if $(DownloadMethod/$(call dl_method,$(URL),$(PROTO))),$(DownloadMethod/$(call dl_method,$(URL),$(PROTO))),$(DownloadMethod/unknown)),$(FILE))
208
209endef
210