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