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