summaryrefslogtreecommitdiff
path: root/ct-ng.in
blob: 0b5e517ed6fae0f804f1cbcf68f6178a7d0991b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
#!@MAKE@ -rf
# Makefile for crosstool-NG.
# Copyright 2006 Yann E. MORIN <yann.morin.1998@free.fr>

# Don't print directory as we descend into them
# Don't use built-in rules, we know what we're doing
MAKEFLAGS += --no-print-directory --no-builtin-rules

# Don't go parallel
.NOTPARALLEL:

# This is where ct-ng is:
export CT_NG:=$(abspath $(lastword $(MAKEFILE_LIST)))
# and this is where we're working in:
export CT_TOP_DIR:=$(shell pwd)

ifeq (@enable_local@,yes)
# automake does not allow to set pkgxxxdir, they are always derived from
# a respective xxxdir. So, for enable-local case, set them directly here.
export CT_LIB_DIR:=$(patsubst %/,%,$(dir $(CT_NG)))
export CT_LIBEXEC_DIR:=$(CT_LIB_DIR)/kconfig
export CT_DOC_DIR:=$(CT_LIB_DIR)/docs
export CT_LICENSE_DIR
else
# Paths and values set by ./configure
# Don't bother to change it other than with a new ./configure!
export CT_LIB_DIR:=@pkgdatadir@
export CT_LIBEXEC_DIR:=@pkglibexecdir@
export CT_DOC_DIR:=@docdir@
endif

# This is crosstool-NG version string
export CT_VERSION:=@PACKAGE_VERSION@

# Download agents used by scripts.mk
CT_WGET     := @wget@
CT_CURL     := @curl@

# Paths found by ./configure
export install      = @INSTALL@
export bash         = @BASH_SHELL@
export awk          = @AWK@
export grep         = @GREP@
export make         = @MAKE@
export sed          = @SED@
export libtool      = @LIBTOOL@
export libtoolize   = @LIBTOOLIZE@
export objcopy      = @OBJCOPY@
export objdump      = @OBJDUMP@
export readelf      = @READELF@
export patch        = @PATCH@

# Some distributions (eg. Ubuntu) thought it wise to point /bin/sh to
# a truly POSIX-conforming shell, ash in this case. This is not so good
# as we, smart (haha!) developers (as smart we ourselves think we are),
# got used to bashisms, and are inclined to easiness... So force use of
# bash.
export SHELL=$(bash)

# Make the restart/stop steps available to scripts/crostool-NG.sh
export CT_STOP:=$(STOP)
export CT_RESTART:=$(RESTART)

SILENT=@
CT_ECHO=echo
ifeq ($(strip $(origin V)),command line)
  ifeq ($(strip $(V)),0)
    SILENT=@
    CT_ECHO=:
  else
    ifeq ($(strip $(V)),1)
      SILENT=
      CT_ECHO=:
    else
      ifeq ($(strip $(V)),2)
        SILENT=
        CT_ECHO=echo
      endif # V == 2
    endif # V== 1
  endif # V == 0
endif # origin V
export V SILENT CT_ECHO

all: help

.PHONY: $(PHONY)
PHONY += all
FORCE:

# Configuration rules. Currently, saveSample.sh uses some of the variables
# below - they should be passed explicitly.

# Top file of crosstool-NG configuration
export KCONFIG_TOP = $(CT_LIB_DIR)/config/config.in

# We need CONF for savedefconfig in scripts/saveSample.sh
export CONF  := $(CT_LIBEXEC_DIR)/conf
MCONF := $(CT_LIBEXEC_DIR)/mconf
NCONF := $(CT_LIBEXEC_DIR)/nconf

# Used by conf/mconf/nconf to find the .in files
# TBD needed? We do supply the defconfig name explicitly below
export srctree=$(CT_LIB_DIR)

.PHONY: menuconfig nconfig oldconfig savedefconfig defconfig check-config

check-config:
	@[ ! -e .config -o -f .config ] || { echo ".config is not a regular file:"; ls -dl .config; exit 1; } >&2

menuconfig: check-config
	@$(CT_ECHO) "  CONF  $@"
	$(SILENT)$(MCONF) $(KCONFIG_TOP)

nconfig: check-config
	@$(CT_ECHO) "  CONF  $@"
	$(SILENT)$(NCONF) $(KCONFIG_TOP)

oldconfig: .config check-config
	@$(CT_ECHO) "  CONF  $@"
	$(SILENT)$(sed) -i -r -f $(CT_LIB_DIR)/scripts/upgrade.sed $<
	$(SILENT)$(CONF) --silent$@ $(KCONFIG_TOP)

savedefconfig: .config check-config
	@$(CT_ECHO) '  GEN   $@'
	$(SILENT)$(CONF) --savedefconfig=$${DEFCONFIG-defconfig} $(KCONFIG_TOP)

defconfig: check-config
	@$(CT_ECHO) '  CONF  $@'
	$(SILENT)$(CONF) --defconfig=$${DEFCONFIG-defconfig} $(KCONFIG_TOP)

# Always be silent, the stdout an be >.config
extractconfig:
	@$(awk) 'BEGIN { dump=0; }                                                  \
	         dump==1 && $$0~/^\[.....\][[:space:]]+(# )?CT_/ {                  \
	             $$1="";                                                        \
	             gsub("^[[:space:]]","");                                       \
	             print;                                                         \
	         }                                                                  \
	         $$0~/Dumping user-supplied crosstool-NG configuration: done in/ {  \
	             dump=0;                                                        \
	         }                                                                  \
	         $$0~/Dumping user-supplied crosstool-NG configuration$$/ {         \
	             dump=1;                                                        \
	         }'

# Help system
help:: help-head help-config help-samples help-build help-clean help-distrib help-env help-tail

help-head:: version
	@echo  'See below for a list of available actions, listed by category:'

help-config::
	@echo
	@echo  'Configuration actions:'

help-samples::
	@echo
	@echo  'Preconfigured toolchains (#: force number of // jobs):'

help-build::
	@echo
	@echo  'Build actions (#: force number of // jobs):'
	@echo  '  list-steps         - List all build steps'

help-clean::
	@echo
	@echo  'Clean actions:'

help-distrib::
	@echo
	@echo  'Distribution actions:'

help-env::
	@echo
	@if [ -r "@docdir@/manual/4_Building.md" ]; then \
		echo 'Environment variables (see @docdir@/0 - Table of content.txt):'; \
	else \
		echo 'Environment variables (see http://crosstool-ng.github.io/docs/build/)'; \
	fi
	@echo  '  STOP=step          - Stop the build just after this step (list with list-steps)'
	@echo  '  RESTART=step       - Restart the build just before this step (list with list-steps)'

help-tail::
	@echo
	@echo  'Use action "menuconfig" to configure your toolchain'
	@echo  'Use action "build" to build your toolchain'
	@echo  'Use action "version" to see the version'
	@echo  'See "man 1 $(notdir $(CT_NG))" for some help as well'

help-build::
	@echo  '  source             - Download sources for currently configured toolchain'
	@echo  '  build[.#]          - Build the currently configured toolchain'

help-clean::
	@echo  '  clean              - Remove generated files'
	@echo  '  distclean          - Remove generated files, configuration and build directories'

include $(CT_LIB_DIR)/samples/samples.mk
include $(CT_LIB_DIR)/scripts/scripts.mk

help-config::
	@echo  '  menuconfig         - Update current config using a menu based program'
	@echo  '  nconfig            - Update current config using a menu based program'
	@echo  '  oldconfig          - Update current config using a provided .config as base'
	@echo  '  extractconfig      - Extract to stdout the configuration items from a'
	@echo  '                       build.log file piped to stdin'
	@echo  '  savedefconfig      - Save current config as a mini-defconfig to $${DEFCONFIG}'
	@echo  '  defconfig          - Update config from a mini-defconfig $${DEFCONFIG}'
	@echo  '                       (default: $${DEFCONFIG}=./defconfig)'
	@echo  '  show-tuple         - Print the tuple of the currently configured toolchain'

help-distrib::

help-env::
	@echo  '  V=0|1|2|<unset>    - <unset> show only human-readable messages (default)'
	@echo  '                       0 => do not show commands or human-readable message'
	@echo  '                       1 => show only the commands being executed'
	@echo  '                       2 => show both'

# End help system

.config:
	@echo "There is no existing .config file!"
	@echo "You need to either run 'menuconfig',"
	@echo "or configure an existing sample."
	@false

show-tuple: .config
	$(SILENT)$(bash) $(CT_LIB_DIR)/scripts/show-tuple.sh '$${CT_TARGET}'

# Actual build
source: .config
	$(SILENT)CT_SOURCE=y $(bash) $(CT_LIB_DIR)/scripts/crosstool-NG.sh

build: .config
	$(SILENT)BUILD_NCPUS=`@CPU_COUNT@ 2>/dev/null || echo 0` \
        $(bash) $(CT_LIB_DIR)/scripts/crosstool-NG.sh

build.%:
	$(SILENT)$(MAKE) -rf $(CT_NG) build CT_JOBS=$*

# The _for_build steps are noop for native and cross,
# but are actual steps for canadian and cross-native.
# Please keep the last line with a '\' and keep the following empty line:
# it helps when diffing and merging.
CT_STEPS := \
            companion_tools_for_build  \
            companion_libs_for_build   \
            binutils_for_build         \
            companion_tools_for_host   \
            companion_libs_for_host    \
            binutils_for_host          \
            cc_core_pass_1             \
            kernel_headers             \
            libc_start_files           \
            cc_core_pass_2             \
            libc_main                  \
            cc_for_build               \
            cc_for_host                \
            libc_post_cc               \
            companion_libs_for_target  \
            binutils_for_target        \
            debug                      \
            test_suite                 \
            finish                     \

# Keep an empty line above this comment, so the last
# back-slash terminated line works as expected.

# Make the list available to sub-processes (scripts/crosstool-NG.sh needs it)
export CT_STEPS

# Print the steps list
PHONY += list-steps
list-steps:
	@echo  'Available build steps, in order:'
	@for step in $(CT_STEPS); do    \
	     echo "  - $${step}";       \
	 done
	@echo  'Use "<step>" as action to execute only that step.'
	@echo  'Use "+<step>" as action to execute up to that step.'
	@echo  'Use "<step>+" as action to execute from that step onward.'

# ----------------------------------------------------------
# This part deals with executing steps

$(CT_STEPS):
	$(SILENT)$(MAKE) -rf $(CT_NG) V=$(V) RESTART=$@ STOP=$@ build

$(patsubst %,+%,$(CT_STEPS)):
	$(SILENT)$(MAKE) -rf $(CT_NG) V=$(V) STOP=$(patsubst +%,%,$@) build

$(patsubst %,%+,$(CT_STEPS)):
	$(SILENT)$(MAKE) -rf $(CT_NG) V=$(V) RESTART=$(patsubst %+,%,$@) build

PHONY += version
version:
	@echo 'This is crosstool-NG version $(CT_VERSION)'
	@echo
	@echo 'Copyright (C) 2008  Yann E. MORIN <yann.morin.1998@free.fr>'
	@echo 'This is free software; see the source for copying conditions.'
	@echo 'There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A'
	@echo 'PARTICULAR PURPOSE.'
	@echo

PHONY += clean
clean::
	@$(CT_ECHO) "  CLEAN log"
	$(SILENT)rm -f build.log
	@$(CT_ECHO) "  CLEAN build dir"
	$(SILENT)[ ! -d targets ] || chmod -R u+w targets
	$(SILENT)[ ! -d .build  ] || chmod -R u+w .build
	$(SILENT)rm -rf targets .build .build-all

PHONY += distclean
distclean:: clean
	@$(CT_ECHO) "  CLEAN .config"
	$(SILENT)rm -f .config .config.* ..config*