Makefile.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jun 13 23:38:37 2010 +0200 (2010-06-13)
changeset 1983 198a5a6e5239
parent 1876 a6a4beab3125
child 1993 6641889d5603
permissions -rw-r--r--
cc/gcc: baremetal requires a two-pass process

Here, we implement a highly ugly hack. I'm not proud of that one...

To build the libstdc++ library, the compiler requires the C library. In
case we build for non-baremetal, this is normally handled by the final
step, later.

But in the case of bare-metal, we never go through the final step (because
it does not work, and it seems complex enough to make it work), so the
baremetal compilers are issued out of the core step.
     1 # Makefile.in for building crosstool-NG
     2 # This file serves as source for the ./configure operation
     3 
     4 # This series of test is here because GNU make 3.81 will *not* use MAKEFLAGS
     5 # to set additional flags in the current Makfile ( see:
     6 # http://savannah.gnu.org/bugs/?20501 ), although the make manual says it
     7 # should ( see: http://www.gnu.org/software/make/manual/make.html#Options_002fRecursion )
     8 # so we have to work it around by calling ourselves back if needed
     9 
    10 # So why do we need not to use the built rules and variables? Because we
    11 # need to generate scripts/crosstool-NG.sh from scripts/crosstool-NG.sh.in
    12 # and there is a built-in implicit rule '%.sh:' that has neither a pre-requisite
    13 # nor a command associated, and that built-in implicit rule takes precedence
    14 # over our non-built-in implicit rule '%: %.in', below.
    15 
    16 # CT_MAKEFLAGS will be used later, below...
    17 
    18 # Do not print directories as we descend into them
    19 ifeq ($(filter --no-print-directory,$(MAKEFLAGS)),)
    20 CT_MAKEFLAGS += --no-print-directory
    21 endif
    22 
    23 # Use neither builtin rules, nor builtin variables
    24 # Note: dual test, because if -R and -r are given on the command line
    25 # (who knows?), MAKEFLAGS contains 'Rr' instead of '-Rr', while adding
    26 # '-Rr' to MAKEFLAGS adds it literaly ( and does not add 'Rr' )
    27 ifeq ($(filter Rr,$(MAKEFLAGS)),)
    28 ifeq ($(filter -Rr,$(MAKEFLAGS)),)
    29 CT_MAKEFLAGS += -Rr
    30 endif # No -Rr
    31 endif # No Rr
    32 
    33 # Remove any suffix rules
    34 .SUFFIXES:
    35 
    36 all: Makefile build
    37 
    38 ###############################################################################
    39 # Configuration variables
    40 
    41 VERSION:= @@VERSION@@
    42 BINDIR := @@BINDIR@@
    43 LIBDIR := @@LIBDIR@@
    44 DOCDIR := @@DOCDIR@@
    45 MANDIR := @@MANDIR@@
    46 DATE   := @@DATE@@
    47 LOCAL  := @@LOCAL@@
    48 
    49 # Paths found by ./configure
    50 install:= @@install@@
    51 bash   := @@bash@@
    52 grep   := @@grep@@
    53 make   := @@make@@
    54 sed    := @@sed@@
    55 libtool:= @@libtool@@
    56 objcopy:= @@objcopy@@
    57 objdump:= @@objdump@@
    58 readelf:= @@readelf@@
    59 patch  := @@patch@@
    60 
    61 ###############################################################################
    62 # Sanity checks
    63 
    64 # Check if Makefile is up to date:
    65 Makefile: Makefile.in
    66 	@echo "$< did changed: you must re-run './configure'"
    67 	@false
    68 
    69 # If installing with DESTDIR, check it's an absolute path
    70 ifneq ($(strip $(DESTDIR)),)
    71   ifneq ($(DESTDIR),$(abspath /$(DESTDIR)))
    72     $(error DESTDIR is not an absolute PATH: '$(DESTDIR)')
    73   endif
    74 endif
    75 
    76 ###############################################################################
    77 # Global make rules
    78 
    79 # If any extra MAKEFLAGS were added, re-run ourselves
    80 # See top of file for an explanation of why this is needed...
    81 ifneq ($(strip $(CT_MAKEFLAGS)),)
    82 
    83 MAKEFLAGS += $(CT_MAKEFLAGS)
    84 build install clean distclean uninstall:
    85 	@$(MAKE) $@
    86 
    87 else
    88 # There were no additional MAKEFLAGS to add, do the job
    89 
    90 TARGETS := bin lib doc man
    91 
    92 build: $(patsubst %,build-%,$(TARGETS))
    93 
    94 install: build real-install
    95 
    96 clean: $(patsubst %,clean-%,$(TARGETS))
    97 
    98 distclean: clean
    99 	@echo "  RM     'Makefile'"
   100 	@rm -f Makefile
   101 
   102 uninstall: real-uninstall
   103 
   104 ###############################################################################
   105 # Specific make rules
   106 
   107 #--------------------------------------
   108 # Build rules
   109 
   110 build-bin: ct-ng scripts/crosstool-NG.sh scripts/saveSample.sh scripts/showTuple.sh
   111 	@chmod 755 $^
   112 
   113 build-lib: paths.mk
   114 
   115 build-doc:
   116 
   117 build-man: docs/ct-ng.1.gz
   118 
   119 docs/ct-ng.1.gz: docs/ct-ng.1
   120 	@echo "  GZIP   '$@'"
   121 	@gzip -c9 $< >$@
   122 
   123 %: %.in Makefile
   124 	@echo "  SED    '$@'"
   125 	@$(sed) -r -e 's,@@CT_BINDIR@@,$(BINDIR),g;'    \
   126 	           -e 's,@@CT_LIBDIR@@,$(LIBDIR),g;'    \
   127 	           -e 's,@@CT_DOCDIR@@,$(DOCDIR),g;'    \
   128 	           -e 's,@@CT_MANDIR@@,$(MANDIR),g;'    \
   129 	           -e 's,@@CT_VERSION@@,$(VERSION),g;'	\
   130 	           -e 's,@@CT_DATE@@,$(DATE),g;'        \
   131 	           -e 's,@@CT_make@@,$(make),g;'        \
   132 	           -e 's,@@CT_bash@@,$(bash),g;'        \
   133 	           $@.in >$@
   134 
   135 # We create a script fragment that is parseable from inside a Makefile,
   136 # but also from inside a shell script, hence the reason why we don't
   137 # use := to set variables, although that will incur a (very small)
   138 # penalty from the Makefile that includes it (due to re-evaluation at
   139 # each call).
   140 paths.mk:
   141 	@echo "  GEN    '$@'"
   142 	@(echo "export install=$(install)"; \
   143 	  echo "export bash=$(bash)";       \
   144 	  echo "export grep=$(grep)";       \
   145 	  echo "export make=$(make)";       \
   146 	  echo "export sed=$(sed)";         \
   147 	  echo "export libtool=$(libtool)"; \
   148 	  echo "export objcopy=$(objcopy)"; \
   149 	  echo "export objdump=$(objdump)"; \
   150 	  echo "export readelf=$(readelf)"; \
   151 	  echo "export patch=$(patch)";     \
   152 	 ) >paths.mk
   153 
   154 #--------------------------------------
   155 # Clean rules
   156 
   157 clean-bin:
   158 	@echo "  RM     'ct-ng'"
   159 	@rm -f ct-ng
   160 	@echo "  RM     'scripts/crosstool-NG.sh'"
   161 	@rm -f scripts/crosstool-NG.sh
   162 	@echo "  RM     'scripts/saveSample.sh'"
   163 	@rm -f scripts/saveSample.sh
   164 	@echo "  RM     'scripts/showTuple.sh'"
   165 	@rm -f scripts/showTuple.sh
   166 
   167 clean-lib:
   168 	@echo "  RM     'paths.mk'"
   169 	@rm -f paths.mk
   170 
   171 clean-doc:
   172 
   173 clean-man:
   174 	@echo "  RM     'docs/ct-ng.1'"
   175 	@rm -f docs/ct-ng.1
   176 	@echo "  RM     'docs/ct-ng.1.gz'"
   177 	@rm -f docs/ct-ng.1.gz
   178 
   179 #--------------------------------------
   180 # Check for --local setup
   181 
   182 ifeq ($(strip $(LOCAL)),y)
   183 
   184 real-install:
   185 	@true
   186 
   187 real-uninstall:
   188 	@true
   189 
   190 else
   191 
   192 #--------------------------------------
   193 # Install rules
   194 
   195 real-install: $(patsubst %,install-%,$(TARGETS)) install-post
   196 
   197 install-bin: $(DESTDIR)$(BINDIR)
   198 	@echo "  INST   'ct-ng'"
   199 	@$(install) -m 755 ct-ng "$(DESTDIR)$(BINDIR)/ct-ng"
   200 
   201 # If one is hacking crosstool-NG, the patch set might change between any two
   202 # installations of the same VERSION, thus the patches must be removed prior
   203 # to being installed. It is simpler to remove the whole lib/ directory, as it
   204 # is the goal of the install-lib rule to install the lib/ directory...
   205 install-lib: uninstall-lib $(DESTDIR)$(LIBDIR) install-lib-main install-lib-samples
   206 
   207 install-lib-main: $(DESTDIR)$(LIBDIR)
   208 	@for src_dir in config kconfig patches scripts; do  \
   209 	     echo "  INST   '$${src_dir}/'";                \
   210 	     tar cf - --exclude='*.sh.in' $${src_dir}       \
   211 	     |(cd "$(DESTDIR)$(LIBDIR)"; tar xf -);         \
   212 	 done
   213 	@chmod a+x $(DESTDIR)$(LIBDIR)/scripts/crosstool-NG.sh
   214 	@chmod a+x $(DESTDIR)$(LIBDIR)/scripts/saveSample.sh
   215 	@rm -f "$(DESTDIR)$(LIBDIR)/scripts/addToolVersion.sh"
   216 	@echo "  INST   'steps.mk'"
   217 	@$(install) -m 644 steps.mk "$(DESTDIR)$(LIBDIR)/steps.mk"
   218 	@echo "  INST   'paths.mk'"
   219 	@$(install) -m 644 paths.mk "$(DESTDIR)$(LIBDIR)/paths.mk"
   220 
   221 # Samples need a little love:
   222 #  - change every occurrence of CT_TOP_DIR to CT_LIB_DIR
   223 install-lib-samples: $(DESTDIR)$(LIBDIR) install-lib-main
   224 	@echo "  INST   'samples/'"
   225 	@tar cf - samples |(cd "$(DESTDIR)$(LIBDIR)"; tar xf -)
   226 	@for samp_file in "$(DESTDIR)$(LIBDIR)/samples/"*"/crosstool.config"; do                    \
   227 	     $(sed) -r -i -e 's,\$$\{CT_TOP_DIR\},\$$\{CT_LIB_DIR\},g;' $${samp_file};           \
   228 	     $(sed) -r -i -e 's,^(CT_WORK_DIR)=.*,\1="\$${CT_TOP_DIR}/targets",;' $${samp_file}; \
   229 	 done
   230 
   231 install-doc: $(DESTDIR)$(DOCDIR)
   232 	@for doc_file in docs/CREDITS docs/overview.txt; do             \
   233 	     echo "  INST   '$${doc_file}'";                            \
   234 	     $(install) -m 644 "$${doc_file}" "$(DESTDIR)$(DOCDIR)"; \
   235 	 done
   236 
   237 install-man: $(DESTDIR)$(MANDIR)
   238 	@echo "  INST   'ct-ng.1.gz'"
   239 	@$(install) -m 644 docs/ct-ng.1.gz "$(DESTDIR)$(MANDIR)"
   240 
   241 $(sort $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(DOCDIR) $(DESTDIR)$(MANDIR)):
   242 	@echo "  MKDIR  '$@'"
   243 	@$(install) -m 755 -d "$@"
   244 
   245 install-post:
   246 	@echo
   247 	@echo "For auto-completion, do not forget to install 'ct-ng.comp'"
   248 	@echo "into you 'bash_completion.d'"
   249 
   250 #--------------------------------------
   251 # Uninstall rules
   252 
   253 real-uninstall: $(patsubst %,uninstall-%,$(TARGETS))
   254 
   255 uninstall-bin:
   256 	@echo "  RM     '$(DESTDIR)$(BINDIR)/ct-ng'"
   257 	@rm -f "$(DESTDIR)$(BINDIR)/ct-ng"
   258 
   259 uninstall-lib:
   260 	@echo "  RMDIR  '$(DESTDIR)$(LIBDIR)/'"
   261 	@rm -rf "$(DESTDIR)$(LIBDIR)"
   262 
   263 uninstall-doc:
   264 	@echo "  RMDIR  '$(DESTDIR)$(DOCDIR)/'"
   265 	@rm -rf "$(DESTDIR)$(DOCDIR)"
   266 
   267 uninstall-man:
   268 	@echo "  RM     '$(DESTDIR)$(MANDIR)/ct-ng.1.gz'"
   269 	@rm -f "$(DESTDIR)$(MANDIR)/ct-ng.1"{,.gz}
   270 
   271 endif # Not --local
   272 
   273 endif # No extra MAKEFLAGS were added