att
[dyninst.git] / Makefile
1 #
2 # TopLevel Makefile for the Paradyn (and DyninstAPI) system.
3 #
4 # $Id: Makefile,v 1.87 2008/03/12 20:08:23 legendre 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 DyninstAPI      = ready common symtabAPI dyninstAPI_RT dyninstAPI dyninstAPI/tests testsuite dyner codeCoverage dynutil
35
36 allSubdirs      = $(subSystems) common dyninstAPI/tests testsuite dyner codeCoverage dynutil
37
38 # "fullSystem" is the list of all Paradyn & DyninstAPI components to build:
39 # set DONT_BUILD_PARADYN or DONT_BUILD_DYNINST in make.config.local if desired
40 ifndef DONT_BUILD_PARADYN
41 fullSystem      += $(basicComps)
42 Build_list      += basicComps
43 ifndef DONT_BUILD_FE
44 fullSystem      += $(ParadynFE)
45 Build_list      += ParadynFE
46 endif
47 ifndef DONT_BUILD_DAEMON
48 fullSystem      += $(ParadynD)
49 Build_list      += ParadynD
50 endif
51 ifndef DONT_BUILD_VISIS
52 fullSystem      += $(ParadynVC)
53 Build_list      += ParadynVC
54 endif
55 endif
56
57 ifndef DONT_BUILD_DYNINST
58 fullSystem      += $(DyninstAPI)
59 Build_list      += DyninstAPI
60 endif
61
62 # Note that the first rule listed ("all") is what gets made by default,
63 # i.e., if make is given no arguments.  Don't add other targets before all!
64
65 all: ready world
66
67 # This rule makes most of the normal recursive stuff.  Just about any
68 # target can be passed down to the lower-level Makefiles by listing it
69 # as a target here:
70
71 clean depend distclean:
72         +@for subsystem in $(fullSystem); do                    \
73             if [ -f $$subsystem/$(PLATFORM)/Makefile ]; then    \
74                         $(MAKE) -C $$subsystem/$(PLATFORM) $@;          \
75             else                                                \
76                         true;                                           \
77             fi                                                  \
78         done
79
80 install:        ready world
81         +@for subsystem in $(fullSystem); do                    \
82                 if [ -f $$subsystem/$(PLATFORM)/Makefile ]; then        \
83                         $(MAKE) -C $$subsystem/$(PLATFORM) install;             \
84                 elif [ -f $$subsytem/Makefile ]; then                   \
85                         $(MAKE) -C $$subsystem install; \
86            else \
87                         true;                                           \
88            fi                                                   \
89         done    
90
91 # Check that the main installation directories, etc., are ready for a build,
92 # creating them if they don't already exist!  Also touch make.config.local
93 # if needed.
94
95 ready:
96         +@for installdir in $(LIBRARY_DEST) $(PROGRAM_DEST) $(INCLUDE_DEST); do \
97             if [ -d $$installdir ]; then                        \
98                 echo "Installation directory $$installdir exists...";   \
99                 true;                                           \
100             else                                                \
101                 echo "Creating installation directory $$installdir ...";\
102                 mkdir -p $$installdir;                          \
103             fi                                                  \
104         done
105
106         +@if [ ! -f make.config.local ]; then   \
107             touch make.config.local;            \
108         fi
109
110         +@echo "Primary compiler for Paradyn build is:"
111         +@if [ `basename $(CXX)` = "xlC" ]; then                \
112                echo "xlC"; \
113         elif [ `basename $(CXX)` = "insure" ]; then \
114                 echo "insure"; \
115         else \
116           $(CXX) -v; \
117      true; \
118         fi
119
120 # The "make world" target is set up to build things in the "correct"
121 # order for a build from scratch.  It builds and installs things in the
122 # "basicComps" list first, then builds and installs the remaining
123 # Paradyn "subSystems" (excluding the currently optional DyninstAPI).
124 # NB: "make world" has also been set up locally to build the DyninstAPI,
125 # however, this is optional and can be removed if desired.
126 #
127 # This make target doesn't go first in the Makefile, though, since we
128 # really only want to make "install" when it's specifically requested.
129 # Note that "world" doesn't do a "clean", since it's nice to be able
130 # to restart a compilation that fails without re-doing a lot of
131 # unnecessary work.
132
133 intro:
134         @echo "Build of $(BUILD_ID) starting for $(PLATFORM)!"
135 ifdef DONT_BUILD_PARADYN
136         @echo "Build of Paradyn components skipped!"
137 endif
138 ifdef DONT_BUILD_FE
139         @echo "Build of Paradyn front-end components skipped!"
140 endif
141 ifdef DONT_BUILD_DAEMON
142         @echo "Build of Paradyn daemon components skipped!"
143 endif
144 ifdef DONT_BUILD_VISIS
145         @echo "Build of Paradyn visi client components skipped!"
146 endif
147 ifdef DONT_BUILD_PD_MT
148         @echo "Build of ParadynMT components skipped!"
149 endif
150 ifdef DONT_BUILD_DYNINST
151         @echo "Build of DyninstAPI components skipped!"
152 endif
153
154 world: intro
155         $(MAKE) $(fullSystem)
156         @echo "Build of $(BUILD_ID) complete for $(PLATFORM)!"
157
158 # "make Paradyn" and "make DyninstAPI" are also useful and valid build targets!
159
160 Paradyn ParadynD ParadynFE ParadynVC DyninstAPI SymtabAPI basicComps subSystems: 
161         $(MAKE) $($@)
162         @echo "Build of $@ complete."
163         @date
164
165 # Low-level directory-targets  (used in the sets defined above)
166 # Explicit specification of these rules permits better parallelization
167 # than building subsystems using a for loop
168
169 .PHONY: $(allSubdirs)
170
171 $(allSubdirs): 
172         @if [ -f $@/$(PLATFORM)/Makefile ]; then \
173                 $(MAKE) -C $@/$(PLATFORM) && \
174                 $(MAKE) -C $@/$(PLATFORM) install; \
175         elif [ -f $@/Makefile ]; then \
176                 $(MAKE) -C $@ && \
177                 $(MAKE) -C $@ install; \
178         else \
179                 echo $@ has no Makefile; \
180                 false; \
181         fi
182
183
184 # dependencies -- keep parallel make from building out of order
185 symtabAPI igen: common
186 dyninstAPI: symtabAPI
187 symtabAPI dyninstAPI: dynutil
188 paradynd:  pdutil dyninstAPI 
189 paradyn: pdutil pdthread 
190 pdthread: igen mrnet 
191 visi:  pdutil
192 pdutil: igen
193 visiClients/tclVisi: visi
194 visiClients/barchart: visi
195 visiClients/tableVisi: visi
196 visiClients/phaseTable: visi
197 visiClients/histVisi: visi
198 visiClients/terrain: visi
199 visiClients/termWin: visi mrnet pdthread
200 dyner codeCoverage dyninstAPI/tests testsuite newtestsuite: dyninstAPI
201 rtinst: igen dyninstAPI_RT 
202
203 # This rule passes down the documentation-related make stuff to
204 # lower-level Makefiles in the individual "docs" directories.
205
206 docs install-man:
207         +for subsystem in $(fullSystem); do                     \
208             if [ -f $$subsystem/docs/Makefile ]; then           \
209                 $(MAKE) -C $$subsystem/docs $@;                 \
210             else                                                \
211                 true;                                           \
212             fi                                                  \
213         done
214
215
216 # The "make nightly" target is what should get run automatically every
217 # night.  It uses "make world" to build things in the right order for
218 # a build from scratch.  
219 #
220 # Note that "nightly" should only be run on the primary build site,
221 # and does things like building documentation that don't need to be
222 # built for each different architecture.  Other "non-primary" build
223 # sites that run each night should just run "make clean world".
224
225 umd-nightly:
226         $(MAKE) clean
227         $(MAKE) DyninstAPI
228
229 nightly:
230         $(MAKE) clean
231         $(MAKE) world
232 #       $(MAKE) DyninstAPI
233         $(MAKE) docs
234         $(MAKE) install-man
235         chmod 644 /p/paradyn/man/man?/*