#!/bin/bash # Copyright (C) 2021 The Qt Company Ltd. # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 usage() { cat <&2 Usage: update_moc [gu] [moc directory] The moc directory should be qtbase's moc source directory (absolute or relative). The script must be run from the directory containing the moc files (moc.h et. al). The script has two modes: 'g' Generates updated patches of the current qtscxml-specific moc changes. Use this when the qtscxml-specific parts in moc files have changed and the patches should be updated accordingly. 'u' Updates the moc from the upstream qtbase moc. This mode gets the applicable qtbase moc files from the provided directory, and updates their qtscxml copies by applying patches to them. If you have not modified qtscxml moc code and just want to update the moc code from upstream, this is the one you should use. Examples: moc_patches/update_moc g ../../../qtbase/src/tools/moc moc_patches/update_moc u ../../../qtbase/src/tools/moc EOF die "$@" } checkFile () { for f do [[ -f "$f" ]] || die "Error: file \"$f\" does not exist." done } warn () { echo "$@" >&2; } die () { [[ -h .upstream ]] && rm .upstream warn "$@" exit 1 } generate_patch() { echo Generating patches recording how qscxmlc moc differs from upstream. # Link the upstream moc files to create a patch file with filepaths # that are independent of the actual used upstream moc location. ln -s "$MOC_DIR" .upstream for file in "${FILES[@]}" do checkFile "$file" ".upstream/$file" diff -u ".upstream/$file" "$file" > "moc_patches/$file.patch" echo Generated "moc_patches/$file.patch" done # tidy up rm .upstream } update_moc() { echo Updating qscxmlc moc from upstream by applying saved patches. for file in "${FILES[@]}" do checkFile "moc_patches/$file.patch" "$MOC_DIR/$file" echo Patching file: "$file" with "moc_patches/$file.patch" # overwrite the current file from upstream cp "$MOC_DIR/$file" "$file" if patch "$file" "moc_patches/$file.patch" then echo Patched "$file" else warn "Please hand-patch $file; see $file.orig and $file.rej and tidy them away when you are done." fi done } MODE="$1" MOC_DIR="$2" FILES=( "outputrevision.h" "moc.cpp" "moc.h" "generator.h" "generator.cpp" ) [[ -f moc_patches/update_moc.sh ]] || usage "Error: script must be run from the tools/qscxmlc/ directory." [[ -n "$MOC_DIR" ]] || usage "Error: You did not specify a moc directory." [[ -d "$MOC_DIR" ]] || usage "Error: moc directory \"$MOC_DIR\" does not exist." case "$MODE" in g) generate_patch ;; u) update_moc ;; *) usage "Error: mode \"$MODE\" is not recognized." ;; esac echo Done