Makefile.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
parent 1576 906b7509835e
child 1876 a6a4beab3125
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
     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 
    56 ###############################################################################
    57 # Sanity checks
    58 
    59 # Check if Makefile is up to date:
    60 Makefile: Makefile.in
    61 	@echo "$< did changed: you must re-run './configure'"
    62 	@false
    63 
    64 # If installing with DESTDIR, check it's an absolute path
    65 ifneq ($(strip $(DESTDIR)),)
    66   ifneq ($(DESTDIR),$(abspath /$(DESTDIR)))
    67     $(error DESTDIR is not an absolute PATH: '$(DESTDIR)')
    68   endif
    69 endif
    70 
    71 ###############################################################################
    72 # Global make rules
    73 
    74 # If any extra MAKEFLAGS were added, re-run ourselves
    75 # See top of file for an explanation of why this is needed...
    76 ifneq ($(strip $(CT_MAKEFLAGS)),)
    77 
    78 MAKEFLAGS += $(CT_MAKEFLAGS)
    79 build install clean distclean uninstall:
    80 	@$(MAKE) $@
    81 
    82 else
    83 # There were no additional MAKEFLAGS to add, do the job
    84 
    85 TARGETS := bin lib doc man
    86 
    87 build: $(patsubst %,build-%,$(TARGETS))
    88 
    89 install: build real-install
    90 
    91 clean: $(patsubst %,clean-%,$(TARGETS))
    92 
    93 distclean: clean
    94 	@echo "  RM     'Makefile'"
    95 	@rm -f Makefile
    96 
    97 uninstall: real-uninstall
    98 
    99 ###############################################################################
   100 # Specific make rules
   101 
   102 #--------------------------------------
   103 # Build rules
   104 
   105 build-bin: ct-ng scripts/crosstool-NG.sh scripts/saveSample.sh scripts/showTuple.sh
   106 	@chmod 755 $^
   107 
   108 build-lib: paths.mk
   109 
   110 build-doc:
   111 
   112 build-man: docs/ct-ng.1.gz
   113 
   114 docs/ct-ng.1.gz: docs/ct-ng.1
   115 	@echo "  GZIP   '$@'"
   116 	@gzip -c9 $< >$@
   117 
   118 %: %.in Makefile
   119 	@echo "  SED    '$@'"
   120 	@$(sed) -r -e 's,@@CT_BINDIR@@,$(BINDIR),g;'    \
   121 	           -e 's,@@CT_LIBDIR@@,$(LIBDIR),g;'    \
   122 	           -e 's,@@CT_DOCDIR@@,$(DOCDIR),g;'    \
   123 	           -e 's,@@CT_MANDIR@@,$(MANDIR),g;'    \
   124 	           -e 's,@@CT_VERSION@@,$(VERSION),g;'	\
   125 	           -e 's,@@CT_DATE@@,$(DATE),g;'        \
   126 	           -e 's,@@CT_make@@,$(make),g;'        \
   127 	           -e 's,@@CT_bash@@,$(bash),g;'        \
   128 	           $@.in >$@
   129 
   130 # We create a script fragment that is parseable from inside a Makefile,
   131 # but also from inside a shell script, hence the reason why we don't
   132 # use := to set variables, although that will incur a (very small)
   133 # penalty from the Makefile that includes it (due to re-evaluation at
   134 # each call).
   135 paths.mk:
   136 	@echo "  GEN    '$@'"
   137 	@(echo "export install=$(install)"; \
   138 	  echo "export bash=$(bash)";       \
   139 	  echo "export grep=$(grep)";       \
   140 	  echo "export make=$(make)";       \
   141 	  echo "export sed=$(sed)";         \
   142 	 ) >paths.mk
   143 
   144 #--------------------------------------
   145 # Clean rules
   146 
   147 clean-bin:
   148 	@echo "  RM     'ct-ng'"
   149 	@rm -f ct-ng
   150 	@echo "  RM     'scripts/crosstool-NG.sh'"
   151 	@rm -f scripts/crosstool-NG.sh
   152 	@echo "  RM     'scripts/saveSample.sh'"
   153 	@rm -f scripts/saveSample.sh
   154 	@echo "  RM     'scripts/showTuple.sh'"
   155 	@rm -f scripts/showTuple.sh
   156 
   157 clean-lib:
   158 	@echo "  RM     'paths.mk'"
   159 	@rm -f paths.mk
   160 
   161 clean-doc:
   162 
   163 clean-man:
   164 	@echo "  RM     'docs/ct-ng.1'"
   165 	@rm -f docs/ct-ng.1
   166 	@echo "  RM     'docs/ct-ng.1.gz'"
   167 	@rm -f docs/ct-ng.1.gz
   168 
   169 #--------------------------------------
   170 # Check for --local setup
   171 
   172 ifeq ($(strip $(LOCAL)),y)
   173 
   174 real-install:
   175 	@true
   176 
   177 real-uninstall:
   178 	@true
   179 
   180 else
   181 
   182 #--------------------------------------
   183 # Install rules
   184 
   185 real-install: $(patsubst %,install-%,$(TARGETS))
   186 
   187 install-bin: $(DESTDIR)$(BINDIR)
   188 	@echo "  INST   'ct-ng'"
   189 	@$(install) -m 755 ct-ng "$(DESTDIR)$(BINDIR)/ct-ng"
   190 
   191 # If one is hacking crosstool-NG, the patch set might change between any two
   192 # installations of the same VERSION, thus the patches must be removed prior
   193 # to being installed. It is simpler to remove the whole lib/ directory, as it
   194 # is the goal of the install-lib rule to install the lib/ directory...
   195 install-lib: uninstall-lib $(DESTDIR)$(LIBDIR) install-lib-main install-lib-samples
   196 
   197 install-lib-main: $(DESTDIR)$(LIBDIR)
   198 	@for src_dir in config kconfig patches scripts; do  \
   199 	     echo "  INST   '$${src_dir}/'";                \
   200 	     tar cf - --exclude='*.sh.in' $${src_dir}       \
   201 	     |(cd "$(DESTDIR)$(LIBDIR)"; tar xf -);         \
   202 	 done
   203 	@chmod a+x $(DESTDIR)$(LIBDIR)/scripts/crosstool-NG.sh
   204 	@chmod a+x $(DESTDIR)$(LIBDIR)/scripts/saveSample.sh
   205 	@rm -f "$(DESTDIR)$(LIBDIR)/scripts/addToolVersion.sh"
   206 	@echo "  INST   'steps.mk'"
   207 	@$(install) -m 644 steps.mk "$(DESTDIR)$(LIBDIR)/steps.mk"
   208 	@echo "  INST   'paths.mk'"
   209 	@$(install) -m 644 paths.mk "$(DESTDIR)$(LIBDIR)/paths.mk"
   210 
   211 # Samples need a little love:
   212 #  - change every occurrence of CT_TOP_DIR to CT_LIB_DIR
   213 install-lib-samples: $(DESTDIR)$(LIBDIR) install-lib-main
   214 	@echo "  INST   'samples/'"
   215 	@tar cf - samples |(cd "$(DESTDIR)$(LIBDIR)"; tar xf -)
   216 	@for samp_file in "$(DESTDIR)$(LIBDIR)/samples/"*"/crosstool.config"; do                    \
   217 	     $(sed) -r -i -e 's,\$$\{CT_TOP_DIR\},\$$\{CT_LIB_DIR\},g;' $${samp_file};           \
   218 	     $(sed) -r -i -e 's,^(CT_WORK_DIR)=.*,\1="\$${CT_TOP_DIR}/targets",;' $${samp_file}; \
   219 	 done
   220 
   221 install-doc: $(DESTDIR)$(DOCDIR)
   222 	@for doc_file in docs/CREDITS docs/overview.txt; do             \
   223 	     echo "  INST   '$${doc_file}'";                            \
   224 	     $(install) -m 644 "$${doc_file}" "$(DESTDIR)$(DOCDIR)"; \
   225 	 done
   226 
   227 install-man: $(DESTDIR)$(MANDIR)
   228 	@echo "  INST   'ct-ng.1.gz'"
   229 	@$(install) -m 644 docs/ct-ng.1.gz "$(DESTDIR)$(MANDIR)"
   230 
   231 $(sort $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(DOCDIR) $(DESTDIR)$(MANDIR)):
   232 	@echo "  MKDIR  '$@'"
   233 	@$(install) -m 755 -d "$@"
   234 
   235 
   236 #--------------------------------------
   237 # Uninstall rules
   238 
   239 real-uninstall: $(patsubst %,uninstall-%,$(TARGETS))
   240 
   241 uninstall-bin:
   242 	@echo "  RM     '$(DESTDIR)$(BINDIR)/ct-ng'"
   243 	@rm -f "$(DESTDIR)$(BINDIR)/ct-ng"
   244 
   245 uninstall-lib:
   246 	@echo "  RMDIR  '$(DESTDIR)$(LIBDIR)/'"
   247 	@rm -rf "$(DESTDIR)$(LIBDIR)"
   248 
   249 uninstall-doc:
   250 	@echo "  RMDIR  '$(DESTDIR)$(DOCDIR)/'"
   251 	@rm -rf "$(DESTDIR)$(DOCDIR)"
   252 
   253 uninstall-man:
   254 	@echo "  RM     '$(DESTDIR)$(MANDIR)/ct-ng.1.gz'"
   255 	@rm -f "$(DESTDIR)$(MANDIR)/ct-ng.1"{,.gz}
   256 
   257 endif # Not --local
   258 
   259 endif # No extra MAKEFLAGS were added