# BeOS specific rules rule AddFileDataAttribute target : attrName : attrType : dataFile { # AddFileAttribute : : : ; # Adds a single attribute to a file, retrieving the attribute data from # a separate file. # : The file to which the attribute shall be added. # : The name of the attribute. # : Attribute type as supported by addattr (string, int, etc.) # : The data to be written to the attribute will be read from # that file. # Note that this is supposed to be a build target, not a path # name - if you need to add a data file in a different path, # you have to locate it first. # # We need to create a temporary file in which we store the attribute name # and type. Otherwise we wouldn't have these data available in the # addattr actions. local id = [ NextID ] ; local attrMetaFile = [ FGristFiles $(target:G=)-attr-$(attrName)-$(attrType)-$(id) ] ; ATTRIBUTE_NAME on $(attrMetaFile) = $(attrName) ; ATTRIBUTE_TYPE on $(attrMetaFile) = $(attrType) ; MakeLocateArch $(attrMetaFile) ; CreateAttributeMetaFile $(attrMetaFile) ; Depends $(target) : addattr $(attrMetaFile) $(dataFile) ; AddFileDataAttribute1 $(target) : addattr $(attrMetaFile) $(dataFile) ; } actions CreateAttributeMetaFile { echo "-t $(ATTRIBUTE_TYPE)" "$(ATTRIBUTE_NAME)" > "$(1)" } actions AddFileDataAttribute1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) $(2[1]) -f $(2[3]) `cat $(2[2])` $(1) } rule AddStringDataResource { # AddStringDataResource : : # Adds a single resource to the resources of an executable/library. # : The executable/library. # : A resource ID string as understood by xres (type:id[:name]). # : The string will be written to the resource. # Defaults to "". # local target = $(1) ; local resourceID = $(2) ; local dataString = $(3:E="") ; # the resource file local resources = [ FGristFiles $(target:B)-added-string-data-resources.rsrc ] ; # add the resource file to the target, if not yet done if ! [ on $(resources) return $(RESOURCES_ADDED) ] { RESOURCES_ADDED on $(resources) = true ; MakeLocateArch $(resources) ; Depends $(resources) : xres ; AddStringDataResource1 $(resources) : xres ; AddResources $(target) : $(resources) ; } RESOURCE_STRINGS on $(resources) += "-a "$(resourceID)" -s \""$(dataString)"\"" ; } actions together AddStringDataResource1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) $(2[1]) -o "$(1)" $(RESOURCE_STRINGS) } rule AddFileDataResource { # AddFileDataResource : : [ ] # Adds a single resource to the resources of an executable/library. # : The executable/library. # : A resource ID string as understood by xres (type:id[:name]). # : The data to be written into the resource will be read from # that file. # Note that this is supposed to be a build target, not a path # name - if you need to add a data file in a different path, you # have to locate it first. # local target = $(1) ; local resourceID = $(2) ; local dataFile = $(3) ; # the resource file local resources = file-data-$(resourceID)-$(dataFile).rsrc ; # add it to the resources of the given target AddResources $(target) : $(resources) ; # if the rule for creating the resource file has not been invoked yet, do it if ! [ on $(resources) return $(RESOURCES_DEFINED) ] { RESOURCES_DEFINED on $(resources) = true ; RESOURCE_ID on $(resources) = $(resourceID) ; MakeLocateArch $(resources) ; Depends $(resources) : xres $(dataFile) ; AddFileDataResource1 $(resources) : xres $(dataFile) ; } } actions AddFileDataResource1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) $(2[1]) -o "$(1)" -a "$(RESOURCE_ID)" "$(2[2])" ; } rule XRes { # XRes : if $(2) { Depends $(1) : xres $(2) ; XRes1 $(1) : xres $(2) ; } } actions XRes1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) $(2[1]) -o "$(1)" "$(2[2-])" ; } rule SetVersion { # SetVersion Depends $(1) : setversion ; SetVersion1 $(1) : setversion ; } actions SetVersion1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) $(2[1]) "$(1)" -system $(HAIKU_BUILD_VERSION) -short "$(HAIKU_BUILD_DESCRIPTION)" ; } rule SetType { # SetType Depends $(1) : settype ; SetType1 $(1) : settype ; } actions SetType1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) $(2[1]) -t $(TARGET_EXECUTABLE_MIME_TYPE) "$(1)" ; } rule MimeSet { # MimeSet Depends $(1) : mimeset ; MimeSet1 $(1) : mimeset ; } actions MimeSet1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) $(2[1]) -f "$(1)" ; } rule ResComp { # ResComp : ; # # and must be gristed. # get compiler and defines for the platform local cc ; local defines ; local localIncludesOption ; on $(1) { # use on $(1) variable values defines = $(DEFINES) ; if $(PLATFORM) = host { defines += $(HOST_DEFINES) ; cc = $(HOST_CC) ; localIncludesOption = $(HOST_LOCAL_INCLUDES_OPTION) ; } else { defines += $(TARGET_DEFINES) ; cc = $(TARGET_CC) ; localIncludesOption = $(TARGET_LOCAL_INCLUDES_OPTION) ; } } DEFINES on $(1) = $(defines) ; CCDEFS on $(1) = [ FDefines $(defines) ] ; HDRS on $(1) = [ FIncludes $(SEARCH_SOURCE) $(SUBDIRHDRS) $(HDRS) : $(localIncludesOption) ] ; RCHDRS on $(1) = [ FIncludes $(SEARCH_SOURCE) $(SUBDIRHDRS) $(HDRS) : "-I " ] ; CC on $(1) = $(cc) ; # set up other vars SEARCH on $(2) += $(SEARCH_SOURCE) ; MakeLocateArch $(1) ; Depends $(1) : $(2) rc ; LocalClean clean : $(1) ; ResComp1 $(1) : rc $(2) ; } # Note: We pipe the input files into the preprocessor, since *.rdef files are # considered linker scripts, and thus we can use preprocessor features. actions ResComp1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) cat "$(2[2-])" | $(CC) -E $(CCDEFS) $(HDRS) - | egrep -v '^#' | $(2[1]) $(RCHDRS) --auto-names -o "$(1)" - } rule ResAttr attributeFile : _resourceFiles : deleteAttributeFile { # ResAttr : [ : ] ; # # and must be gristed. # can also be .rdef files -- they will be compiled first in # this case. # is a boolean that specifies wether or not the target file # should be removed before writing. Defaults to true. local resourceFiles ; local resourceFile ; deleteAttributeFile ?= true ; deleteAttributeFile1 on $(1) = $(deleteAttributeFile) ; for resourceFile in $(_resourceFiles) { # if the specified resource file is an .rdef file, we compile it first if $(resourceFile:S) = ".rdef" { local rdefFile = $(resourceFile) ; resourceFile = $(rdefFile:S=.rsrc) ; ResComp $(resourceFile) : $(rdefFile) ; } else { SEARCH on $(resourceFile) += $(SEARCH_SOURCE) ; } resourceFiles += $(resourceFile) ; } MakeLocateArch $(attributeFile) ; Depends $(attributeFile) : $(resourceFiles) resattr ; LocalClean clean : $(attributeFile) ; ResAttr1 $(attributeFile) : resattr $(resourceFiles) ; } actions ResAttr1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) if [ \\"$(deleteAttributeFile1)\\" = "true" ]; then $(RM) $(1) fi $(2[1]) -O -o "$(1)" "$(2[2-])" } # Localization rules # Extract catalog entries from the sourcefile and put the output textfile in # target. This output file is then used to create the binary catalog with # linkcatkeys. rule ExtractCatalogEntries target : source : signature { # get compiler and defines for the platform local headers ; local sysHeaders ; local cc ; local defines ; local localIncludesOption ; local systemIncludesOption ; on $(target) { # use on $(target) variable values headers = $(HAIKU_CONFIG_HEADERS) $(SEARCH_SOURCE) $(SUBDIRHDRS) $(HDRS) ; sysHeaders = $(SUBDIRSYSHDRS) $(SYSHDRS) ; defines = $(DEFINES) ; if $(PLATFORM) = host { sysHeaders += $(HOST_HDRS) ; defines += $(HOST_DEFINES) ; if $(USES_BE_API) { sysHeaders += $(HOST_BE_API_HEADERS) ; } defines += $(HOST_DEFINES) ; cc = $(HOST_CC) ; localIncludesOption = $(HOST_LOCAL_INCLUDES_OPTION) ; systemIncludesOption = $(HOST_SYSTEM_INCLUDES_OPTION) ; } else { sysHeaders += $(TARGET_HDRS) ; defines += $(TARGET_DEFINES) ; defines += $(TARGET_DEFINES) ; cc = $(TARGET_CC) ; localIncludesOption = $(TARGET_LOCAL_INCLUDES_OPTION) ; systemIncludesOption = $(TARGET_SYSTEM_INCLUDES_OPTION) ; } } DEFINES on $(target) = $(defines) ; CCDEFS on $(target) = [ FDefines $(defines) ] ; HDRS on $(target) = [ FIncludes $(headers) : $(localIncludesOption) ] $(includesSeparator) [ FSysIncludes $(sysHeaders) : $(systemIncludesOption) ] ; CC on $(target) = $(cc) ; HAIKU_CATALOG_SIGNATURE on $(target) = $(signature) ; SEARCH on $(source) += $(SEARCH_SOURCE) ; MakeLocatePlatform $(target) ; Depends $(target) : $(source) collectcatkeys ; LocalClean clean : $(target).pre ; ExtractCatalogEntries1 $(target) : collectcatkeys $(source) ; } actions ExtractCatalogEntries1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) cat "$(2[2-])" | $(CC) -E $(CCDEFS) $(HDRS) - > "$(1)".pre $(2[1]) -s $(HAIKU_CATALOG_SIGNATURE) -w -o "$(1)" "$(1)".pre } rule LinkApplicationCatalog target : sources : signature : language { # Link catalog entries from given catkey file into output compiled catalog # file. Compiled catalog file will then be copied into the image, but only # if the fingerprint matches the one from the untranslated catalog for the # same file. MakeLocateArch $(target) ; Depends $(target) : $(sources) linkcatkeys ; LocalClean clean : $(target) ; HAIKU_CATALOG_SIGNATURE on $(target) = $(signature) ; HAIKU_CATALOG_LANGUAGE on $(target) = $(language) ; LinkApplicationCatalog1 $(target) : linkcatkeys $(sources) ; } actions LinkApplicationCatalog1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) $(2[1]) "$(2[2-])" -l $(HAIKU_CATALOG_LANGUAGE) -v \ -s $(HAIKU_CATALOG_SIGNATURE) -o "$(1)" } rule DoCatalogs target : signature : sources : sourceLanguage { # DoCatalogs : : [ : ] # # Extracts the catkeys from a target's source files, generates the # default catalog from them, and also generates catalogs for all # translations. # # target: The target. # signature: Application MIME signature (must match the one # declared in the sourcecode). # sources: List of cpp files where to search keys. # sourceLanguage Short name of the language of used for the strings in # the sources. Optional: default is "en". local generatedCatalog = [ FGristFiles $(sourceLanguage:E=en:S=.catalog) ] ; # generate catkeys file from sources ExtractCatalogEntries $(generatedCatalog:S=.catkeys) : [ FGristFiles $(sources) ] : $(signature) ; # find translations local translationsDir = [ FDirName $(HAIKU_TOP) data catalogs $(SUBDIR_TOKENS[2-]) ] ; local translations = [ Glob $(translationsDir) : *.catkeys ] ; translations = [ FGristFiles $(translations:BS) ] ; SEARCH on $(translations) += $(translationsDir) ; # generate catalogs from all catkeys files local catkeysFiles = $(generatedCatalog:S=.catkeys) $(translations) ; for catkeysFile in $(catkeysFiles) { LinkApplicationCatalog $(catkeysFile:S=.catalog) : $(catkeysFile) : $(signature) : $(catkeysFile:B) ; } HAIKU_CATALOG_FILES on $(target) = $(catkeysFiles:S=.catalog) ; HAIKU_CATALOG_SIGNATURE on $(target) = $(signature) ; }