framework.make
1 # Simple makefile for building a framework or library on platforms other than OS X. 2 # the open source subset used in Darwin. 3 # 4 # These make variables (or environment variables) are used 5 # if defined: 6 # SRCROOT path location of root of source hierarchy; 7 # defaults to ".", but must be set to a 8 # destination path for installsrc target. 9 # OBJROOT path location where .o files will be put; 10 # defaults to "/tmp/CoreFoundation.obj". 11 # SYMROOT path location where build products will be 12 # put; defaults to "/tmp/CoreFoundation.sym". 13 # DSTROOT path location where installed products will 14 # be put; defaults to "/tmp/CoreFoundation.dst". 15 # 16 # Interesting variables to be set by the including Makefile: 17 # NAME base name of the framework or library 18 # CFILES .c to build 19 # CPP_FILES .cpp to build 20 # PUBLIC_HFILES .h files that will be installed for clients of API 21 # PRIVATE_HFILES .h files that will be installed for clients of SPI 22 # PROJECT_HFILES the rest of the .h files in the project 23 # PUBLIC_IFILES .i with API 24 # PRIVATE_IFILES .i files with SPI 25 # IFILES_DIR directory holding all the .i files 26 # MASTER_INTERFACE_DIR location of .i files we depend on 27 # 28 # We now follow the model of modern PB builds, which allow SYMROOT and OBJROOT to be shared 29 # across projects during development. This provides the benefit that one set of build flags 30 # (-F on Mach, -I and -L on Unix or Cygwin) can be used to share build products across projects. 31 # For release builds, the directories are always separate per project. 32 # 33 # PLATFORM name of platform being built on 34 # USER name of user building the project 35 # ARCHS list of archs for which to build 36 # RC_ARCHS more archs for which to build (build system) 37 # OTHER_CFLAGS other flags to be passed to compiler 38 # RC_CFLAGS more flags to be passed to compiler (build system) 39 # OTHER_LFLAGS other flags to be passed to the link stage 40 # 41 # (Note: lame "#*/" tacked onto some lines is to get PB to stop syntax coloring the entire rest of the file as a comment.) 42 43 # First figure out the platform if not specified, so we can use it in the 44 # rest of this file. Currently defined values: Darwin, Linux, FreeBSD, variants of CYGWIN 45 ifeq "$(PLATFORM)" "" 46 PLATFORM := $(shell uname) 47 endif 48 49 ifeq "$(PLATFORM)" "Darwin" 50 # Darwin platforms always define __MACH__ 51 else 52 ifneq "" "$(findstring CYGWIN, $(PLATFORM))" 53 # The windows platforms all define one cpp symbol or another, which CFBase.h funnels to __WIN32__. 54 # Simplify later checks, since we don't care about different versions of CYGWIN. 55 PLATFORM = CYGWIN 56 else 57 ifeq "$(PLATFORM)" "Linux" 58 PLATFORM_CFLAGS = -D__LINUX__=1 59 else 60 ifeq "$(PLATFORM)" "FreeBSD" 61 PLATFORM_CFLAGS = -D__FREEBSD__=1 62 else 63 $(error Platform could not be identified. Neither $$PLATFORM was set, nor the result of uname was recognized) 64 endif 65 endif 66 endif 67 endif 68 69 # 70 # Set up basic variables, commands we use 71 # 72 73 ifndef SRCROOT 74 SRCROOT = . 75 endif 76 77 ifndef OBJROOT 78 OBJROOT = /tmp/$(NAME).obj 79 endif 80 81 ifndef SYMROOT 82 SYMROOT = /tmp/$(NAME).sym 83 endif 84 85 ifndef DSTROOT 86 DSTROOT = /tmp/$(NAME).dst 87 endif 88 89 SILENT = @ 90 ifeq "$(PLATFORM)" "CYGWIN" 91 CC = gcc 92 CPLUSPLUS = g++ 93 ECHO = echo 94 MKDIRS = mkdir -p 95 COPY = cp 96 COPY_RECUR = cp -r 97 REMOVE = rm 98 REMOVE_RECUR = rm -rf 99 SYMLINK = ln -s 100 CHMOD = chmod 101 CHOWN = chown 102 TAR = tar 103 TOUCH = touch 104 STRIP = strip 105 DLLTOOL = dlltool 106 INTERFACER = Interfacer 107 else 108 ifeq "$(PLATFORM)" "Darwin" 109 CC = /usr/bin/cc 110 else 111 CC = /usr/bin/gcc 112 endif 113 CPLUSPLUS = /usr/bin/g++ 114 ECHO = /bin/echo 115 MKDIRS = /bin/mkdir -p 116 COPY = /bin/cp 117 COPY_RECUR = /bin/cp -r 118 REMOVE = /bin/rm 119 REMOVE_RECUR = /bin/rm -rf 120 SYMLINK = /bin/ln -s 121 CHMOD = /bin/chmod 122 CHOWN = /usr/sbin/chown 123 TAR = /usr/bin/tar 124 TOUCH = /usr/bin/touch 125 STRIP = /usr/bin/strip 126 INTERFACER = /AppleInternal/Developer/Tools/Interfacer 127 endif 128 129 # 130 # Set up CC flags 131 # 132 133 ifeq "$(PLATFORM)" "Darwin" 134 C_WARNING_FLAGS += -Wno-precomp -Wno-four-char-constants -Wall 135 CPP_WARNING_FLAGS += -Wno-precomp -Wno-four-char-constants -Wall 136 endif 137 138 ifeq "$(PLATFORM)" "CYGWIN" 139 C_WARNING_FLAGS += -Wall 140 CPP_WARNING_FLAGS += -Wall 141 endif 142 143 ifeq "$(PLATFORM)" "Darwin" 144 ifneq "$(ARCHS)" "" 145 ARCH_FLAGS = $(foreach A, $(ARCHS), $(addprefix -arch , $(A))) 146 else 147 ifneq "$(RC_ARCHS)" "" 148 ARCH_FLAGS = $(foreach A, $(RC_ARCHS), $(addprefix -arch , $(A))) 149 else 150 ARCH_FLAGS = -arch ppc 151 endif 152 endif 153 endif 154 155 ifeq "$(PLATFORM)" "FreeBSD" 156 ARCH_FLAGS = -march=i386 157 endif 158 159 ifeq "$(PLATFORM)" "Linux" 160 ARCH_FLAGS = 161 endif 162 163 ifeq "$(USER)" "" 164 USER = unknown 165 endif 166 167 CFLAGS = -fno-common -pipe $(PLATFORM_CFLAGS) $(C_WARNING_FLAGS) -I. 168 CPPFLAGS = -fno-common -pipe $(PLATFORM_CFLAGS) $(CPP_WARNING_FLAGS) -I. 169 170 ifeq "$(PLATFORM)" "Darwin" 171 CFLAGS += $(ARCH_FLAGS) -F$(SYMROOT) -fconstant-cfstrings 172 CPPFLAGS += $(ARCH_FLAGS) -F$(SYMROOT) -fconstant-cfstrings 173 endif 174 175 ifeq "$(PLATFORM)" "CYGWIN" 176 # -mno-cygwin can be left out to build using the CYGWIN unix emulation libs 177 CFLAGS += -mno-cygwin 178 CPPFLAGS += -mno-cygwin 179 endif 180 181 182 183 # 184 # Set style of building the library/framework, and the linker flags 185 # 186 187 ifeq "$(wildcard /System/Library/Frameworks)" "" 188 LIBRARY_STYLE = Library 189 LIBRARY_EXT = .so 190 RELEASE_LIB = lib$(NAME)$(LIBRARY_EXT) 191 DEBUG_LIB = lib$(NAME)_debug$(LIBRARY_EXT) 192 PROFILE_LIB = lib$(NAME)_profile$(LIBRARY_EXT) 193 ifeq "$(PLATFORM)" "Linux" 194 LIBRARY_EXT = .a 195 endif 196 INSTALLDIR = /usr/local/lib 197 ifeq "$(PLATFORM)" "CYGWIN" 198 LIBRARY_EXT = .dll 199 RELEASE_LIB = $(NAME)$(LIBRARY_EXT) 200 DEBUG_LIB = $(NAME)_debug$(LIBRARY_EXT) 201 PROFILE_LIB = $(NAME)_profile$(LIBRARY_EXT) 202 RELEASE_IMPLIB = lib$(RELEASE_LIB:.dll=.a) 203 DEBUG_IMPLIB = lib$(DEBUG_LIB:.dll=.a) 204 PROFILE_IMPLIB = lib$(PROFILE_LIB:.dll=.a) 205 INSTALLDIR = /usr/local/bin 206 LIB_INSTALLDIR = /usr/local/lib 207 endif 208 HEADER_INSTALLDIR = /usr/local/include/$(NAME) 209 INSTALLDIR = /usr/local/lib 210 MASTER_INTERFACE_DIR = $(SYMROOT)/interfaces 211 # Next four dirs are used at build time, but not install time 212 PUBLIC_HEADER_DIR = $(SYMROOT)/Headers/$(NAME) 213 PRIVATE_HEADER_DIR = $(SYMROOT)/PrivateHeaders/$(NAME) 214 PROJECT_HEADER_DIR = $(OBJROOT)/$(NAME).build/ProjectHeaders/$(NAME) 215 RESOURCE_DIR = $(SYMROOT) 216 else 217 LIBRARY_STYLE = Framework 218 RELEASE_LIB = $(NAME) 219 DEBUG_LIB = $(NAME)_debug 220 PROFILE_LIB = $(NAME)_profile 221 INSTALLDIR = /System/Library/Frameworks 222 FRAMEWORK_DIR = /System/Library/Frameworks/$(NAME).framework 223 MASTER_INTERFACE_DIR = /AppleInternal/Carbon/interfaces 224 # Next three dirs are used at build time, but not install time 225 PUBLIC_HEADER_DIR = $(SYMROOT)/$(NAME).framework/Versions/A/Headers 226 PRIVATE_HEADER_DIR = $(SYMROOT)/$(NAME).framework/Versions/A/PrivateHeaders 227 PROJECT_HEADER_DIR = $(OBJROOT)/$(NAME).build/ProjectHeaders 228 endif 229 230 ifeq "$(PLATFORM)" "Darwin" 231 LFLAGS = $(ARCH_FLAGS) -dynamiclib -dynamic 232 endif 233 234 ifeq "$(PLATFORM)" "FreeBSD" 235 LFLAGS = -shared 236 endif 237 238 ifeq "$(PLATFORM)" "CYGWIN" 239 # -mno-cygwin can be left out to build using the CYGWIN unix emulation libs 240 LFLAGS = -mno-cygwin -L$(SYMROOT) 241 endif 242 243 # other flags passed in from the make command line, and RC 244 CFLAGS += $(OTHER_CFLAGS) $(RC_CFLAGS) 245 CPPFLAGS += $(OTHER_CPPFLAGS) $(RC_CFLAGS) 246 LFLAGS += $(OTHER_LFLAGS) 247 248 249 # Needed to find Project Headers, which work in PB because of the fancy -header-mapfile feature. 250 CFLAGS += -I$(PROJECT_HEADER_DIR) 251 CPPFLAGS += -I$(PROJECT_HEADER_DIR) 252 # Needed for cases when a private header is included as "Foo.h" instead of <CF/Foo.h> 253 CFLAGS += -I$(PRIVATE_HEADER_DIR) 254 CPPFLAGS += -I$(PRIVATE_HEADER_DIR) 255 ifeq "$(LIBRARY_STYLE)" "Library" 256 # Needed for headers included as <CF/Foo.h>, since there is no -FframeworkDir mechanism at work 257 CFLAGS += -I$(PUBLIC_HEADER_DIR)/.. -I$(PRIVATE_HEADER_DIR)/.. 258 CPPFLAGS += -I$(PUBLIC_HEADER_DIR)/.. -I$(PRIVATE_HEADER_DIR)/.. 259 endif 260 261 262 .PHONY: build all prebuild release debug profile debug-build release-build profile-build build-realwork test 263 default: build 264 all: build 265 build: prebuild debug-build release-build profile-build 266 release: prebuild release-build 267 debug: prebuild debug-build 268 profile: prebuild profile-build 269 270 # These are the main targets: 271 # build builds the library to OBJROOT and SYMROOT 272 # installsrc copies the sources to SRCROOT 273 # installhdrs install only the headers to DSTROOT 274 # install build, then install the headers and library to DSTROOT 275 # clean removes build products in OBJROOT and SYMROOT 276 # test invoke items in Tests subdirectory 277 278 #-------------------------------------------------------------------------------- 279 # INSTALL 280 #-------------------------------------------------------------------------------- 281 282 installsrc: 283 $(SILENT) $(ECHO) "Installing source..." 284 ifeq "$(SRCROOT)" "." 285 $(SILENT) $(ECHO) "SRCROOT must be defined to be the destination directory; it cannot be '.'" 286 exit 1 287 endif 288 $(SILENT) $(MKDIRS) $(SRCROOT) 289 $(SILENT) $(MKDIRS) $(foreach S, $(SUBPROJECTS), $(SRCROOT)/$(S).subproj) 290 -$(SILENT) $(foreach S, $(SUBPROJECTS), $(COPY) $(foreach F, $($(S)_SOURCES), $(S).subproj/$(F)) $(SRCROOT)/$(S).subproj;) 291 -$(SILENT) $(foreach S, $(SUBPROJECTS), $(COPY) $(foreach F, $($(S)_PROJHEADERS), $(S).subproj/$(F)) $(SRCROOT)/$(S).subproj;) 292 -$(SILENT) $(foreach S, $(SUBPROJECTS), $(COPY) $(foreach F, $($(S)_PRIVHEADERS), $(S).subproj/$(F)) $(SRCROOT)/$(S).subproj;) 293 -$(SILENT) $(foreach S, $(SUBPROJECTS), $(COPY) $(foreach F, $($(S)_PUBHEADERS), $(S).subproj/$(F)) $(SRCROOT)/$(S).subproj;) 294 $(SILENT) $(COPY) $(OTHER_SOURCES) $(SRCROOT) 295 $(SILENT) $(COPY_RECUR) CharacterSets $(SRCROOT) 296 $(SILENT) $(REMOVE_RECUR) $(SRCROOT)/CharacterSets/CVS 297 298 installhdrs: 299 $(SILENT) $(ECHO) "Installing headers..." 300 ifeq "$(LIBRARY_STYLE)" "Framework" 301 $(SILENT) $(REMOVE) -f $(DSTROOT)/$(FRAMEWORK_DIR)/Headers 302 $(SILENT) $(REMOVE) -f $(DSTROOT)/$(FRAMEWORK_DIR)/PrivateHeaders 303 $(SILENT) $(REMOVE) -f $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/Current 304 $(SILENT) $(MKDIRS) $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/Headers 305 $(SILENT) $(MKDIRS) $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/PrivateHeaders 306 $(SILENT) $(SYMLINK) A $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/Current 307 $(SILENT) $(SYMLINK) Versions/Current/Headers $(DSTROOT)/$(FRAMEWORK_DIR)/Headers 308 $(SILENT) $(SYMLINK) Versions/Current/PrivateHeaders $(DSTROOT)/$(FRAMEWORK_DIR)/PrivateHeaders 309 -$(SILENT) $(CHMOD) +w $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/Headers/*.h #*/ 310 -$(SILENT) $(CHMOD) +w $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/PrivateHeaders/*.h #*/ 311 $(SILENT) $(COPY) $(PUBLIC_HFILES) $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/Headers 312 # Install two private headers for internal Apple projects' use 313 $(SILENT) $(COPY) Base.subproj/CFPriv.h Base.subproj/CFRuntime.h PlugIn.subproj/CFBundlePriv.h $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/PrivateHeaders 314 $(SILENT) $(CHOWN) -R root:wheel $(DSTROOT)/$(FRAMEWORK_DIR) 315 -$(SILENT) $(CHMOD) -w $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/Headers/*.h #*/ 316 -$(SILENT) $(CHMOD) -w $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/PrivateHeaders/*.h #*/ 317 endif 318 ifeq "$(LIBRARY_STYLE)" "Library" 319 $(SILENT) $(MKDIRS) $(DSTROOT)/$(HEADER_INSTALLDIR) 320 -$(SILENT) $(CHMOD) +w $(DSTROOT)/$(HEADER_INSTALLDIR)/*.h #*/ 321 $(SILENT) $(COPY) $(PUBLIC_HFILES) $(DSTROOT)/$(HEADER_INSTALLDIR) 322 $(SILENT) $(CHMOD) -w $(DSTROOT)/$(HEADER_INSTALLDIR)/*.h #*/ 323 endif 324 325 install: build install_before install_builtin install_after 326 install_before:: 327 install_after:: 328 329 install_builtin: 330 $(SILENT) $(ECHO) "Installing..." 331 ifeq "$(LIBRARY_STYLE)" "Framework" 332 $(SILENT) $(REMOVE_RECUR) $(DSTROOT)/$(FRAMEWORK_DIR) 333 $(SILENT) $(MKDIRS) $(DSTROOT)/$(FRAMEWORK_DIR) 334 -$(SILENT) $(CHMOD) -R +w $(DSTROOT)/$(FRAMEWORK_DIR) 335 $(SILENT) (cd $(SYMROOT) && $(TAR) -cf - $(NAME).framework) | (cd $(DSTROOT)/$(INSTALLDIR) && $(TAR) -xf -) 336 $(SILENT) $(STRIP) -S $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/$(RELEASE_LIB) 337 $(SILENT) $(STRIP) -S $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/$(DEBUG_LIB) 338 $(SILENT) $(STRIP) -S $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/$(PROFILE_LIB) 339 $(SILENT) $(CHMOD) -R ugo-w $(DSTROOT)/$(FRAMEWORK_DIR) 340 $(SILENT) $(CHMOD) -R o+rX $(DSTROOT)/$(FRAMEWORK_DIR) 341 $(SILENT) $(CHOWN) -R root:wheel $(DSTROOT)/$(FRAMEWORK_DIR) 342 endif 343 ifeq "$(LIBRARY_STYLE)" "Library" 344 $(SILENT) $(MKDIRS) $(DSTROOT)/$(INSTALLDIR) 345 -$(SILENT) $(CHMOD) +w $(DSTROOT)/$(INSTALLDIR) 346 $(SILENT) $(REMOVE) -f $(DSTROOT)/$(INSTALLDIR)/$(RELEASE_LIB) 347 $(SILENT) $(REMOVE) -f $(DSTROOT)/$(INSTALLDIR)/$(DEBUG_LIB) 348 $(SILENT) $(REMOVE) -f $(DSTROOT)/$(INSTALLDIR)/$(PROFILE_LIB) 349 $(SILENT) $(COPY) $(SYMROOT)/$(RELEASE_LIB) $(DSTROOT)/$(INSTALLDIR)/$(RELEASE_LIB) 350 $(SILENT) $(COPY) $(SYMROOT)/$(DEBUG_LIB) $(DSTROOT)/$(INSTALLDIR)/$(DEBUG_LIB) 351 $(SILENT) $(COPY) $(SYMROOT)/$(PROFILE_LIB) $(DSTROOT)/$(INSTALLDIR)/$(PROFILE_LIB) 352 ifneq "$(PLATFORM)" "CYGWIN" 353 -$(SILENT) $(CHOWN) root:wheel $(DSTROOT)/$(INSTALLDIR)/$(RELEASE_LIB) 354 -$(SILENT) $(CHOWN) root:wheel $(DSTROOT)/$(INSTALLDIR)/$(DEBUG_LIB) 355 -$(SILENT) $(CHOWN) root:wheel $(DSTROOT)/$(INSTALLDIR)/$(PROFILE_LIB) 356 endif 357 $(SILENT) $(CHMOD) 755 $(DSTROOT)/$(INSTALLDIR)/$(RELEASE_LIB) 358 $(SILENT) $(CHMOD) 755 $(DSTROOT)/$(INSTALLDIR)/$(DEBUG_LIB) 359 $(SILENT) $(CHMOD) 755 $(DSTROOT)/$(INSTALLDIR)/$(PROFILE_LIB) 360 ifeq "$(PLATFORM)" "CYGWIN" 361 $(SILENT) $(MKDIRS) $(DSTROOT)/$(LIB_INSTALLDIR) 362 -$(SILENT) $(CHMOD) +w $(DSTROOT)/$(LIB_INSTALLDIR) 363 $(SILENT) $(REMOVE) -f $(DSTROOT)/$(LIB_INSTALLDIR)/$(RELEASE_IMPLIB) 364 $(SILENT) $(REMOVE) -f $(DSTROOT)/$(LIB_INSTALLDIR)/$(DEBUG_IMPLIB) 365 $(SILENT) $(REMOVE) -f $(DSTROOT)/$(LIB_INSTALLDIR)/$(PROFILE_IMPLIB) 366 $(SILENT) $(COPY) $(SYMROOT)/$(RELEASE_IMPLIB) $(DSTROOT)/$(LIB_INSTALLDIR)/$(RELEASE_IMPLIB) 367 $(SILENT) $(COPY) $(SYMROOT)/$(DEBUG_IMPLIB) $(DSTROOT)/$(LIB_INSTALLDIR)/$(DEBUG_IMPLIB) 368 $(SILENT) $(COPY) $(SYMROOT)/$(PROFILE_IMPLIB) $(DSTROOT)/$(LIB_INSTALLDIR)/$(PROFILE_IMPLIB) 369 $(SILENT) $(CHMOD) 755 $(DSTROOT)/$(LIB_INSTALLDIR)/$(RELEASE_IMPLIB) 370 $(SILENT) $(CHMOD) 755 $(DSTROOT)/$(LIB_INSTALLDIR)/$(DEBUG_IMPLIB) 371 $(SILENT) $(CHMOD) 755 $(DSTROOT)/$(LIB_INSTALLDIR)/$(PROFILE_IMPLIB) 372 endif 373 $(SILENT) $(MKDIRS) $(DSTROOT)/$(HEADER_INSTALLDIR) 374 -$(SILENT) $(CHMOD) +w $(DSTROOT)/$(HEADER_INSTALLDIR)/*.h #*/ 375 $(SILENT) $(COPY) $(PUBLIC_HFILES) $(DSTROOT)/$(HEADER_INSTALLDIR) 376 -$(SILENT) $(CHMOD) -w $(DSTROOT)/$(HEADER_INSTALLDIR)/*.h #*/ 377 endif 378 379 #-------------------------------------------------------------------------------- 380 # CLEAN 381 #-------------------------------------------------------------------------------- 382 383 clean: clean_before clean_builtin clean_after 384 clean_before:: 385 clean_after:: 386 387 clean_builtin: 388 $(SILENT) $(ECHO) "Deleting build products..." 389 $(REMOVE_RECUR) $(OBJROOT)/$(NAME).build 390 ifeq "$(LIBRARY_STYLE)" "Framework" 391 $(REMOVE_RECUR) $(SYMROOT)/$(NAME).framework 392 endif 393 ifeq "$(LIBRARY_STYLE)" "Library" 394 $(REMOVE) -f $(SYMROOT)/$(RELEASE_LIB) 395 $(REMOVE) -f $(SYMROOT)/$(DEBUG_LIB) 396 $(REMOVE) -f $(SYMROOT)/$(PROFILE_LIB) 397 $(REMOVE_RECUR) -f $(PUBLIC_HEADER_DIR) $(PRIVATE_HEADER_DIR) 398 ifeq "$(PLATFORM)" "CYGWIN" 399 $(REMOVE) -f $(SYMROOT)/$(RELEASE_IMPLIB) 400 $(REMOVE) -f $(SYMROOT)/$(DEBUG_IMPLIB) 401 $(REMOVE) -f $(SYMROOT)/$(PROFILE_IMPLIB) 402 $(REMOVE) -f $(SYMROOT)/$(RELEASE_LIB:.dll=.lib) 403 $(REMOVE) -f $(SYMROOT)/$(DEBUG_LIB:.dll=.lib) 404 $(REMOVE) -f $(SYMROOT)/$(PROFILE_LIB:.dll=.lib) 405 $(REMOVE) -f $(SYMROOT)/$(RELEASE_LIB:.dll=.defs) 406 $(REMOVE) -f $(SYMROOT)/$(DEBUG_LIB:.dll=.defs) 407 $(REMOVE) -f $(SYMROOT)/$(PROFILE_LIB:.dll=.exp) 408 $(REMOVE) -f $(SYMROOT)/$(RELEASE_LIB:.dll=.exp) 409 $(REMOVE) -f $(SYMROOT)/$(DEBUG_LIB:.dll=.exp) 410 $(REMOVE) -f $(SYMROOT)/$(PROFILE_LIB:.dll=.defs) 411 endif 412 endif 413 414 #-------------------------------------------------------------------------------- 415 # PREBUILD 416 #-------------------------------------------------------------------------------- 417 418 prebuild: prebuild_before prebuild_setup prebuild_headers prebuild_after 419 prebuild_before:: 420 prebuild_after:: 421 422 # build the framework, or other basic dir structure 423 prebuild_setup:: 424 $(SILENT) $(ECHO) "Prebuild-setup..." 425 $(SILENT) $(MKDIRS) $(SYMROOT) 426 ifeq "$(LIBRARY_STYLE)" "Framework" 427 prebuild_setup:: 428 $(SILENT) $(MKDIRS) $(SYMROOT)/$(NAME).framework/Versions/A/Resources 429 $(SILENT) $(SYMLINK) A $(SYMROOT)/$(NAME).framework/Versions/Current 430 $(SILENT) $(SYMLINK) Versions/Current/Headers $(SYMROOT)/$(NAME).framework/Headers 431 $(SILENT) $(SYMLINK) Versions/Current/PrivateHeaders $(SYMROOT)/$(NAME).framework/PrivateHeaders 432 $(SILENT) $(SYMLINK) Versions/Current/Resources $(SYMROOT)/$(NAME).framework/Resources 433 endif 434 435 ifeq "$(LIBRARY_STYLE)" "Framework" 436 PLATFORM_IFLAGS = -framework $(NAME) -frameworkInterfaces $(IFILES_DIR) 437 ALL_IFILES = $(foreach F,$(PUBLIC_IFILES) $(PRIVATE_IFILES),$(IFILES_DIR)/$(F)) 438 439 # Since they share output directories, if either the ifiles or hfiles change we must redo both 440 prebuild_headers: $(OBJROOT)/$(NAME).build/Headers.touch 441 $(OBJROOT)/$(NAME).build/Headers.touch: $(PUBLIC_HFILES) $(PRIVATE_HFILES) $(PROJECT_HFILES) $(ALL_IFILES) 442 $(SILENT) $(REMOVE_RECUR) $(PUBLIC_HEADER_DIR) 443 $(SILENT) $(REMOVE_RECUR) $(PRIVATE_HEADER_DIR) 444 $(SILENT) $(REMOVE_RECUR) $(PROJECT_HEADER_DIR) 445 $(SILENT) $(MKDIRS) $(PUBLIC_HEADER_DIR) 446 $(SILENT) $(MKDIRS) $(PRIVATE_HEADER_DIR) 447 $(SILENT) $(MKDIRS) $(PROJECT_HEADER_DIR) 448 $(SILENT) $(MAKE) prebuild_copy_headers 449 ifneq "$(ALL_IFILES)" "" 450 $(SILENT) $(MAKE) prebuild_gen_headers 451 endif 452 $(SILENT) $(TOUCH) $(OBJROOT)/$(NAME).build/Headers.touch 453 else 454 455 ALL_IFILES = $(foreach F,$(PUBLIC_IFILES) $(PRIVATE_IFILES),$(IFILES_DIR)/$(F)) 456 457 # Since they share output directories, if either the ifiles or hfiles change we must redo both 458 prebuild_headers: $(OBJROOT)/$(NAME).build/Headers.touch 459 $(OBJROOT)/$(NAME).build/Headers.touch: $(PUBLIC_HFILES) $(PRIVATE_HFILES) $(PROJECT_HFILES) $(ALL_IFILES) 460 $(SILENT) $(REMOVE_RECUR) $(PUBLIC_HEADER_DIR) 461 $(SILENT) $(REMOVE_RECUR) $(PRIVATE_HEADER_DIR) 462 $(SILENT) $(REMOVE_RECUR) $(PROJECT_HEADER_DIR) 463 $(SILENT) $(MKDIRS) $(PUBLIC_HEADER_DIR) 464 $(SILENT) $(MKDIRS) $(PRIVATE_HEADER_DIR) 465 $(SILENT) $(MKDIRS) $(PROJECT_HEADER_DIR) 466 $(SILENT) $(MAKE) prebuild_copy_headers 467 ifneq "$(ALL_IFILES)" "" 468 $(SILENT) $(MAKE) prebuild_gen_headers 469 endif 470 $(SILENT) $(TOUCH) $(OBJROOT)/$(NAME).build/Headers.touch 471 472 # First try was not using -framework, so we get EXTERN_API to leverage for __declspec trickery. 473 # But that didn't help us for externed data, and the imports changed to omit the framework name. 474 # As best I can tell, when not using -framework you need to cd into the IFILES_DIR for the 475 # inter-file references to work. 476 # -update and -deepUpdate don't seem to work on WIN32, so just use a touch file 477 #ALL_IFILES = $(PUBLIC_IFILES) $(PRIVATE_IFILES) 478 #PLATFORM_IFLAGS = $(foreach F, $(ALL_IFILES), `cygpath -w $(F)`) 479 PLATFORM_IFLAGS = -framework $(NAME) -frameworkInterfaces `cygpath -w $(IFILES_DIR)/` 480 endif 481 prebuild_gen_headers: 482 $(SILENT) $(ECHO) "Processing interface files..." 483 $(SILENT) $(INTERFACER) $(PLATFORM_IFLAGS) -c -rez -update \ 484 -masterInterfaces `cygpath -w $(MASTER_INTERFACE_DIR)/` \ 485 -cacheFolder `cygpath -w $(OBJROOT)/$(NAME).build/InterfacerCache/` \ 486 -generated c=`cygpath -w $(PUBLIC_HEADER_DIR)/` \ 487 -generatedPriv c=`cygpath -w $(PRIVATE_HEADER_DIR)/` \ 488 -generated rez=`cygpath -w $(PUBLIC_HEADER_DIR)/` \ 489 -generatedPriv rez=`cygpath -w $(PRIVATE_HEADER_DIR)/` 490 ifeq "$(PLATFORM)" "CYGWIN" 491 # Replace externs with a symbol we can use for declspec purposes, except not extern "C" 492 # Get rid of non-standard pragma 493 $(SILENT) perl -p -i \ 494 -e 's/^extern ([^"].[^"])/$(NAME)_EXPORT $$1/ ;' \ 495 -e 's/^(#pragma options)/\/\/$$1/' \ 496 $(PUBLIC_HEADER_DIR)/*.h $(PRIVATE_HEADER_DIR)/*.h #*/ 497 $(SILENT) $(REMOVE) -f $(PUBLIC_HEADER_DIR)/*.bak $(PRIVATE_HEADER_DIR)/*.bak #*/ 498 endif 499 500 # This is the line from a CFNetwork build in PB 501 # /AppleInternal/Developer/Tools/Interfacer -masterInterfaces "/AppleInternal/Carbon/interfaces/" -cacheFolder "/Volumes/Whopper/symroots/CFNetwork.build/CFNetwork.build/InterfacerCache/" -c -rez -framework "CFNetwork" -p -generated "c=/Volumes/Whopper/symroots/CFNetwork.framework/Versions/A/Headers/" -generatedPriv "c=/Volumes/Whopper/symroots/CFNetwork.framework/Versions/A/PrivateHeaders/" -generated "rez=/Volumes/Whopper/symroots/CFNetwork.framework/Versions/A/Headers/" -generatedPriv "rez=/Volumes/Whopper/symroots/CFNetwork.framework/Versions/A/PrivateHeaders/" -frameworkInterfaces /Volumes/Whale/trey/CFNetwork-Windows/Interfaces/ -installMasterInterfaces /tmp/CFNetwork.dst/AppleInternal/Carbon/interfaces/ 502 503 504 prebuild_copy_headers: 505 $(SILENT) $(ECHO) "Copying headers..." 506 ifneq "$(strip $(PUBLIC_HFILES))" "" 507 $(SILENT) $(COPY) $(PUBLIC_HFILES) $(PUBLIC_HEADER_DIR) 508 endif 509 ifneq "$(strip $(PRIVATE_HFILES))" "" 510 $(SILENT) $(COPY) $(PRIVATE_HFILES) $(PRIVATE_HEADER_DIR) 511 endif 512 ifneq "$(strip $(PROJECT_HFILES))" "" 513 $(SILENT) $(COPY) $(PROJECT_HFILES) $(PROJECT_HEADER_DIR) 514 endif 515 516 517 #-------------------------------------------------------------------------------- 518 # BUILD 519 #-------------------------------------------------------------------------------- 520 521 # ??? should use VPATH, should use generic rules 522 # ??? should use cc -MM to generate dependencies 523 # ??? should separate private from project headers, for proper installation 524 525 # Set some parameters of the build-realwork target, then call it with a recursive make 526 release-build: 527 $(SILENT) $(MAKE) \ 528 BUILD_TYPE=release \ 529 BUILD_PRODUCT=$(RELEASE_LIB) \ 530 BUILD_IMPLIB=$(RELEASE_IMPLIB) \ 531 OTHER_CFLAGS="-O $(OTHER_CFLAGS)" \ 532 OTHER_CPPFLAGS="-O $(OTHER_CPPFLAGS)" \ 533 OTHER_LFLAGS="-O $(OTHER_LFLAGS)" \ 534 build-realwork 535 debug-build: 536 $(SILENT) $(MAKE) \ 537 BUILD_TYPE=debug \ 538 BUILD_PRODUCT=$(DEBUG_LIB) \ 539 BUILD_IMPLIB=$(DEBUG_IMPLIB) \ 540 LIBRARY_SUFFIX=_debug \ 541 OTHER_CFLAGS="-DDEBUG -g $(OTHER_CFLAGS)" \ 542 OTHER_CPPFLAGS="-DDEBUG -g $(OTHER_CPPFLAGS)" \ 543 OTHER_LFLAGS="-g $(OTHER_LFLAGS)" \ 544 build-realwork 545 profile-build: 546 $(SILENT) $(MAKE) \ 547 BUILD_TYPE=profile \ 548 BUILD_PRODUCT=$(PROFILE_LIB) \ 549 BUILD_IMPLIB=$(PROFILE_IMPLIB) \ 550 LIBRARY_SUFFIX=_profile \ 551 OTHER_CFLAGS="-DPROFILE -pg -O $(OTHER_CFLAGS)" \ 552 OTHER_CPPFLAGS="-DPROFILE -pg -O $(OTHER_CPPFLAGS)" \ 553 OTHER_LFLAGS="-pg -O $(OTHER_LFLAGS)" \ 554 build-realwork 555 556 OFILE_DIR = $(OBJROOT)/$(NAME).build/$(BUILD_TYPE)_ofiles 557 558 build-realwork: check-vars-defined compile-before build-compile compile-after build-link 559 compile-before:: 560 compile-after:: 561 562 build-compile: 563 $(SILENT) $(ECHO) "Building $(BUILD_TYPE)..." 564 $(SILENT) $(MKDIRS) $(OFILE_DIR) 565 $(SILENT) cumulativeError=0; \ 566 for x in $(CFILES) ; do \ 567 ofile=$(OFILE_DIR)/`basename $$x .c`.o ; \ 568 if [ ! $$ofile -nt $$x ] ; then \ 569 $(ECHO) " ..." $$x " ($(BUILD_TYPE))" ; \ 570 $(CC) $(CFLAGS) -c $$x -o $$ofile ; \ 571 ccError=$$? ; \ 572 if [ $$ccError != 0 ] ; then cumulativeError=$$ccError; fi;\ 573 fi ; \ 574 done; \ 575 exit $$cumulativeError 576 $(SILENT) cumulativeError=0; \ 577 for x in $(CPP_FILES) ; do \ 578 ofile=$(OFILE_DIR)/`basename $$x .c`.o ; \ 579 if [ ! $$ofile -nt $$x ] ; then \ 580 $(ECHO) " ..." $$x " ($(BUILD_TYPE))" ; \ 581 $(CPLUSPLUS) $(CPPFLAGS) -c $$x -o $$ofile ; \ 582 ccError=$$? ; \ 583 if [ $$ccError != 0 ] ; then cumulativeError=$$ccError; fi;\ 584 fi ; \ 585 done; \ 586 exit $$cumulativeError 587 588 ifeq "$(CPP_FILES)" "" 589 LINKER_CMD = $(CC) 590 else 591 LINKER_CMD = $(CPLUSPLUS) 592 endif 593 594 build-link: 595 $(SILENT) $(ECHO) "Linking..." 596 ifeq "$(PLATFORM)" "Darwin" 597 $(SILENT) $(LINKER_CMD) $(LFLAGS) -O -install_name $(FRAMEWORK_DIR)/Versions/A/$(BUILD_PRODUCT) $(LIBS) -o $(SYMROOT)/$(NAME).framework/Versions/A/$(BUILD_PRODUCT) $(OFILE_DIR)/*.o #*/ 598 $(SILENT) $(SYMLINK) Versions/Current/$(BUILD_PRODUCT) $(SYMROOT)/$(NAME).framework/$(BUILD_PRODUCT) 599 endif 600 ifeq "$(PLATFORM)" "Linux" 601 $(SILENT) $(ECHO) "NOTE: Producing static libraries on Linux" 602 $(SILENT) ar cr $(SYMROOT)/$(BUILD_PRODUCT) $(OFILE_DIR)/*.o #*/ 603 endif 604 ifeq "$(PLATFORM)" "FreeBSD" 605 $(SILENT) $(LINKER_CMD) $(LFLAGS) -O -o $(SYMROOT)/$(BUILD_PRODUCT) $(OFILE_DIR)/*.o $(LIBS) #*/ 606 endif 607 ifeq "$(PLATFORM)" "CYGWIN" 608 $(SILENT) $(DLLTOOL) --no-export-all-symbols -z $(SYMROOT)/$(BUILD_PRODUCT:.dll=.defs) -e $(OFILE_DIR)/$(BUILD_PRODUCT:.dll=.exports.o) -l $(SYMROOT)/$(BUILD_IMPLIB) -D $(BUILD_PRODUCT) $(OFILE_DIR)/*.o #*/ 609 $(SILENT) $(LINKER_CMD) $(LFLAGS) -mdll $(OFILE_DIR)/*.o $(OFILE_DIR)/$(BUILD_PRODUCT:.dll=.exports.o) $(LIBS) -o $(SYMROOT)/$(BUILD_PRODUCT) #*/ 610 # generate a MS VC compatible import library 611 $(SILENT) if [ "$$MSVCDIR" != "" ] ; then \ 612 defFile=`cygpath -w $(SYMROOT)/$(BUILD_PRODUCT:.dll=.defs)`; \ 613 outFile=`cygpath -w $(SYMROOT)/$(BUILD_PRODUCT:.dll=.lib)`; \ 614 cmd /C "$$MSVCDIR\BIN\VCVARS32" "&&" lib /MACHINE:i386 "/DEF:$$defFile" "/OUT:$$outFile"; \ 615 else \ 616 $(ECHO) WARNING: \$$MSVCDIR is not set - no MS Visual C++ compatible import lib will be generated; \ 617 fi 618 endif 619 $(SILENT) $(ECHO) "Done!" 620 621 # Make sure a couple variables are defined. 622 check-vars-defined: 623 $(SILENT) if [ "" = "$(BUILD_TYPE)" ] || [ "" = "$(BUILD_PRODUCT)" ]; then \ 624 echo ERROR: That target cannot be directly invoked. It is used only internally for recursive makes.; \ 625 exit 1; \ 626 fi