2
1

ccache.mk 6.7 KB

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