|
|
1.1 ! root 1: ############################################################################### ! 2: # NeXT common.make ! 3: # Copyright 1992, NeXT Computer, Inc. ! 4: # ! 5: # This makefile is common to all project-types (apps, subprojects, ! 6: # bundles, and palettes). It can also prove useful to custom Makefiles ! 7: # needing generic project-building functionality, but users should be aware ! 8: # that interfaces supported at this level are private to the app makefiles ! 9: # and may change from release to release. ! 10: # ! 11: ############################################################################### ! 12: ! 13: ! 14: ! 15: SUPPORTFILES = IB.nproj Makefile makefile $(NAME).iconheader \ ! 16: Makefile.preamble Makefile.postamble *.project ! 17: ! 18: SRCFILES = $(CLASSES) $(MFILES) $(CFILES) \ ! 19: $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) \ ! 20: $(HFILES) $(PSWFILES) $(PSWMFILES) $(DBMODELAFILES) \ ! 21: $(GLOBAL_RESOURCES) \ ! 22: $(OTHERSRCS) $(OTHERLINKED) $(OTHER_SOURCEFILES) ! 23: ! 24: ### Compute all the possible derived files and directories for them: ! 25: ! 26: SRCROOT = . ! 27: DERIVED_SRC_DIR_NAME = derived_src ! 28: ! 29: # Directory for .o files (can be thrown away) ! 30: OFILE_DIR = $(OBJROOT)/obj ! 31: # Directory for all other derived files (contains symbol info. for debugging) ! 32: SYM_DIR = $(SYMROOT)/$(DERIVED_SRC_DIR_NAME) ! 33: # Directory for all public headers of the entire project tree ! 34: LOCAL_HEADER_DIR = $(SYMROOT)/Headers/$(NAME) ! 35: ! 36: # For compatibility: ! 37: DERIVED_DIR = $(OFILE_DIR) ! 38: DERIVED_SRC_DIR = $(SYM_DIR) ! 39: ! 40: $(OFILE_DIR) $(SYM_DIR) $(PUBLIC_HEADER_DIR) $(DSTROOT)$(INSTALLDIR) $(PRODUCT_ROOT): ! 41: @$(MKDIRS) $@ ! 42: ! 43: MSGOFILES = $(MSGFILES:.msg=Speaker.o) $(MSGFILES:.msg=Listener.o) ! 44: MSGDERIVEDMFILES = $(MSGFILES:.msg=Speaker.m) $(MSGFILES:.msg=Listener.m) ! 45: ! 46: ALLMIGFILES = $(MIGFILES) $(DEFSFILES) ! 47: ! 48: MIGOFILES = $(MIGFILES:.mig=User.o) $(MIGFILES:.mig=Server.o) ! 49: DEFSOFILES = $(DEFSFILES:.defs=User.o) $(DEFSFILES:.defs=Server.o) ! 50: ALLMIGOFILES = $(MIGOFILES) $(DEFSOFILES) ! 51: ! 52: MIGDERIVEDCFILES = $(MIGFILES:.mig=User.c) $(MIGFILES:.mig=Server.c) ! 53: DEFSDERIVEDCFILES = $(DEFSFILES:.defs=User.c) $(DEFSFILES:.defs=Server.c) ! 54: ALLMIGDERIVEDCFILES = $(MIGDERIVEDCFILES) $(DEFSDERIVEDCFILES) ! 55: ! 56: EARLY_HFILES = $(PSWFILES:.psw=.h) $(PSWMFILES:.pswm=.h) ! 57: EARLY_OFILES = $(PSWFILES:.psw=.o) $(PSWMFILES:.pswm=.o) ! 58: ! 59: ALL_PRECOMPS = $(PRECOMPILED_HEADERS:.h=.p) $(PRECOMPS) ! 60: INITIAL_TARGETS = $(OFILE_DIR) $(SYM_DIR) $(EARLY_HFILES) $(MSGOFILES) $(ALLMIGOFILES) $(ALL_PRECOMPS) refresh_precomps export_headers $(OTHER_INITIAL_TARGETS) ! 61: ! 62: SUBPROJ_OFILES = $(SUBPROJECTS:.subproj=_subproj.o) ! 63: SUBPROJ_OFILELISTS = $(SUBPROJECTS:.subproj=_subproj.ofileList) ! 64: NON_SUBPROJ_OFILES = $(CLASSES:.m=.o) $(MFILES:.m=.o) $(CFILES:.c=.o) \ ! 65: $(CCFILES:.cc=.o) $(CAPCFILES:.C=.o) $(CAPMFILES:.M=.o) \ ! 66: $(CXXFILES:.cxx=.o) $(CPPFILES:.cpp=.o) $(EARLY_OFILES) \ ! 67: $(OTHERLINKEDOFILES) ! 68: OFILES = $(SUBPROJ_OFILES) $(NON_SUBPROJ_OFILES) ! 69: ! 70: # Note: It would be nice to put $(OTHERRELOCATABLES) in this list someday ! 71: # when PB provides full paths for the contents of this variable. ! 72: ! 73: # Derived resources: ! 74: DBMODELS = $(DBMODELAFILES:.dbmodela=.dbmodel) ! 75: ! 76: HELP_DIRS = Help ! 77: HELP_STORES = $(HELP_DIRS:=.store) $(OTHER_HELP_DIRS:=.store) ! 78: ! 79: ### Set defaults for many values used throughout the app Makefiles ! 80: ! 81: # Default extension for bundles (directories containing object code and resources) ! 82: ! 83: MAKEFILES = Makefile ! 84: ! 85: PRODUCT_DEPENDS = $(OFILES) $(OTHER_OFILES) $(DBMODELS) \ ! 86: $(ICONHEADER) $(APPICON) $(DOCICONS) $(MAKEFILES) \ ! 87: $(OTHER_PRODUCT_DEPENDS) ! 88: ! 89: GARBAGE = $(PROJECT_TYPE_SPECIFIC_GARBAGE) \ ! 90: $(OBJROOT)/*_obj $(OFILE_DIR) \ ! 91: $(SYMROOT)/$(DERIVED_SRC_DIR_NAME) $(SYMROOT)/sym \ ! 92: *~ $(LANGUAGE).lproj/*~ $(VERS_FILE) \ ! 93: Makefile.dependencies $(SYMROOT)/$(CHANGES_FILE_BASE)* gmon.out \ ! 94: $(ALL_PRECOMPS) $(OTHER_INITIAL_TARGETS) $(OTHER_GARBAGE) ! 95: ! 96: GARBAGE_TO_BE = \ ! 97: $(DEV_PUBLIC_HEADER_DIR) $(DEV_PROJECT_HEADER_DIR) \ ! 98: $(DEV_PRIVATE_HEADER_DIR) ! 99: ! 100: # Default name for file to use as "reference time of last build" ! 101: CHANGES_FILE_BASE = .lastBuildTime ! 102: ! 103: # Defaults for who to chown executables to when installing ! 104: INSTALL_AS_USER = root ! 105: INSTALL_AS_GROUP = wheel ! 106: ! 107: # Compiler flags that may be overridden ! 108: OPTIMIZATION_CFLAG = -O ! 109: DEBUG_SYMBOLS_CFLAG = -g ! 110: WARNING_CFLAGS = -Wall ! 111: DEBUG_BUILD_CFLAGS = -DDEBUG ! 112: PROFILE_BUILD_CFLAGS = -pg -DPROFILE ! 113: POSIX_BUILD_CFLAGS = -D_POSIX_LIB ! 114: SHLIB_BUILD_CFLAGS = -I/LocalDeveloper/Headers/libsys -i/LocalDeveloper/Headers/libsys/shlib.h -DSHLIB ! 115: ! 116: # Default compiler options ! 117: ALL_FRAMEWORK_CFLAGS = $(FRAMEWORK_PATHS) $(PROPOGATED_FRAMEWORK_CFLAGS) ! 118: PROJECT_SPECIFIC_CFLAGS = $(CFLAGS) $(OTHER_CFLAGS) $(HEADER_PATHS) $(PB_CFLAGS) ! 119: PROJ_CFLAGS = $(PROJECT_SPECIFIC_CFLAGS) ! 120: COMMON_CFLAGS = $(DEBUG_SYMBOLS_CFLAG) $(WARNING_CFLAGS) $(PROJECT_SPECIFIC_CFLAGS) ! 121: all_target_CFLAGS = $(COMMON_CFLAGS) $(OPTIMIZATION_CFLAG) ! 122: debug_target_CFLAGS = $(COMMON_CFLAGS) $(DEBUG_BUILD_CFLAGS) ! 123: profile_target_CFLAGS = $(COMMON_CFLAGS) $(PROFILE_BUILD_CFLAGS) $(OPTIMIZATION_CFLAG) ! 124: app_target_CFLAGS = $(all_target_CFLAGS) ! 125: library_target_CFLAGS = $(all_target_CFLAGS) ! 126: framework_target_CFLAGS = $(all_target_CFLAGS) ! 127: bundle_target_CFLAGS = $(all_target_CFLAGS) ! 128: posix_target_CFLAGS = $(COMMON_CFLAGS) $(POSIX_BUILD_CFLAGS) $(OPTIMIZATION_CFLAG) ! 129: shlib_target_CFLAGS = $(COMMON_CFLAGS) $(SHLIB_BUILD_CFLAGS) $(OPTIMIZATION_CFLAG) ! 130: OBJCFLAG = -ObjC ! 131: ! 132: # ...and the actual flags used in compilation (see basicrules.make) ! 133: ALL_CFLAGS = $(ALL_FRAMEWORK_CFLAGS) $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$(DEV_PROJECT_HEADER_DIR) -I$(SYM_DIR) $(RC_CFLAGS) ! 134: ALL_PRECOMP_CFLAGS = $(ALL_FRAMEWORK_CFLAGS) $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$(SYM_DIR) $(ALL_ARCH_FLAGS) ! 135: ! 136: # Link editor options: ! 137: CUMULATIVE_LDFLAGS = $(LIBRARY_PATHS) $(PB_LDFLAGS) $(LDFLAGS) $(OTHER_LDFLAGS) ! 138: ALL_LDFLAGS = $(CUMULATIVE_LDFLAGS) $(PROPOGATED_LDFLAGS) $(PROJECT_SPECIFIC_LDFLAGS) ! 139: ! 140: # Yacc options ! 141: YFLAGS = -d ! 142: ! 143: # Defaults strip options ! 144: INTERFACE_DESC_FILE = /NextDeveloper/Makefiles/project/interface.symbols ! 145: #DYLD_EXEC_STRIP_OPTS = -s $(INTERFACE_DESC_FILE) -u -A ! 146: DYLD_EXEC_STRIP_OPTS = -S ! 147: APP_STRIP_OPTS = $(DYLD_EXEC_STRIP_OPTS) ! 148: TOOL_STRIP_OPTS = $(DYLD_EXEC_STRIP_OPTS) ! 149: LIBRARY_STRIP_OPTS = -S # Note: -S strips debugging symbols ! 150: DYNAMIC_STRIP_OPTS = -S ! 151: ! 152: # Various commands: ! 153: SHELL = /bin/sh ! 154: FASTCP = /usr/lib/fastcp ! 155: FASTLN = /usr/lib/fastln ! 156: CHANGES = /usr/lib/changes ! 157: ARCH_TOOL = /usr/lib/arch_tool ! 158: OFILE_LIST_TOOL = /usr/lib/ofileListTool -removePrefix ../ -removePrefix $(OBJROOT)/ ! 159: DEARCHIFY = $(ARCH_TOOL) -dearchify ! 160: ARCHIFY = $(ARCH_TOOL) -archify_list ! 161: CHOWN = /etc/chown ! 162: CHMOD = /bin/chmod ! 163: TAR = /usr/bin/gnutar ! 164: LIBTOOL = /bin/libtool ! 165: STRIP = /bin/strip ! 166: RM = /bin/rm ! 167: LN = /bin/ln -s ! 168: CP = /bin/cp ! 169: INSTALL_HEADERS_CMD = $(CP) -p ! 170: ECHO = /bin/echo ! 171: MKDIRS = /bin/mkdirs ! 172: TOUCH = /usr/bin/touch ! 173: AWK = /bin/awk ! 174: PSWRAP = /usr/bin/pswrap ! 175: MSGWRAP = /usr/bin/msgwrap ! 176: MIG = /usr/bin/mig ! 177: DBC = /NextDeveloper/Apps/DBModeler.app/dbcompiler ! 178: COMPRESSHELP = /usr/bin/compresshelp ! 179: FIXPRECOMPS = /usr/bin/fixPrecomps ! 180: LIBTOOL = /bin/libtool ! 181: ! 182: PUSHD = pushed_dir=`pwd` ; cd ! 183: POPD = cd $$pushed_dir ! 184: ! 185: ADAPTOR_SEARCH_PATH = $(HOME)/Library/Adaptors /LocalLibrary/Adaptors /NextLibrary/Adaptors ! 186: ! 187: DEFAULT_BUNDLE_EXTENSION = bundle ! 188: ! 189: # Set VPATH via a variable so clients of common.make can reuse it when overriding VPATH ! 190: NORMAL_VPATH = $(OFILE_DIR):$(SYM_DIR):$(LANGUAGE).lproj:$(PRODUCT_ROOT):$(PRODUCT_ROOT)/$(LANGUAGE).lproj ! 191: VPATH = $(VPATH_PREAMBLE)$(NORMAL_VPATH)$(VPATH_POSTAMBLE) ! 192: ! 193: ! 194: # Generation of a version string if project lives in correct directory name ! 195: # To activate this feature, put your source code in a directory named ! 196: # $(NAME).%d[.%d][.%d] and set OTHER_GENERATED_OFILES = $(VERS_OFILES). ! 197: VERS_FILE = $(SYM_DIR)/$(NAME)_vers.c ! 198: VERS_OFILE = $(OFILE_DIR)/$(NAME)_vers.o ! 199: $(VERS_FILE): ! 200: $(RM) -f $(VERS_FILE) ; \ ! 201: vers_string -c $(NAME) \ ! 202: | sed s/SGS_VERS/$(NAME)_VERS_STRING/ \ ! 203: | sed s/VERS_NUM/$(NAME)_VERS_NUM/ > $@ ! 204: ! 205: ALL_OTHER_OFILES = $(OTHER_OFILES) $(OTHER_GENERATED_OFILES) ! 206: ! 207: ### Use a set of basic suffix-style rules: ! 208: ! 209: COMMON_APP_MAKEFILE_DIR = /NextDeveloper/Makefiles/project ! 210: include $(COMMON_APP_MAKEFILE_DIR)/basicrules.make ! 211: ! 212: ### Some utility definitions used throughout the PB Makefiles ! 213: ! 214: process_target_archs = \ ! 215: if [ -n "$(TARGET_ARCHS)" ] ; then \ ! 216: archs="$(TARGET_ARCHS)" ; \ ! 217: else \ ! 218: if [ -n "$(RC_ARCHS)" ] ; then \ ! 219: archs="$(RC_ARCHS)" ; \ ! 220: else \ ! 221: archs=`/usr/bin/arch` ; \ ! 222: fi ; \ ! 223: fi ; \ ! 224: if [ -z "$$archs" ] ; then \ ! 225: archs=`/usr/bin/arch` ; \ ! 226: fi ; \ ! 227: archless_rcflags=`$(DEARCHIFY) $(RC_CFLAGS)` ; \ ! 228: arch_flags=`$(ARCHIFY) $$archs` ; \ ! 229: $(set_build_output_dirs) ! 230: ! 231: set_build_output_dirs = \ ! 232: if [ -n "$(BUILD_OUTPUT_DIR)" ] ; then \ ! 233: build_output_dir="$(BUILD_OUTPUT_DIR)" ; \ ! 234: else \ ! 235: build_output_dir="." ; \ ! 236: fi ; \ ! 237: if [ -n "$(SYMROOT)" ] ; then \ ! 238: symroot="$(SYMROOT)" ; \ ! 239: else \ ! 240: symroot=$$build_output_dir ; \ ! 241: fi ; \ ! 242: if [ -n "$(OBJROOT)" ] ; then \ ! 243: objroot="$(OBJROOT)" ; \ ! 244: else \ ! 245: objroot=$$build_output_dir ; \ ! 246: fi ! 247: ! 248: set_bundle_ext = \ ! 249: if [ -z "$(BUNDLE_EXTENSION)" ] ; then \ ! 250: bundle_ext=$(DEFAULT_BUNDLE_EXTENSION) ; \ ! 251: else \ ! 252: bundle_ext=$(BUNDLE_EXTENSION) ; \ ! 253: fi ! 254: ! 255: DYNAMIC_CFLAGS = -fno-common ! 256: DYNAMIC_LDFLAGS = # -all_load ! 257: ! 258: set_language_flags = \ ! 259: if [ -n "$(RC_KANJI)" -o "$(JAPANESE)" = "YES" ] ; then \ ! 260: language_cflags='-DKANJI' ; \ ! 261: libs="$(LIBS:lNeXT_s=lNeXTJ_s)" ; \ ! 262: other_libs="$(OTHER_LIBS:lNeXT_s=lNeXTJ_s)" ; \ ! 263: other_japanese_libs="$(OTHER_JAPANESE_LIBS)" ; \ ! 264: else \ ! 265: language_cflags='' ; \ ! 266: libs="$(LIBS)" ; \ ! 267: other_libs="$(OTHER_LIBS)" ; \ ! 268: other_japanese_libs=""; \ ! 269: fi ! 270: ! 271: set_dynamic_flags = \ ! 272: if [ "$@" = "shlib" ] ; then \ ! 273: dynamic_cflags="-static" ; \ ! 274: else \ ! 275: if [ "$(CODE_GEN_STYLE)" = "DYNAMIC" ] ; then \ ! 276: buildtype="dynamic" ; \ ! 277: dynamic_cflags="-dynamic $(DYNAMIC_CFLAGS)" ; \ ! 278: library_ext="dylib" ; \ ! 279: else \ ! 280: buildtype="static" ; \ ! 281: dynamic_cflags="-static" ; \ ! 282: library_ext="a" ; \ ! 283: fi ; \ ! 284: fi ; \ ! 285: if [ "$@" = "shlib" -o "$@" = "posix" ] ; then \ ! 286: buildtype="$@" ; \ ! 287: fi ; \ ! 288: libname="lib$(NAME).$$library_ext" ! 289: ! 290: ! 291: set_dynamic_link_flags = \ ! 292: if [ "$(CODE_GEN_STYLE)" = "DYNAMIC" ]; then \ ! 293: dynamic_libtool_flags="-dynamic -install_name $(DYLIB_INSTALL_DIR)/$(DYLIB_INSTALL_NAME)" ; \ ! 294: dynamic_ldflags="$(DYNAMIC_LDFLAGS)" ; \ ! 295: else \ ! 296: dynamic_libtool_flags="-static" ; \ ! 297: fi ! 298: ! 299: ! 300: set_objdir = \ ! 301: if [ "$@" = "debug" -o "$@" = "profile" ] ; then \ ! 302: objdir="$@_obj" ; \ ! 303: else \ ! 304: objdir="obj" ; \ ! 305: fi ! 306: ! 307: set_build_for_arch = \ ! 308: build_for_arch=yes; \ ! 309: for excluded_arch in $(EXCLUDED_ARCHS) none ; do \ ! 310: if [ "$$arch" = "$$excluded_arch" ] ; then \ ! 311: build_for_arch=no; \ ! 312: fi ; \ ! 313: done ; \ ! 314: if [ -n "$(INCLUDED_ARCHS)" ] ; then \ ! 315: build_for_arch=no; \ ! 316: for included_arch in $(INCLUDED_ARCHS) none ; do \ ! 317: if [ "$$arch" = "$$included_arch" ] ; then \ ! 318: build_for_arch=yes; \ ! 319: fi ; \ ! 320: done ; \ ! 321: fi ! 322: ! 323: ! 324: ### Define all the targets necessary at every level of the project-hierarchy: ! 325: ! 326: # The following rules and rule fragments do the recursion into "sub" projects ! 327: # of this project and does a 'make project' for each one in its ! 328: # respective directories. This insures that we do not rely on the directory ! 329: # timestamp or "hack" file to know whether or not something has changed. ! 330: ! 331: CHANGES_COMMAND = $(CHANGES) $(TOP_PRODUCT_ROOT)/$(CHANGES_FILE_BASE).$(TARGET_ARCH) "$(OFILE_DIR)" ! 332: ! 333: use_default_directory_args = \ ! 334: top_prod_root=`echo $(TOP_PRODUCT_ROOT) | sed '/^[^/]/s:^:../:'` ; \ ! 335: prod_root=`echo $(PRODUCT_ROOT) | sed '/^[^/]/s:^:../:'` ; \ ! 336: ofile_dir=`echo $(OFILE_DIR) | sed '/^[^/]/s:^:../:'` ; \ ! 337: sym_dir=`echo $(SYM_DIR) | sed '/^[^/]/s:^:../:'` ; \ ! 338: header_base=`echo $(DEV_HEADER_DIR_BASE) | sed '/^[^/]/s:^:../:'` ; \ ! 339: project_header_base=`echo $(DEV_PROJECT_HEADER_DIR_BASE) | sed '/^[^/]/s:^:../:'` ; \ ! 340: propogated_cflags=`echo $(PROPOGATED_CFLAGS) | sed 's:-I../:-I../../:g'` ! 341: ! 342: use_absolute_directory_args = \ ! 343: $(PUSHD) $(PRODUCT_ROOT) ; abs_prod_root=`pwd` ; $(POPD) ; \ ! 344: prod_root=$$abs_prod_root ; \ ! 345: $(PUSHD) $(TOP_PRODUCT_ROOT) ; abs_top_prod_root=`pwd` ; $(POPD) ; \ ! 346: top_prod_root=$$abs_top_prod_root ; \ ! 347: $(PUSHD) $(OFILE_DIR) ; abs_ofile_dir=`pwd` ; $(POPD) ; \ ! 348: ofile_dir=$$abs_ofile_dir ; \ ! 349: $(PUSHD) $(SYM_DIR) ; abs_sym_dir=`pwd` ; $(POPD) ; \ ! 350: sym_dir=$$abs_sym_dir ; \ ! 351: $(PUSHD) $(DEV_HEADER_DIR_BASE) ; abs_header_base=`pwd` ; $(POPD) ; \ ! 352: header_base=$$abs_header_base ; \ ! 353: $(PUSHD) $(DEV_PROJECT_HEADER_DIR_BASE) ; abs_project_header_base=`pwd` ; $(POPD) ; \ ! 354: project_header_base=$$abs_project_header_base ; \ ! 355: propogated_cflags="$(PROPOGATED_CFLAGS)" ! 356: ! 357: ! 358: ALL_SUBPROJECTS = $(BUILD_TOOLS) $(SUBPROJECTS) $(BUNDLES) $(FRAMEWORK_SUBPROJECTS) $(LIBRARIES) $(TOOLS) $(LEGACIES) ! 359: IS_TOPLEVEL = ! 360: ! 361: # may not be right if tool is renamed without renaming directory name ! 362: TOOL_NAMES = $(TOOLS=.tproj=) ! 363: ! 364: all_subprojects: $(TOP_PRODUCT_ROOT) ! 365: @(if [ -z "$(ONLY_SUBPROJECT)" ] ; then \ ! 366: if [ -n "$(BUILD_ALL_SUBPROJECTS)" ] ; then \ ! 367: subdirectories="$(ALL_SUBPROJECTS)" ; \ ! 368: else \ ! 369: subdirectories=`$(CHANGES_COMMAND) $(ALL_SUBPROJECTS)` ; \ ! 370: fi ; \ ! 371: else \ ! 372: subdirectories="$(ONLY_SUBPROJECT)" ; \ ! 373: fi ; \ ! 374: target=project; \ ! 375: beginning_msg="Making" ; ending_msg="Finished making" ; \ ! 376: actual_prod_root=$(PRODUCT_ROOT) ; \ ! 377: $(recurse_on_subdirectories) ; \ ! 378: $(check_tools) ; \ ! 379: if [ -n "$(IS_TOPLEVEL)" -a -z "$(ONLY_SUBPROJECT)" ] ; then \ ! 380: $(RM) -f $(TOP_PRODUCT_ROOT)/$(CHANGES_FILE_BASE).$(TARGET_ARCH) ; \ ! 381: $(TOUCH) $(TOP_PRODUCT_ROOT)/$(CHANGES_FILE_BASE).$(TARGET_ARCH) ; \ ! 382: fi) ! 383: ! 384: $(SUBPROJ_OFILES): ! 385: @(subdirectories="$(SUBPROJECTS)"; \ ! 386: target=project; \ ! 387: beginning_msg="Making" ; ending_msg="Finished making" ; \ ! 388: $(recurse_on_subdirectories)) ! 389: ! 390: TOOL_NAMES = $(TOOLS:.tproj=) ! 391: check_tools = \ ! 392: for tool in $(TOOL_NAMES) none ; do \ ! 393: if [ $$tool = "none" ] ; then break; fi ; \ ! 394: tool_file="$$actual_prod_root/$$tool.$(TARGET_ARCH)" ; \ ! 395: if [ ! -s $$tool_file ] ; then \ ! 396: echo $$tool_file no longer exists...; \ ! 397: subdirectories=$$tool.tproj; \ ! 398: target=project; \ ! 399: beginning_msg="Making" ; ending_msg="Finished making" ; \ ! 400: $(recurse_on_subdirectories) ; \ ! 401: fi ; \ ! 402: done ! 403: ! 404: recurse_on_subdirectories = \ ! 405: $(use_default_directory_args) ;\ ! 406: for sub in $$subdirectories none ; do \ ! 407: if [ $$sub = "none" ] ; then break; fi ; \ ! 408: if [ -h $$sub ] ; then \ ! 409: $(use_absolute_directory_args) ; \ ! 410: fi ; \ ! 411: $(PUSHD) $$sub; \ ! 412: if [ -n "$$beginning_msg" ] ; then \ ! 413: $(ECHO) $$beginning_msg $$sub ; \ ! 414: fi ; \ ! 415: $(MAKE) $$target $(exported_vars) ; \ ! 416: $(POPD) ; \ ! 417: if [ -n "$$ending_msg" ] ; then \ ! 418: $(ECHO) $$ending_msg $$sub ; \ ! 419: fi ; \ ! 420: done ! 421: ! 422: ! 423: exported_vars = \ ! 424: "PRODUCT_ROOT = $$prod_root" \ ! 425: "TOP_PRODUCT_ROOT = $$top_prod_root" \ ! 426: "OFILE_DIR = $$ofile_dir/$$sub" \ ! 427: "PRODUCT_PREFIX = $$ofile_dir/$$sub" \ ! 428: "BUNDLE_DIR = $$prod_root/$$sub" \ ! 429: "REL_BUNDLE_DIR = $$sub" \ ! 430: "SYM_DIR = $$sym_dir/$$sub" \ ! 431: "CODE_GEN_STYLE = $(CODE_GEN_STYLE)" \ ! 432: "BUILD_OFILES_LIST_ONLY = $(BUILD_OFILES_LIST_ONLY)" \ ! 433: "TARGET_ARCH = $(TARGET_ARCH)" \ ! 434: "COMMON_APP_MAKEFILE_DIR = $(COMMON_APP_MAKEFILE_DIR)" \ ! 435: "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \ ! 436: "MAKEFILEDIR = $(MAKEFILEDIR)" \ ! 437: "SRCROOT = $(SRCROOT)" \ ! 438: "OBJROOT = $(OBJROOT)" \ ! 439: "SYMROOT = $(SYMROOT)" \ ! 440: "PROPOGATED_CFLAGS = $(PROJ_CFLAGS) $$propogated_cflags -I$$sym_dir" \ ! 441: "PROPOGATED_FRAMEWORK_CFLAGS = $(ALL_FRAMEWORK_CFLAGS)" \ ! 442: "PROPOGATED_LDFLAGS = $(PROJECT_SPECIFIC_LDFLAGS) $(PROPOGATED_LDFLAGS)" \ ! 443: "DEV_HEADER_DIR_BASE = $$header_base" \ ! 444: "DEV_PROJECT_HEADER_DIR_BASE = $$project_header_base" \ ! 445: "MULTIPLE_ARCHS = $(MULTIPLE_ARCHS)" \ ! 446: "SINGLE_ARCH = $(SINGLE_ARCH)" \ ! 447: "DEPENDENCIES =" \ ! 448: "ONLY_SUBPROJECT =" \ ! 449: "RC_ARCHS = $(RC_ARCHS)" \ ! 450: "RC_CFLAGS = $(RC_CFLAGS)" \ ! 451: "ALL_ARCH_FLAGS = $(ALL_ARCH_FLAGS)" \ ! 452: $(projectType_specific_exported_vars) ! 453: ! 454: configure_for_target_archs_exported_vars = \ ! 455: $(exported_vars) \ ! 456: $(extra_configure_for_target_archs_exported_vars) ! 457: ! 458: # Finalizing build (e.g. lipo/ln the arch-specific binaries into place) ! 459: ! 460: configure_for_target_archs:: ! 461: @(subdirectories="$(ALL_SUBPROJECTS)"; \ ! 462: target=configure_for_target_archs ; \ ! 463: $(use_default_directory_args) ;\ ! 464: for sub in $$subdirectories none ; do \ ! 465: if [ $$sub = "none" ] ; then break; fi ; \ ! 466: if [ -h $$sub ] ; then \ ! 467: $(use_absolute_directory_args) ; \ ! 468: fi ; \ ! 469: $(PUSHD) $$sub; \ ! 470: $(MAKE) $$target $(configure_for_target_archs_exported_vars) ; \ ! 471: $(POPD) ; \ ! 472: done) ! 473: ! 474: ! 475: ! 476: # Finalizing installation ! 477: ! 478: STRIP_ON_INSTALL = YES ! 479: ! 480: finalize_install_exported_vars = \ ! 481: "DSTROOT = $(DSTROOT)" \ ! 482: "OBJROOT = $(OBJROOT)" \ ! 483: "SYMROOT = $(SYMROOT)" \ ! 484: "SYM_DIR = $(SYM_DIR)" \ ! 485: "DEVROOT = $(DEVROOT)" \ ! 486: "INSTALLDIR = $(INSTALLDIR)" \ ! 487: "PRODUCT_ROOT = $(PRODUCT_ROOT)" \ ! 488: "PRODUCT = $(PRODUCT)" \ ! 489: "OFILE_DIR = $(OFILE_DIR)" \ ! 490: "PROJ_CFLAGS = $(PROJ_CFLAGS)" \ ! 491: "COMMON_APP_MAKEFILE_DIR = $(COMMON_APP_MAKEFILE_DIR)" \ ! 492: "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \ ! 493: "MAKEFILEDIR = $(MAKEFILEDIR)" \ ! 494: "RC_CFLAGS = $(RC_CFLAGS)" \ ! 495: "RC_ARCHS = $(RC_ARCHS)" \ ! 496: $(extra_finalize_install_exported_vars) ! 497: ! 498: # Finalizing build (e.g. lipo/ln the arch-specific binaries into place) ! 499: ! 500: finalize_install:: strip_myself after_install ! 501: @(subdirectories="$(ALL_SUBPROJECTS)"; \ ! 502: target=finalize_install ; \ ! 503: $(use_default_directory_args) ;\ ! 504: for sub in $$subdirectories none ; do \ ! 505: if [ $$sub = "none" ] ; then break; fi ; \ ! 506: if [ -h $$sub ] ; then \ ! 507: $(use_absolute_directory_args) ; \ ! 508: fi ; \ ! 509: $(PUSHD) $$sub; \ ! 510: $(MAKE) $$target $(finalize_install_exported_vars) ; \ ! 511: $(POPD) ; \ ! 512: done) ! 513: ! 514: strip_myself:: ! 515: ! 516: after_install:: ! 517: ! 518: ! 519: # Resources stuff: ! 520: ! 521: GENERATED_RESOURCES = `echo *.info > /dev/null 2>&1` ! 522: ! 523: # The following rule insures that resources for this particular level in the project hierarchy get copied over to the appropriate place in the PRODUCT_ROOT. Note that we depend on VPATH including $(LANGUAGE).lproj so that the LOCAL_RESOURCES are found correctly. FASTCP is used to minimize the copying of files, since most resources are likely to be up to date most of the time. ! 524: ! 525: resources:: $(LOCAL_RESOURCES) $(GLOBAL_RESOURCES) $(HELP_STORES) $(OTHER_RESOURCES) ! 526: @(if [ "$(PRODUCT_ROOT)" != "." ] ; then \ ! 527: $(MKDIRS) $(PRODUCT_ROOT)/$(LANGUAGE).lproj ; \ ! 528: fi ; \ ! 529: if [ "$(LOCAL_RESOURCES)" != "" ] ; then \ ! 530: locals="" ; \ ! 531: for resource in $(LOCAL_RESOURCES) none ; do \ ! 532: insert="true"; \ ! 533: for helpdir in $(HELP_DIRS) $(OTHER_HELP_DIRS) none ; do \ ! 534: if [ "$$resource" = "$$helpdir" ] ; \ ! 535: then insert="false"; \ ! 536: fi ; \ ! 537: done ; \ ! 538: if [ "$$insert" = "true" ] ; then \ ! 539: locals="$$locals $$resource" ; \ ! 540: fi ; \ ! 541: done ; \ ! 542: $(FASTCP) $$locals $(PRODUCT_ROOT)/$(LANGUAGE).lproj ; \ ! 543: fi ; \ ! 544: $(FASTCP) $(GLOBAL_RESOURCES) $(GENERATED_RESOURCES) $(PRODUCT_ROOT)) ! 545: ! 546: ! 547: # rules for copying, cleaning and making dependencies ! 548: ! 549: installsrc:: SRCROOT ! 550: @($(MAKE) copy "DEST=$(SRCROOT)" \ ! 551: "COMMON_APP_MAKEFILE_DIR = $(COMMON_APP_MAKEFILE_DIR)" \ ! 552: "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \ ! 553: "MAKEFILEDIR = $(MAKEFILEDIR)" ) ! 554: ! 555: copy:: $(NAME).copy $(BUNDLES:.bproj=.copy) \ ! 556: $(SUBPROJECTS:.subproj=.copy) \ ! 557: $(TOOLS:.tproj=.copy) ! 558: ! 559: $(NAME).copy:: DEST $(DEST) $(SRCFILES) ! 560: @(if [ "$(SRCFILES)" != "" ] ; then \ ! 561: $(ECHO) "$(TAR) cf - $(SRCFILES) | (cd $(DEST); $(TAR) xf -)" ; \ ! 562: $(TAR) cf - $(SRCFILES) | (cd $(DEST); $(TAR) xf -) ; \ ! 563: fi ; \ ! 564: $(MKDIRS) $(DEST)/$(LANGUAGE).lproj ; \ ! 565: if [ "$(LOCAL_RESOURCES)" != "" ] ; then \ ! 566: $(ECHO) "(cd $(LANGUAGE).lproj; $(TAR) cf - $(LOCAL_RESOURCES)) | (cd $(DEST)/$(LANGUAGE).lproj; $(TAR) xf - )" ; \ ! 567: (cd $(LANGUAGE).lproj; $(TAR) cf - $(LOCAL_RESOURCES)) | (cd $(DEST)/$(LANGUAGE).lproj; $(TAR) xf -) ; \ ! 568: fi ; \ ! 569: supportfiles="" ; \ ! 570: for i in $(SUPPORTFILES) $(APPICON) $(DOCICONS) none ; do \ ! 571: if [ -r $$i -a ! -r $(DEST)/$$i ] ; then \ ! 572: supportfiles="$$supportfiles $$i" ; \ ! 573: fi ; \ ! 574: done ; \ ! 575: if [ "$$supportfiles" != "" ] ; then \ ! 576: $(ECHO) "$(TAR) cf - $$supportfiles | (cd $(DEST); $(TAR) xf -)" ; \ ! 577: $(TAR) cf - $$supportfiles | (cd $(DEST); $(TAR) xf -) ; \ ! 578: fi) ! 579: ! 580: .bproj.copy .subproj.copy .tproj.copy: ! 581: @(cd $<; $(MAKE) copy "NAME=$*" "DEST=$(DEST)/$<") ! 582: ! 583: .bproj.clean .subproj.clean .tproj.clean: ! 584: @(echo Cleaning $<... ; cd $<; \ ! 585: $(MAKE) clean "NAME=$*") ! 586: ! 587: .bproj.depend .subproj.depend .tproj.depend: ! 588: @(sym_dir=`echo $(SYM_DIR) | sed '/^[^/]/s:^:../:'` ; \ ! 589: cd $<; \ ! 590: $(MAKE) depend "NAME=$*" \ ! 591: "PROPOGATED_CFLAGS = $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$$sym_dir/$<" ) ! 592: ! 593: ! 594: ! 595: # Build a set of dependencies for current level into Makefile.depndencies ! 596: ! 597: Makefile.dependencies:: $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) $(INITIAL_TARGETS) ! 598: @($(RM) -f Makefile.dependencies ; \ ! 599: if [ "`$(ECHO) $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) | wc -w`" != " 0" ] ; then \ ! 600: if [ "$(ENGLISH)" = "YES" -o "$(JAPANESE)" != "YES" ] ; then \ ! 601: language_cflags="" ; \ ! 602: else \ ! 603: language_cflags="-DKANJI" ; \ ! 604: fi ; \ ! 605: $(ECHO) "$(CC) -MM $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$(SYM_DIR) $$language_cflags $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) > Makefile.dependencies" ; \ ! 606: $(CC) -MM $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$(SYM_DIR) $$language_cflags $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) > Makefile.dependencies || ($(RM) -f Makefile.dependencies ; exit 1) ; \ ! 607: fi ); ! 608: ! 609: ! 610: SRCROOT DEST: ! 611: @if [ -n "${$@}" ]; then exit 0; \ ! 612: else $(ECHO) Must define $@; exit 1; fi ! 613: ! 614: $(DEST):: ! 615: -$(RM) -rf $(DEST) ! 616: @$(MKDIRS) $(DEST) ! 617: ! 618: ! 619: # Header stuff: ! 620: ! 621: DEV_HEADER_DIR_BASE = $(SYMROOT) ! 622: DEV_PROJECT_HEADER_DIR_BASE = $(SYMROOT) ! 623: DEV_PUBLIC_HEADER_DIR = $(DEV_HEADER_DIR_BASE)/Headers ! 624: DEV_PROJECT_HEADER_DIR = $(DEV_PROJECT_HEADER_DIR_BASE)/ProjectHeaders ! 625: DEV_PRIVATE_HEADER_DIR = $(DEV_HEADER_DIR_BASE)/PrivateHeaders ! 626: ! 627: installhdrs:: ! 628: @(echo == Making installhdrs for $(NAME) == ; \ ! 629: $(MAKE) copy_all_headers \ ! 630: "PUBLIC_HEADER_DEST_DIR = $(DSTROOT)$(PUBLIC_HEADER_DIR)" \ ! 631: "PROJECT_HEADER_DEST_DIR =" \ ! 632: "PRIVATE_HEADER_DEST_DIR = $(DSTROOT)$(PRIVATE_HEADER_DIR)" \ ! 633: "HEADER_COPY_CMD = $(FASTCP)" \ ! 634: "COMMON_APP_MAKEFILE_DIR = $(COMMON_APP_MAKEFILE_DIR)" \ ! 635: "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \ ! 636: "MAKEFILEDIR = $(MAKEFILEDIR)" \ ! 637: "RC_CFLAGS = $(RC_CFLAGS)" \ ! 638: "SYMROOT = $(SYMROOT)" \ ! 639: "DSTROOT = $(DSTROOT)") ! 640: ! 641: copy_all_headers:: copy_my_headers after_installhdrs ! 642: @(for dir in $(ALL_SUBPROJECTS) none ; do \ ! 643: if [ $$dir = "none" ] ; then break; fi ; \ ! 644: $(PUSHD) $$dir; $(ECHO) Installing headers for $$dir ; \ ! 645: $(MAKE) copy_all_headers \ ! 646: "PUBLIC_HEADER_DEST_DIR = $(PUBLIC_HEADER_DEST_DIR)" \ ! 647: "PROJECT_HEADER_DEST_DIR = $(PROJECT_HEADER_DEST_DIR)" \ ! 648: "PRIVATE_HEADER_DEST_DIR = $(PRIVATE_HEADER_DEST_DIR)" \ ! 649: "HEADER_COPY_CMD = $(HEADER_COPY_CMD)" \ ! 650: "COMMON_APP_MAKEFILE_DIR = $(COMMON_APP_MAKEFILE_DIR)" \ ! 651: "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \ ! 652: "MAKEFILEDIR = $(MAKEFILEDIR)" \ ! 653: "DSTROOT = $(DSTROOT)" \ ! 654: "SRCROOT = $(SRCROOT)" \ ! 655: "OBJROOT = $(OBJROOT)" \ ! 656: "SYMROOT = $(SYMROOT)" ; \ ! 657: $(POPD) ; \ ! 658: done) ! 659: ! 660: ! 661: export_headers: ! 662: @(if [ "$(IS_TOPLEVEL)" = "YES" \ ! 663: -a "$(EXPORT_PROJECT_HEADERS)" = "YES" ] ; then \ ! 664: $(ECHO) Exporting project headers... ; \ ! 665: $(MAKE) export_project_headers \ ! 666: "DEV_PUBLIC_HEADER_DIR =" \ ! 667: "DEV_PRIVATE_HEADER_DIR =" \ ! 668: "COMMON_APP_MAKEFILE_DIR = $(COMMON_APP_MAKEFILE_DIR)"\ ! 669: "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \ ! 670: "MAKEFILEDIR = $(MAKEFILEDIR)" \ ! 671: "DSTROOT = $(DSTROOT)" \ ! 672: "SRCROOT = $(SRCROOT)" \ ! 673: "OBJROOT = $(OBJROOT)" \ ! 674: "SYMROOT = $(SYMROOT)" ; \ ! 675: $(ECHO) Finished exporting project headers. ; \ ! 676: fi) ! 677: ! 678: export_project_headers: ! 679: @($(MAKE) copy_my_headers \ ! 680: "PUBLIC_HEADER_DEST_DIR = $(DEV_PUBLIC_HEADER_DIR)" \ ! 681: "PROJECT_HEADER_DEST_DIR = $(DEV_PROJECT_HEADER_DIR)" \ ! 682: "PRIVATE_HEADER_DEST_DIR = $(DEV_PRIVATE_HEADER_DIR)" \ ! 683: "HEADER_COPY_CMD = $(FASTLN)" \ ! 684: "COMMON_APP_MAKEFILE_DIR = $(COMMON_APP_MAKEFILE_DIR)" \ ! 685: "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \ ! 686: "MAKEFILEDIR = $(MAKEFILEDIR)" \ ! 687: "DSTROOT = $(DSTROOT)" \ ! 688: "SRCROOT = $(SRCROOT)" \ ! 689: "OBJROOT = $(OBJROOT)" \ ! 690: "SYMROOT = $(SYMROOT)" ; \ ! 691: subdirectories="$(ALL_SUBPROJECTS)"; \ ! 692: target=export_project_headers ; \ ! 693: $(recurse_on_subdirectories)) ! 694: ! 695: copy_my_headers:: $(PUBLIC_HEADERS) $(OTHER_PUBLIC_HEADERS) $(PROJECT_HEADERS) $(OTHER_PROJECT_HEADERS) $(PRIVATE_HEADERS) $(OTHER_PRIVATE_HEADERS) ! 696: @(if [ \( -n "$(PUBLIC_HEADERS)" -o \ ! 697: -n "$(OTHER_PUBLIC_HEADERS)" \) -a \ ! 698: -n "$(PUBLIC_HEADER_DEST_DIR)" ] ; then \ ! 699: $(MKDIRS) $(PUBLIC_HEADER_DEST_DIR) ; \ ! 700: $(HEADER_COPY_CMD) $(PUBLIC_HEADERS) $(OTHER_PUBLIC_HEADERS) $(PUBLIC_HEADER_DEST_DIR) ; \ ! 701: fi ; \ ! 702: if [ \( -n "$(PROJECT_HEADERS)" -o \ ! 703: -n "$(OTHER_PROJECT_HEADERS)" \) -a \ ! 704: -n "$(PROJECT_HEADER_DEST_DIR)" ] ; then \ ! 705: $(MKDIRS) $(PROJECT_HEADER_DEST_DIR) ; \ ! 706: $(HEADER_COPY_CMD) $(PROJECT_HEADERS) $(OTHER_PROJECT_HEADERS) $(PROJECT_HEADER_DEST_DIR) ; \ ! 707: fi ; \ ! 708: if [ \( -n "$(PRIVATE_HEADERS)" -o \ ! 709: -n "$(OTHER_PRIVATE_HEADERS)" \) -a \ ! 710: -n "$(PRIVATE_HEADER_DEST_DIR)" ] ; then \ ! 711: $(MKDIRS) $(PRIVATE_HEADER_DEST_DIR) ; \ ! 712: $(HEADER_COPY_CMD) $(PRIVATE_HEADERS) $(OTHER_PRIVATE_HEADERS) $(PRIVATE_HEADER_DEST_DIR) ; \ ! 713: fi) ! 714: ! 715: after_installhdrs:: ! 716: @(if [ -n "$(PUBLIC_PRECOMPILED_HEADERS)" -a -n "$(PUBLIC_HEADER_DIR)" ] ; then \ ! 717: cd $(DSTROOT)/$(PUBLIC_HEADER_DIR) ; \ ! 718: for header in $(PUBLIC_PRECOMPILED_HEADERS) none ; do \ ! 719: if [ $$header = "none" ] ; then break; fi ; \ ! 720: cmd="cc -precomp $(PUBLIC_PRECOMPILED_HEADERS_CFLAGS) $(RC_CFLAGS) $$header";\ ! 721: $(ECHO) $$cmd ; $$cmd ; \ ! 722: done ; \ ! 723: fi) ! 724: ! 725: ! 726: # Cleaning stuff: ! 727: ! 728: clean:: ! 729: @(echo == Making clean for $(NAME) == ; \ ! 730: $(set_bundle_ext) ; \ ! 731: $(process_target_archs) ; \ ! 732: if [ -n "$(CLEAN_ALL_SUBPROJECTS)" ] ; then \ ! 733: $(MAKE) actual_clean really_clean \ ! 734: "DEV_HEADER_DIR_BASE = $(DEV_HEADER_DIR_BASE)" \ ! 735: "BUNDLE_EXTENSION = $$bundle_ext" \ ! 736: "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \ ! 737: "COMMON_APP_MAKEFILE_DIR = $(COMMON_APP_MAKEFILE_DIR)" \ ! 738: "SYMROOT = $$symroot" \ ! 739: "OBJROOT = $$objroot" ; \ ! 740: else \ ! 741: $(MAKE) actual_clean "BUNDLE_EXTENSION = $$bundle_ext" \ ! 742: "DEV_HEADER_DIR_BASE = $(DEV_HEADER_DIR_BASE)" \ ! 743: "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \ ! 744: "COMMON_APP_MAKEFILE_DIR = $(COMMON_APP_MAKEFILE_DIR)" \ ! 745: "SYMROOT = $$symroot" \ ! 746: "OBJROOT = $$objroot" ; \ ! 747: fi ) ! 748: ! 749: actual_clean:: $(NAME).clean ! 750: ! 751: really_clean:: ! 752: @(subdirectories="$(ALL_SUBPROJECTS)" ;\ ! 753: target="actual_clean really_clean"; \ ! 754: beginning_msg="Cleaning" ; ending_msg="Finished cleaning" ; \ ! 755: $(recurse_on_subdirectories)) ! 756: ! 757: $(NAME).clean:: ! 758: @if [ ! -w . ] ; then $(ECHO) '***' project write-protected; exit 1 ; fi ! 759: $(RM) -rf $(GARBAGE) ! 760: ! 761: ! 762: # Misc. old stuff: ! 763: ! 764: writable:: ! 765: @chmod -R +w * ! 766: ! 767: protected:: ! 768: @chmod -R a-w * ! 769: ! 770:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.