## # Makefile for Apple Release Control (Archive Extraction & Patch) # # Copyright (c) 2005-2010 Apple Inc. # # @APPLE_LICENSE_HEADER_START@ # # Portions Copyright (c) 2005-2009 Apple Inc. All Rights Reserved. # This file contains Original Code and/or Modifications of Original Code # as defined in and that are subject to the Apple Public Source License # Version 2.0 (the 'License'). You may not use this file except in # compliance with the License. Please obtain a copy of the License at # http://www.opensource.apple.com/apsl/ and read it before using this # file. # # The Original Code and all software distributed under the License are # distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER # EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, # INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. # Please see the License for the specific language governing rights and # limitations under the License. # @APPLE_LICENSE_HEADER_END@ ## # This header must be included after GNUsource.make or Common.make # # Set these variables as needed before including this file: # GnuAfterInstall - project-specific post-install targets. This MUST be defined # for the AEP post-install helper targets to be invoked. # AEP_Version - open source project version, used in archive name and # extracted directory # AEP_Patches - list of file names (from patches subdirectory) to # run thru patch and apply to extracted sources # AEP_LicenseFile - full path to license file # AEP_BuildInSources - override default BuildDirectory and set to Sources; # this would be necessary if the project should be built # in the extracted source directory because the real # sources (with configure) are located there. # Extra_Configure_Environment - additional environment variables only needed for # the invocation of configure; this would be # necessary if the project requires extra build flags # but doesn't want to override everything defined by # configure. # # The following variables will be defined if empty: # AEP_Project [ $(Project) ] # AEP_ProjVers [ $(AEP_Project)-$(AEP_Version) ] # AEP_Filename [ $(AEP_ProjVers).tar.[bg]z* ] # AEP_ExtractDir [ $(AEP_ProjVers) ] # AEP_LicenseFile [ $(SRCROOT)/$(ProjectName).txt ] # AEP_ConfigDir [ $(ETCDIR) ] # # Additionally, the following variables may also be defined before # including this file: # AEP_Binaries - list of binaries to archive to SYMROOT and strip in DSTROOT # AEP_LaunchdConfigs - launchd config files in SRCROOT to be installed # into LAUNCHDDIR # AEP_StartupItem - startup items name to be installed into # SYSTEM_STARTUP_DIR; assumes existence of # StartupParameters.plist and Localizable.strings # AEP_ManPages - man pages provided outside the extracted project # AEP_ConfigFiles - standard set of configuration files; ".default" versions # will be created as well # Dependencies - list of subprojects which should be built before main project. # # Finally, a new target, archive-strip-binaries, is made available to copy # AEP_Binaries to SYMROOT and strip the versions in DSTROOT. To leverage this # target, it should be defined as the first item in GnuAfterInstall. ## #GnuAfterInstall += archive-strip-binaries GnuAfterInstall += install-startup-files install-open-source-files GnuAfterInstall += install-top-level-man-pages install-configuration-files # # Define AEP variables # ifndef AEP_Project AEP_Project = $(Project) endif ifndef AEP_ProjVers ifdef AEP_Version AEP_ProjVers = $(AEP_Project)-$(AEP_Version) else AEP_ProjVers = $(AEP_Project) endif endif ifndef AEP_Filename AEP_Filename = $(wildcard $(AEP_ProjVers).tar.gz $(AEP_ProjVers).tar.bz2) endif ifeq ($(suffix $(AEP_Filename)),.bz2) AEP_ExtractOption = j else AEP_ExtractOption = z endif ifndef AEP_ExtractDir AEP_ExtractDir = $(AEP_ProjVers) endif ifndef AEP_LicenseFile AEP_LicenseFile = $(SRCROOT)/$(ProjectName).txt endif ifndef AEP_ManPages AEP_ManPages := $(wildcard *.[1-9] man/*.[1-9]) endif ifndef AEP_ConfigDir AEP_ConfigDir = $(ETCDIR) endif #AEP_ExtractRoot = $(SRCROOT) AEP_ExtractRoot = $(OBJROOT) # Redefine the Sources directory defined elsewhere # ...but save the version of ConfigStamp (based on Sources) # GNUSource.make uses. GNUConfigStamp := $(ConfigStamp) Sources = $(AEP_ExtractRoot)/$(AEP_Project) # Redefine Configure to allow extra "helper" environment variables. # This logic was moved to GNUSource.make in 10A251, so only override the setting # if building on an earlier system. (Make_Flags is only defined with that patch.) ifndef Make_Flags ifdef Extra_Configure_Environment Configure := $(Extra_Configure_Environment) $(Configure) endif endif # Open Source configuration directories OSVDIR = $(USRDIR)/local/OpenSourceVersions OSLDIR = $(USRDIR)/local/OpenSourceLicenses # Launchd / startup item paths LAUNCHDDIR = $(NSSYSTEMDIR)$(NSLIBRARYSUBDIR)/LaunchDaemons SYSTEM_STARTUP_DIR = $(NSSYSTEMDIR)$(NSLIBRARYSUBDIR)/StartupItems # # AEP targets # .PHONY: extract-source build-dependencies archive-strip-binaries .PHONY: install-open-source-files install-startup-files .PHONY: install-top-level-man-pages install-configuration-files ifdef ConfigStamp $(GNUConfigStamp): extract-source build-dependencies else build:: extract-source build-dependencies endif # Because GNUSource's ConfigStamp's rules are processed before this file is included, # it's easier to copy the sources to the build directory and work from there. extract-source:: ifeq ($(AEP),YES) @echo "Extracting source for $(Project)..." $(MKDIR) $(AEP_ExtractRoot) $(TAR) -C $(AEP_ExtractRoot) -$(AEP_ExtractOption)xf $(SRCROOT)/$(AEP_Filename) $(RMDIR) $(Sources) $(_v) $(RM) $(GNUConfigStamp) $(MV) $(AEP_ExtractRoot)/$(AEP_ExtractDir) $(Sources) ifdef AEP_Patches for patchfile in $(AEP_Patches); do \ echo "Applying $$patchfile..."; \ cd $(Sources) && $(PATCH) -lp1 < $(SRCROOT)/patches/$$patchfile; \ done endif ifeq ($(AEP_BuildInSources),YES) ifneq ($(Sources),$(BuildDirectory)) @echo "Copying sources to build directory..." $(_v) $(CP) $(Sources) $(BuildDirectory) endif endif else @echo "Source extraction for $(Project) skipped!" endif # Common.make's recurse doesn't reset SRCROOT and misdefines Sources build-dependencies: ifdef Dependencies $(_v) for Dependency in $(Dependencies); do \ $(MAKE) -C $${Dependency} $(TARGET) \ SRCROOT=$(SRCROOT)/$${Dependency} \ OBJROOT=$(OBJROOT) \ SYMROOT=$(SYMROOT) \ DSTROOT=$(DSTROOT) \ BuildDirectory=$(OBJROOT)/Build/$${Dependency} \ Sources=$(OBJROOT)/$${Dependency} \ CoreOSMakefiles=$(CoreOSMakefiles) \ $(Extra_Dependency_Flags); \ done endif archive-strip-binaries:: $(SYMROOT) ifdef AEP_Binaries @echo "Archiving and stripping binaries..." $(_v) for file in $(addprefix $(DSTROOT),$(AEP_Binaries)); \ do \ $(CP) $${file} $(SYMROOT); \ $(DSYMUTIL) --out=$(SYMROOT)/$${file##*/}.dSYM $${file};\ $(STRIP) -S $${file}; \ done endif install-startup-files:: ifdef AEP_LaunchdConfigs @echo "Installing launchd configuration files..." $(INSTALL_DIRECTORY) $(DSTROOT)$(LAUNCHDDIR) $(INSTALL_FILE) $(AEP_LaunchdConfigs) $(DSTROOT)$(LAUNCHDDIR) endif ifdef AEP_StartupItem @echo "Installing StartupItem..." $(INSTALL_DIRECTORY) $(DSTROOT)$(SYSTEM_STARTUP_DIR)/$(AEP_StartupItem) $(INSTALL_SCRIPT) $(StartupItem) $(DSTROOT)$(SYSTEM_STARTUP_DIR)/$(AEP_StartupItem) $(INSTALL_FILE) StartupParameters.plist $(DSTROOT)$(SYSTEM_STARTUP_DIR)/$(AEP_StartupItem) $(INSTALL_DIRECTORY) $(DSTROOT)$(SYSTEM_STARTUP_DIR)/$(AEP_StartupItem)/Resources/English.lproj $(INSTALL_FILE) Localizable.strings $(DSTROOT)$(SYSTEM_STARTUP_DIR)/$(AEP_StartupItem)/Resources/English.lproj endif install-open-source-files:: @echo "Installing Apple-internal open-source documentation..." if [ -e $(SRCROOT)/$(ProjectName).plist ]; then \ $(MKDIR) $(DSTROOT)/$(OSVDIR); \ $(INSTALL_FILE) $(SRCROOT)/$(ProjectName).plist $(DSTROOT)/$(OSVDIR)/$(ProjectName).plist; \ else \ echo "WARNING: No open-source file for this project!"; \ fi if [ -e $(AEP_LicenseFile) ]; then \ $(MKDIR) $(DSTROOT)/$(OSLDIR); \ $(INSTALL_FILE) $(AEP_LicenseFile) $(DSTROOT)/$(OSLDIR)/$(ProjectName).txt; \ else \ echo "WARNING: No open-source file for this project!"; \ fi # # Install any man pages at the top-level directory or its "man" subdirectory # install-top-level-man-pages:: ifdef AEP_ManPages @echo "Installing top-level man pages..." for _page in $(AEP_ManPages); do \ _section_dir=$(Install_Man)/man$${_page##*\.}; \ $(INSTALL_DIRECTORY) $(DSTROOT)$${_section_dir}; \ $(INSTALL_FILE) $${_page} $(DSTROOT)$${_section_dir}; \ done endif # # Install configuration files and their corresponding ".default" files # to one standard location. # install-configuration-files:: ifdef AEP_ConfigFiles @echo "Installing configuration files..." $(INSTALL_DIRECTORY) $(DSTROOT)$(AEP_ConfigDir) for file in $(AEP_ConfigFiles); \ do \ $(INSTALL_FILE) $${file} $(DSTROOT)$(AEP_ConfigDir); \ $(CHMOD) u+w $(DSTROOT)$(AEP_ConfigDir)/$${file}; \ if [ "${file##*.}" != "default" ]; then \ $(INSTALL_FILE) $${file} $(DSTROOT)$(AEP_ConfigDir)/$${file}.default; \ fi; \ done endif clean:: $(_v) if [ -d $(Sources) ]; then \ cd $(Sources) && make clean; \ fi $(DSTROOT) $(DSTROOT)$(AEP_ConfigDir) $(SYMROOT) $(TMPDIR): $(MKDIR) $@