For the most part all the changes here are behind-the-scenes and disabled
[dyninst.git] / Makefile
1 #
2 # TopLevel Makefile for the Paradyn (and DyninstAPI) system.
3 #
4 # $Id: Makefile,v 1.94 2008/09/03 06:08:43 jaw Exp $
5 #
6
7 TO_CORE = .
8 # Include additional local definitions (if available)
9 -include ./make.config.local
10 # Include the make configuration specification (site configuration options)
11 include ./make.config
12
13 BUILD_ID = "$(SUITE_NAME) v$(RELEASE_NUM)$(BUILD_MARK)$(BUILD_NUM)"
14
15 # "basicComps" is the list of components which need to be built first
16 # with "make world", since they are used building the rest of the system.
17 #
18 # "subSystems" is the list of all other pieces which should be built
19 # as part of Paradyn.
20 #
21 # "DyninstAPI" is the list of additional API components (optional).
22
23 basicComps      = igen mrnet pdutil 
24 ParadynD        = pdutil igen mrnet sharedMem rtinst symtabAPI dyninstAPI dyninstAPI_RT paradynd
25 ParadynFE       = pdthread paradyn
26 ParadynVC       = visi \
27                 visiClients/tclVisi visiClients/barchart \
28                 visiClients/tableVisi visiClients/phaseTable \
29                 visiClients/histVisi visiClients/terrain \
30                 visiClients/termWin
31
32 subSystems      = $(ParadynD) $(ParadynFE) $(ParadynVC)
33 SymtabAPI       = ready common symtabAPI dynutil
34 StackwalkerAPI = ready common symtabAPI stackwalk
35 DyninstAPI      = ready common symtabAPI dyninstAPI_RT dyninstAPI dynutil instructionAPI
36 InstructionAPI  = ready common instructionAPI dynutil
37
38 testsuites = dyninstAPI/tests testsuite 
39
40 allSubdirs      = $(subSystems) common dyninstAPI/tests testsuite dynutil instructionAPI stackwalk newtestsuite
41 allSubdirs_noinstall =
42
43 # We're not building the new test suite on all platforms yet
44 ifeq ($(DONT_BUILD_NEWTESTSUITE),false)
45 testsuites += newtestsuite
46 allSubdirs_noinstall += newtestsuite
47 endif
48
49 # "fullSystem" is the list of all Paradyn & DyninstAPI components to build:
50 # set DONT_BUILD_PARADYN or DONT_BUILD_DYNINST in make.config.local if desired
51 ifndef DONT_BUILD_PARADYN
52 fullSystem      += $(basicComps)
53 Build_list      += basicComps
54 ifndef DONT_BUILD_FE
55 fullSystem      += $(ParadynFE)
56 Build_list      += ParadynFE
57 endif
58 ifndef DONT_BUILD_DAEMON
59 fullSystem      += $(ParadynD)
60 Build_list      += ParadynD
61 endif
62 ifndef DONT_BUILD_VISIS
63 fullSystem      += $(ParadynVC)
64 Build_list      += ParadynVC
65 endif
66 endif
67
68 ifndef DONT_BUILD_DYNINST
69 fullSystem      += $(DyninstAPI)
70 Build_list      += DyninstAPI
71 endif
72
73 ifndef DONT_BUILD_OLDTESTSUITE
74 fullSystem      += dyninstAPI/tests
75 endif
76
77 ifndef DONT_BUILD_TESTSUITE
78 fullSystem      += testsuite
79 endif
80
81 # Note that the first rule listed ("all") is what gets made by default,
82 # i.e., if make is given no arguments.  Don't add other targets before all!
83
84 all: ready world
85
86 # This rule makes most of the normal recursive stuff.  Just about any
87 # target can be passed down to the lower-level Makefiles by listing it
88 # as a target here:
89
90 clean depend distclean:
91         +@for subsystem in $(fullSystem); do                    \
92             if [ -f $$subsystem/$(PLATFORM)/Makefile ]; then    \
93                         $(MAKE) -C $$subsystem/$(PLATFORM) $@;          \
94             else                                                \
95                         true;                                           \
96             fi                                                  \
97         done
98
99 install:        ready world
100         +@for subsystem in $(fullSystem); do                    \
101                 if [ -f $$subsystem/$(PLATFORM)/Makefile ]; then        \
102                         $(MAKE) -C $$subsystem/$(PLATFORM) install;             \
103                 elif [ -f $$subsytem/Makefile ]; then                   \
104                         $(MAKE) -C $$subsystem install; \
105            else \
106                         true;                                           \
107            fi                                                   \
108         done    
109
110 # Check that the main installation directories, etc., are ready for a build,
111 # creating them if they don't already exist!  Also touch make.config.local
112 # if needed.
113
114 ready:
115         +@for installdir in $(LIBRARY_DEST) $(PROGRAM_DEST) $(INCLUDE_DEST); do \
116             if [ -d $$installdir ]; then                        \
117                 echo "Installation directory $$installdir exists...";   \
118                 true;                                           \
119             else                                                \
120                 echo "Creating installation directory $$installdir ...";\
121                 mkdir -p $$installdir;                          \
122             fi                                                  \
123         done
124
125         +@if [ ! -f make.config.local ]; then   \
126             touch make.config.local;            \
127         fi
128
129         +@echo "Primary compiler for Paradyn build is:"
130         +@if [ `basename $(CXX)` = "xlC" ]; then                \
131                echo "xlC"; \
132         elif [ `basename $(CXX)` = "insure" ]; then \
133                 echo "insure"; \
134         else \
135           $(CXX) -v; \
136      true; \
137         fi
138
139 # The "make world" target is set up to build things in the "correct"
140 # order for a build from scratch.  It builds and installs things in the
141 # "basicComps" list first, then builds and installs the remaining
142 # Paradyn "subSystems" (excluding the currently optional DyninstAPI).
143 # NB: "make world" has also been set up locally to build the DyninstAPI,
144 # however, this is optional and can be removed if desired.
145 #
146 # This make target doesn't go first in the Makefile, though, since we
147 # really only want to make "install" when it's specifically requested.
148 # Note that "world" doesn't do a "clean", since it's nice to be able
149 # to restart a compilation that fails without re-doing a lot of
150 # unnecessary work.
151
152 intro:
153         @echo "Build of $(BUILD_ID) starting for $(PLATFORM)!"
154 ifdef DONT_BUILD_PARADYN
155         @echo "Build of Paradyn components skipped!"
156 endif
157 ifdef DONT_BUILD_FE
158         @echo "Build of Paradyn front-end components skipped!"
159 endif
160 ifdef DONT_BUILD_DAEMON
161         @echo "Build of Paradyn daemon components skipped!"
162 endif
163 ifdef DONT_BUILD_VISIS
164         @echo "Build of Paradyn visi client components skipped!"
165 endif
166 ifdef DONT_BUILD_PD_MT
167         @echo "Build of ParadynMT components skipped!"
168 endif
169 ifdef DONT_BUILD_DYNINST
170         @echo "Build of DyninstAPI components skipped!"
171 endif
172
173 world: intro
174         $(MAKE) $(fullSystem)
175         @echo "Build of $(BUILD_ID) complete for $(PLATFORM)!"
176
177 # "make Paradyn" and "make DyninstAPI" are also useful and valid build targets!
178
179 Paradyn ParadynD ParadynFE ParadynVC DyninstAPI SymtabAPI StackwalkerAPI basicComps subSystems testsuites InstructionAPI: 
180         $(MAKE) $($@)
181         @echo "Build of $@ complete."
182         @date
183
184 # Low-level directory-targets  (used in the sets defined above)
185 # Explicit specification of these rules permits better parallelization
186 # than building subsystems using a for loop
187
188 .PHONY: $(allSubdirs) $(allSubdirs_noinstall)
189
190 $(allSubdirs): 
191         @if [ -f $@/$(PLATFORM)/Makefile ]; then \
192                 $(MAKE) -C $@/$(PLATFORM) && \
193                 $(MAKE) -C $@/$(PLATFORM) install; \
194         elif [ -f $@/Makefile ]; then \
195                 $(MAKE) -C $@ && \
196                 $(MAKE) -C $@ install; \
197         else \
198                 echo $@ has no Makefile; \
199                 false; \
200         fi
201
202 $(allSubdirs_noinstall):
203         @echo "***allSubdirs_noinstall***"
204         +@if [ -f $@/$(PLATFORM)/Makefile ]; then \
205                 $(MAKE) -C $@/$(PLATFORM); \
206         elif [ -f $@/Makefile ]; then \
207                 $(MAKE) -C $@; \
208         else \
209                 @echo $@ has no Makefile; \
210                 false; \
211         fi
212
213 # Generate targets of the form install_<target> for all directories in
214 # allSubdirs_noinstall
215 allSubdirs_explicitInstall = $(patsubst %,install_%,$(allSubdirs_noinstall))
216
217 $(allSubdirs_explicitInstall): install_%: %
218         +@if [ -f $(@:install_%=%)/$(PLATFORM)/Makefile ]; then \
219                 $(MAKE) -C $(@:install_%=%)/$(PLATFORM) install \
220         elif [ -f $(@:install_%=%)/Makefile ]; then \
221                 $(MAKE) -C $(@:install_%=%) install; \
222         else \
223                 @echo $(@:install_%=%) has no Makefile; \
224                 false; \
225         fi
226
227
228 # dependencies -- keep parallel make from building out of order
229 symtabAPI igen: common
230 stackwalk: symtabAPI dynutil
231 dyninstAPI: symtabAPI instructionAPI
232 symtabAPI dyninstAPI: dynutil
233 paradynd:  pdutil dyninstAPI 
234 paradyn: pdutil pdthread 
235 pdthread: igen mrnet 
236 visi:  pdutil
237 pdutil: igen
238 visiClients/tclVisi: visi
239 visiClients/barchart: visi
240 visiClients/tableVisi: visi
241 visiClients/phaseTable: visi
242 visiClients/histVisi: visi
243 visiClients/terrain: visi
244 visiClients/termWin: visi mrnet pdthread
245 dyner codeCoverage dyninstAPI/tests testsuite newtestsuite: dyninstAPI
246 rtinst: igen dyninstAPI_RT 
247
248 # This rule passes down the documentation-related make stuff to
249 # lower-level Makefiles in the individual "docs" directories.
250
251 docs install-man:
252         +for subsystem in $(fullSystem); do                     \
253             if [ -f $$subsystem/docs/Makefile ]; then           \
254                 $(MAKE) -C $$subsystem/docs $@;                 \
255             else                                                \
256                 true;                                           \
257             fi                                                  \
258         done
259
260
261 # The "make nightly" target is what should get run automatically every
262 # night.  It uses "make world" to build things in the right order for
263 # a build from scratch.  
264 #
265 # Note that "nightly" should only be run on the primary build site,
266 # and does things like building documentation that don't need to be
267 # built for each different architecture.  Other "non-primary" build
268 # sites that run each night should just run "make clean world".
269
270 umd-nightly:
271         $(MAKE) clean
272         $(MAKE) DyninstAPI
273
274 # Used for nightly builds
275 nightly: DyninstAPI testsuites
276
277 #nightly:
278 #       $(MAKE) clean
279 #       $(MAKE) world
280 ##      $(MAKE) DyninstAPI
281 #       $(MAKE) docs
282 #       $(MAKE) install-man
283 #       chmod 644 /p/paradyn/man/man?/*