1# 
2# Copyright (C) 2007 OpenWrt.org
3#
4# This is free software, licensed under the GNU General Public License v2.
5# See /LICENSE for more information.
6#
7
8DOWNLOAD_RDEP:=$(STAMP_PREPARED)
9
10# Try to guess the download method from the URL
11define dl_method 
12$(strip \
13  $(if $(2),$(2), \
14    $(if $(filter @GNU/% @KERNEL/% @SF/% ftp://% http://%,$(1)),default, \
15      $(if $(filter git://%,$(1)),git, \
16        $(if $(filter svn://%,$(1)),svn, \
17          $(if $(filter cvs://%,$(1)),cvs, \
18            unknown \
19	  ) \
20        ) \
21      ) \
22    ) \
23  ) \
24)
25endef
26
27# code for creating tarballs from cvs/svn/git checkouts - useful for mirror support
28dl_pack/bz2=$(TAR) cfj $(1) $(2)
29dl_pack/gz=$(TAR) cfz $(1) $(2)
30dl_pack/unknown=echo "ERROR: Unknown pack format for file $(1)"; false
31define dl_pack
32	$(if $(dl_pack/$(call ext,$(1))),$(dl_pack/$(call ext,$(1))),$(dl_pack/unknown))
33endef
34
35define DownloadMethod/unknown
36	@echo "ERROR: No download method available"; false
37endef
38
39define DownloadMethod/default
40	$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(MD5SUM)" $(URL)
41endef
42
43define wrap_mirror
44	@$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "x" || ( $(1) )
45endef
46
47define DownloadMethod/cvs
48	$(call wrap_mirror, \
49		echo "Checking out files from the cvs repository..."; \
50                mkdir -p $(TMP_DIR)/dl && \
51                cd $(TMP_DIR)/dl && \
52                rm -rf $(SUBDIR) && \
53                [ \! -d $(SUBDIR) ] && \
54                cvs co -r$(VERSION) $(URL) $(SUBDIR) && \
55                find $(SUBDIR) -name CVS | xargs rm -rf && \
56                echo "Packing checkout..." && \
57                $(call dl_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \
58                mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/; \
59        )
60endef
61
62
63define DownloadMethod/svn
64	$(call wrap_mirror, \
65		echo "Checking out files from the svn repository..."; \
66		mkdir -p $(TMP_DIR)/dl && \
67		cd $(TMP_DIR)/dl && \
68		rm -rf $(SUBDIR) && \
69		[ \! -d $(SUBDIR) ] && \
70		svn co -r$(VERSION) $(URL) $(SUBDIR) && \
71		find $(SUBDIR) -name .svn | xargs rm -rf && \
72		echo "Packing checkout..." && \
73		$(call dl_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \
74		mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/; \
75	)
76endef
77
78define DownloadMethod/git
79	$(call wrap_mirror, \
80		echo "Checking out files from the git repository..."; \
81		mkdir -p $(TMP_DIR)/dl && \
82		cd $(TMP_DIR)/dl && \
83		rm -rf $(SUBDIR) && \
84		[ \! -d $(SUBDIR) ] && \
85		git-clone $(URL) $(SUBDIR) && \
86		(cd $(SUBDIR) && git-checkout $(VERSION)) && \
87		echo "Packing checkout..." && \
88		rm -rf $(SUBDIR)/.git && \
89		$(call dl_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \
90		mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/; \
91	)
92endef
93
94Validate/cvs=VERSION SUBDIR
95Validate/svn=VERSION SUBDIR
96Validate/git=VERSION SUBDIR
97
98define Download/Defaults
99  URL:=
100  FILE:=
101  PROTO:=
102  MD5SUM:=
103  SUBDIR:=
104  VERSION:=
105endef
106
107define Download
108  $(eval $(Download/Defaults))
109  $(eval $(Download/$(1)))
110  $(foreach FIELD,URL FILE $(Validate/$(call dl_method,$(URL),$(PROTO))),
111    ifeq ($($(FIELD)),)
112      $$(error Download/$(1) is missing the $(FIELD) field.)
113    endif
114  )
115
116  $(if $(DOWNLOAD_RDEP),$(DOWNLOAD_RDEP): $(DL_DIR)/$(FILE))
117  download: $(DL_DIR)/$(FILE)
118
119  $(DL_DIR)/$(FILE):
120	mkdir -p $(DL_DIR)
121	$(if $(DownloadMethod/$(call dl_method,$(URL),$(PROTO))),$(DownloadMethod/$(call dl_method,$(URL),$(PROTO))),$(DownloadMethod/unknown))
122
123endef
124