Initial revision
[openwrt.git] / toolchain / ccache / ccache.mk
1 #############################################################
2 #
3 # build ccache to make recompiles faster on the build system
4 #
5 #############################################################
6 CCACHE_VER:=2.3
7 CCACHE_SITE:=http://ccache.samba.org/ftp/ccache
8 CCACHE_SOURCE:=ccache-$(CCACHE_VER).tar.gz
9 CCACHE_DIR1:=$(TOOL_BUILD_DIR)/ccache-$(CCACHE_VER)
10 CCACHE_DIR2:=$(BUILD_DIR)/ccache-$(CCACHE_VER)
11 CCACHE_CAT:=zcat
12 CCACHE_BINARY:=ccache
13 CCACHE_TARGET_BINARY:=usr/bin/ccache
14
15 $(DL_DIR)/$(CCACHE_SOURCE):
16         $(WGET) -P $(DL_DIR) $(CCACHE_SITE)/$(CCACHE_SOURCE)
17
18 $(CCACHE_DIR1)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE)
19         $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) -
20         touch $(CCACHE_DIR1)/.unpacked
21
22 $(CCACHE_DIR1)/.patched: $(CCACHE_DIR1)/.unpacked
23         # WARNING - this will break if the toolchain is moved.
24         # Should probably patch things to use a relative path.
25         $(SED) "s,getenv(\"CCACHE_PATH\"),\"$(STAGING_DIR)/bin-ccache\",g" \
26                 $(CCACHE_DIR1)/execute.c
27         # WARNING - this will break if the toolchain build dir is deleted.
28         $(SED) "s,getenv(\"CCACHE_DIR\"),\"$(CCACHE_DIR1)/cache\",g" \
29                 $(CCACHE_DIR1)/ccache.c
30         mkdir -p $(CCACHE_DIR1)/cache
31         touch $(CCACHE_DIR1)/.patched
32
33 $(CCACHE_DIR1)/.configured: $(CCACHE_DIR1)/.patched
34         mkdir -p $(CCACHE_DIR1)
35         (cd $(CCACHE_DIR1); rm -rf config.cache; \
36                 CC=$(HOSTCC) \
37                 $(CCACHE_DIR1)/configure \
38                 --target=$(GNU_HOST_NAME) \
39                 --host=$(GNU_HOST_NAME) \
40                 --build=$(GNU_HOST_NAME) \
41                 --prefix=/usr \
42         );
43         touch $(CCACHE_DIR1)/.configured
44
45 $(CCACHE_DIR1)/$(CCACHE_BINARY): $(CCACHE_DIR1)/.configured
46         $(MAKE) CC=$(HOSTCC) -C $(CCACHE_DIR1)
47
48 $(STAGING_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR1)/$(CCACHE_BINARY)
49         mkdir -p $(STAGING_DIR)/usr/bin;
50         cp $(CCACHE_DIR1)/ccache $(STAGING_DIR)/usr/bin
51         # Keep the actual toolchain binaries in a directory at the same level.
52         # Otherwise, relative paths for include dirs break.
53         mkdir -p $(STAGING_DIR)/bin-ccache;
54         (cd $(STAGING_DIR)/bin-ccache; \
55                 ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-gcc; \
56                 ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-cc; \
57                 ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(REAL_GNU_TARGET_NAME)-cc);
58         [ -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc ] && \
59                 mv $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc $(STAGING_DIR)/bin-ccache/
60         (cd $(STAGING_DIR)/bin; \
61                 ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-cc; \
62                 ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-gcc; \
63                 ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-cc; \
64                 ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-gcc);
65 ifeq ($(BR2_INSTALL_LIBSTDCPP),y)
66         [ -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-c++ ] && \
67                 mv $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-c++ $(STAGING_DIR)/bin-ccache/
68         [ -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-g++ ] && \
69                 mv $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-g++  $(STAGING_DIR)/bin-ccache/
70         (cd $(STAGING_DIR)/bin; \
71                 ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-c++; \
72                 ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-g++;\
73                 ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-c++; \
74                 ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-g++);
75         (cd $(STAGING_DIR)/bin-ccache; \
76                 ln -fs $(REAL_GNU_TARGET_NAME)-c++ $(GNU_TARGET_NAME)-c++; \
77                 ln -fs $(REAL_GNU_TARGET_NAME)-g++ $(GNU_TARGET_NAME)-g++);
78 endif
79
80 ccache: gcc $(STAGING_DIR)/$(CCACHE_TARGET_BINARY)
81
82 ccache-clean:
83         $(MAKE) -C $(CCACHE_DIR1) uninstall
84         -$(MAKE) -C $(CCACHE_DIR1) clean
85
86 ccache-dirclean:
87         rm -rf $(CCACHE_DIR1)
88
89
90
91
92 #############################################################
93 #
94 # build ccache for use on the target system
95 #
96 #############################################################
97
98 $(CCACHE_DIR2)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE)
99         $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
100         touch $(CCACHE_DIR2)/.unpacked
101
102 $(CCACHE_DIR2)/.patched: $(CCACHE_DIR2)/.unpacked
103         touch $(CCACHE_DIR2)/.patched
104
105 $(CCACHE_DIR2)/.configured: $(CCACHE_DIR2)/.patched
106         mkdir -p $(CCACHE_DIR2)
107         (cd $(CCACHE_DIR2); rm -rf config.cache; \
108                 $(TARGET_CONFIGURE_OPTS) \
109                 $(CCACHE_DIR2)/configure \
110                 --target=$(GNU_TARGET_NAME) \
111                 --host=$(GNU_TARGET_NAME) \
112                 --build=$(GNU_HOST_NAME) \
113                 --prefix=/usr \
114                 --exec-prefix=/usr \
115                 --bindir=/usr/bin \
116                 --sbindir=/usr/sbin \
117                 --libexecdir=/usr/lib \
118                 --sysconfdir=/etc \
119                 --datadir=/usr/share \
120                 --localstatedir=/var \
121                 --mandir=/usr/man \
122                 --infodir=/usr/info \
123                 $(DISABLE_NLS) \
124         );
125         touch $(CCACHE_DIR2)/.configured
126
127 $(CCACHE_DIR2)/$(CCACHE_BINARY): $(CCACHE_DIR2)/.configured
128         $(MAKE) -C $(CCACHE_DIR2) CFLAGS="$(TARGET_CFLAGS)"
129
130 $(TARGET_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR2)/$(CCACHE_BINARY)
131         $(MAKE) DESTDIR=$(TARGET_DIR) -C $(CCACHE_DIR2) install
132         rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \
133                 $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc
134         # put a bunch of symlinks into /bin, since that is earlier
135         # in the default PATH than /usr/bin where gcc lives
136         (cd $(TARGET_DIR)/bin; \
137                 ln -fs /usr/bin/ccache cc; \
138                 ln -fs /usr/bin/ccache gcc; \
139                 ln -fs /usr/bin/ccache c++; \
140                 ln -fs /usr/bin/ccache g++;)
141
142 ccache_target: uclibc $(TARGET_DIR)/$(CCACHE_TARGET_BINARY)
143
144 ccache_target-sources: $(DL_DIR)/$(CCACHE_SOURCE)
145
146 ccache_target-clean:
147         rm -f $(TARGET_DIR)/$(CCACHE_TARGET_BINARY)
148         -$(MAKE) -C $(CCACHE_DIR2) clean
149
150 ccache_target-dirclean:
151         rm -rf $(CCACHE_DIR2)