eliminate rmkdir and generate directory dependencies the right way.
[reactos.git] / reactos / Makefile
1 # Accepted environment variables:
2 #
3 # ROS_INTERMEDIATE
4 # This variable controls where to put intermediate files. Intermediate
5 # files are generated files that are needed to generate the final
6 # output files. Examples of intermediate files include *.o, *.a, and
7 # *.coff. N.B. Don't put a path separator at the end. The variable
8 # defaults to .\obj-i386.
9 #
10 # ROS_OUTPUT
11 # This variable controls where to put output files. Output files are
12 # generated files that makes up the result of the build process.
13 # Examples of output files include *.exe, *.dll, and *.sys. N.B. Don't
14 # put a path separator at the end. The variable defaults to .\output-i386.
15 #
16
17 .PHONY: all
18 .PHONY: clean
19 all: makefile.auto
20
21 .SUFFIXES:
22
23 ifeq ($(HOST),)
24 ifeq ($(word 1,$(shell gcc -dumpmachine)),mingw32)
25 HOST=mingw32-windows
26 else
27 HOST=mingw32-linux
28 endif
29 endif
30
31 # Default to half-verbose mode
32 ifeq ($(VERBOSE),no)
33 Q = @
34 HALFVERBOSEECHO = no
35 BUILDNO_QUIET = -q
36 else
37 ifeq ($(VERBOSE),yes)
38 Q =
39 HALFVERBOSEECHO = no
40 BUILDNO_QUIET =
41 else
42 Q = @
43 HALFVERBOSEECHO = yes
44 BUILDNO_QUIET = -q
45 endif
46 endif
47 ifeq ($(HALFVERBOSEECHO),yes)
48 ECHO_MKDIR =@echo [MKDIR] $@
49 ECHO_BUILDNO =@echo [BUILDNO] $@
50 ECHO_INVOKE =@echo [INVOKE] $<
51 ECHO_PCH =@echo [PCH] $@
52 ECHO_CC =@echo [CC] $<
53 ECHO_GAS =@echo [GAS] $<
54 ECHO_NASM =@echo [NASM] $<
55 ECHO_AR =@echo [AR] $@
56 ECHO_WINEBLD =@echo [WINEBLD] $@
57 ECHO_WRC =@echo [WRC] $@
58 ECHO_BIN2RES =@echo [BIN2RES] $<
59 ECHO_DLLTOOL =@echo [DLLTOOL] $@
60 ECHO_LD =@echo [LD] $@
61 ECHO_RBUILD =@echo [RBUILD] $@
62 ECHO_RSYM =@echo [RSYM] $@
63 ECHO_WMC =@echo [WMC] $@
64 ECHO_NCI =@echo [NCI] $@
65 ECHO_CABMAN =@echo [CABMAN] $<
66 ECHO_CDMAKE =@echo [CDMAKE] $@
67 ECHO_REGTESTS=@echo [REGTESTS] $@
68 ECHO_TEST =@echo [TEST] $@
69 else
70 ECHO_MKDIR =
71 ECHO_BUILDNO =
72 ECHO_INVOKE =
73 ECHO_PCH =
74 ECHO_CC =
75 ECHO_GAS =
76 ECHO_NASM =
77 ECHO_AR =
78 ECHO_WINEBLD =
79 ECHO_WRC =
80 ECHO_BIN2RES =
81 ECHO_DLLTOOL =
82 ECHO_LD =
83 ECHO_RBUILD =
84 ECHO_RSYM =
85 ECHO_WMC =
86 ECHO_NCI =
87 ECHO_CABMAN =
88 ECHO_CDMAKE =
89 ECHO_REGTESTS=
90 ECHO_TEST =
91 endif
92
93
94 host_gcc = $(Q)gcc
95 host_gpp = $(Q)g++
96 host_ld = $(Q)ld
97 host_ar = $(Q)ar
98 host_objcopy = $(Q)objcopy
99 ifeq ($(HOST),mingw32-linux)
100 EXEPREFIX = ./
101 EXEPOSTFIX =
102 SEP = /
103 mkdir = -$(Q)mkdir -p
104 gcc = $(Q)mingw32-gcc
105 gpp = $(Q)mingw32-g++
106 ld = $(Q)mingw32-ld
107 ar = $(Q)mingw32-ar
108 objcopy = $(Q)mingw32-objcopy
109 dlltool = $(Q)mingw32-dlltool
110 windres = $(Q)mingw32-windres
111 rm = rm -f
112 cp = $(Q)cp
113 NUL = /dev/null
114 else # mingw32-windows
115 EXEPREFIX =
116 EXEPOSTFIX = .exe
117 ROS_EMPTY =
118 SEP = \$(ROS_EMPTY)
119 mkdir = -$(Q)mkdir
120 gcc = $(Q)gcc
121 gpp = $(Q)g++
122 ld = $(Q)ld
123 ar = $(Q)ar
124 objcopy = $(Q)objcopy
125 dlltool = $(Q)dlltool
126 windres = $(Q)windres
127 rm = del /f /q
128 cp = $(Q)copy /y
129 NUL = NUL
130 endif
131
132 ifneq ($(ROS_INTERMEDIATE),)
133 INTERMEDIATE := $(ROS_INTERMEDIATE)
134 else
135 INTERMEDIATE := obj-i386
136 endif
137 INTERMEDIATE_ := $(INTERMEDIATE)$(SEP)
138
139 ifneq ($(ROS_OUTPUT),)
140 OUTPUT := $(ROS_OUTPUT)
141 else
142 OUTPUT := obj-i386
143 endif
144 OUTPUT_ := $(OUTPUT)$(SEP)
145
146 $(INTERMEDIATE):
147 ${mkdir} $@
148
149 ifneq ($(INTERMEDIATE),$(OUTPUT))
150 $(OUTPUT):
151 ${mkdir} $@
152 endif
153
154 NTOSKRNL_MC = ntoskrnl$(SEP)ntoskrnl.mc
155 KERNEL32_MC = lib$(SEP)kernel32$(SEP)kernel32.mc
156 BUILDNO_H = include$(SEP)reactos$(SEP)buildno.h
157 BUGCODES_H = include$(SEP)reactos$(SEP)bugcodes.h
158 BUGCODES_RC = ntoskrnl$(SEP)bugcodes.rc
159 ERRCODES_H = include$(SEP)reactos$(SEP)errcodes.h
160 ERRCODES_RC = lib$(SEP)kernel32$(SEP)errcodes.rc
161
162 include lib/lib.mak
163 include tools/tools.mak
164 -include makefile.auto
165
166 PREAUTO := \
167 $(BUILDNO_H) \
168 $(BUGCODES_H) \
169 $(BUGCODES_RC) \
170 $(ERRCODES_H) \
171 $(ERRCODES_RC) \
172 $(NCI_SERVICE_FILES)
173
174 makefile.auto: $(RBUILD_TARGET) $(PREAUTO) $(XMLBUILDFILES)
175 $(ECHO_RBUILD)
176 $(Q)$(RBUILD_TARGET) mingw
177
178
179 $(BUGCODES_H) $(BUGCODES_RC): $(WMC_TARGET) $(NTOSKRNL_MC)
180 $(ECHO_WMC)
181 $(Q)$(WMC_TARGET) -i -H $(BUGCODES_H) -o $(BUGCODES_RC) $(NTOSKRNL_MC)
182
183 $(ERRCODES_H) $(ERRCODES_RC): $(WMC_TARGET) $(KERNEL32_MC)
184 $(ECHO_WMC)
185 $(Q)$(WMC_TARGET) -i -H $(ERRCODES_H) -o $(ERRCODES_RC) $(KERNEL32_MC)
186
187 .PHONY: makefile_auto_clean
188 makefile_auto_clean:
189 -@$(rm) makefile.auto $(PREAUTO) 2>$(NUL)
190
191 .PHONY: clean
192 clean: makefile_auto_clean