mirror of
				https://github.com/falk-werner/webfuse
				synced 2025-06-13 12:54:15 +00:00 
			
		
		
		
	
		
			
	
	
		
			291 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			291 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/bin/sh
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# This Source Code Form is subject to the terms of the Mozilla Public
							 | 
						||
| 
								 | 
							
								# License, v. 2.0. If a copy of the MPL was not distributed with this
							 | 
						||
| 
								 | 
							
								# file, You can obtain one at http://mozilla.org/MPL/2.0/.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# This file is part of dobuild.
							 | 
						||
| 
								 | 
							
								# Copyright (c) 2019 Contributors as noted in the AUTHORS file.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SPDX-License-Identifier: MPL-2.0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set -e
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# FIXME: don't depend on cmake internals
							 | 
						||
| 
								 | 
							
								discover_cmake_includes() {
							 | 
						||
| 
								 | 
							
								  if [ $# -gt 0 ]; then
							 | 
						||
| 
								 | 
							
								    sed -n -e 's/.*_INCLUDE_DIRS:INTERNAL=\(.*\)$/\1/p' "$@";
							 | 
						||
| 
								 | 
							
								  fi
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								discover_system_includes() {
							 | 
						||
| 
								 | 
							
								  case "$BUILDSYSTEM" in
							 | 
						||
| 
								 | 
							
								    cmake-?*)
							 | 
						||
| 
								 | 
							
								      discover_cmake_includes "$@"
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    *)
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								  esac
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# FIXME: handle different compilers and language standards
							 | 
						||
| 
								 | 
							
								discover_cc_includes() {
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    echo | "$CXX" -xc++ -E -Wp,-v - 2>&1
							 | 
						||
| 
								 | 
							
								    echo | "$CC" -xc -E -Wp,-v - 2>&1
							 | 
						||
| 
								 | 
							
								  } \
							 | 
						||
| 
								 | 
							
								  | sed -n -e 's/\s\+\(\/.*$\).*/\1/p'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								discover_includes() {
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    discover_cc_includes;
							 | 
						||
| 
								 | 
							
								    discover_system_includes "$@"
							 | 
						||
| 
								 | 
							
								  } \
							 | 
						||
| 
								 | 
							
								  | sed 's/;/\n/g' |  sed '/^$/d' | sort -u 2>/dev/null \
							 | 
						||
| 
								 | 
							
								  | while IFS= read -r file; do
							 | 
						||
| 
								 | 
							
								    if [ -e "$file" ]; then
							 | 
						||
| 
								 | 
							
								      canonicalize "$file"
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								  done
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								detect_toolchain() {
							 | 
						||
| 
								 | 
							
								  case "$BUILDSYSTEM" in
							 | 
						||
| 
								 | 
							
								    cmake-?*)
							 | 
						||
| 
								 | 
							
								      cmake -LA -N "$(dirname "$1")" > "$CACHED_VALUES_TMPFILE"
							 | 
						||
| 
								 | 
							
								      CXX="$(sed -n -e 's/CMAKE_CXX_COMPILER:FILEPATH=\(.*\)$/\1/p' -e 's/CMAKE_CXX_COMPILER:STRING=\(.*\)$/\1/p' "$CACHED_VALUES_TMPFILE")"
							 | 
						||
| 
								 | 
							
								      CC="$(sed -n -e 's/CMAKE_C_COMPILER:FILEPATH=\(.*\)$/\1/p' -e 's/CMAKE_C_COMPILER:STRING=\(.*\)$/\1/p' "$CACHED_VALUES_TMPFILE")"
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    *)
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								  esac
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								parse_make_targets() {
							 | 
						||
| 
								 | 
							
								  parse_make_targets.sh -C "$WORKINGDIR"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								parse_ninja_targets() {
							 | 
						||
| 
								 | 
							
								  "$NINJA" -C "$WORKINGDIR" -t targets all | sed -n -e 's/\([^:]*\):.*/\1/p' | sort 2>/dev/null
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								discover_targets() {
							 | 
						||
| 
								 | 
							
								  case "$BUILDSYSTEM" in
							 | 
						||
| 
								 | 
							
								    cmake-make|make)
							 | 
						||
| 
								 | 
							
								      parse_make_targets
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    cmake-ninja|ninja)
							 | 
						||
| 
								 | 
							
								      parse_ninja_targets
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    *)
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								  esac
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								prefix_dir() {
							 | 
						||
| 
								 | 
							
								  while IFS= read -r dir; do
							 | 
						||
| 
								 | 
							
								    printf '%s%s\n' "$1" "$dir"
							 | 
						||
| 
								 | 
							
								  done
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sed_keyword() {
							 | 
						||
| 
								 | 
							
								  printf '%s\n' "$@" | sed -e 's/[]\/$*.^[]/\\&/g'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sed_replacement() {
							 | 
						||
| 
								 | 
							
								  printf '%s\n' "$@" | sed -e 's/[\/&]/\\&/g'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								format_json() {
							 | 
						||
| 
								 | 
							
								  i=0
							 | 
						||
| 
								 | 
							
								  printf '[\n'
							 | 
						||
| 
								 | 
							
								  while IFS= read -r line; do
							 | 
						||
| 
								 | 
							
								    if [ "$i" -gt 0 ]; then
							 | 
						||
| 
								 | 
							
								      printf ',\n'
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								    printf '"%s"' "$line"
							 | 
						||
| 
								 | 
							
								    i="$((i+1))"
							 | 
						||
| 
								 | 
							
								  done
							 | 
						||
| 
								 | 
							
								  printf '\n]\n'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								physical_pwd() {
							 | 
						||
| 
								 | 
							
								  pwd -P 2>/dev/null || pwd
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								try_canonicalize() {
							 | 
						||
| 
								 | 
							
								  readlink -f "$@" 2>/dev/null || realpath "$@"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								canonicalize() {
							 | 
						||
| 
								 | 
							
								  if ! try_canonicalize "$1" 2>/dev/null; then
							 | 
						||
| 
								 | 
							
								    echo "$(cd "$(dirname "$1")" && physical_pwd)/$(basename "$1")"
							 | 
						||
| 
								 | 
							
								  fi
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								scriptdir() {
							 | 
						||
| 
								 | 
							
								  dirname "$(canonicalize "${BASH_SOURCE:-$1}")"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cleanup() {
							 | 
						||
| 
								 | 
							
								  EXITCODE="${EXITCODE:-$?}"
							 | 
						||
| 
								 | 
							
								  rm -f "$INCLUDE_DIRS_TMPFILE" "$CACHED_VALUES_TMPFILE"
							 | 
						||
| 
								 | 
							
								  return "$EXITCODE" 
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								trap cleanup TERM INT EXIT
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export LANG=C
							 | 
						||
| 
								 | 
							
								export LC_ALL=C
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DOBUILDDIR="${DOBUILDDIR:-"$(dirname "$(scriptdir "$0")")"}"
							 | 
						||
| 
								 | 
							
								NINJA="${NINJA:-ninja}"
							 | 
						||
| 
								 | 
							
								PATH="$DOBUILDDIR/bin:$PATH"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set -- "$@" --
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CXX=
							 | 
						||
| 
								 | 
							
								CC=
							 | 
						||
| 
								 | 
							
								BUILDSYSTEM=
							 | 
						||
| 
								 | 
							
								WORKINGDIR="$PWD"
							 | 
						||
| 
								 | 
							
								PROJECTDIR=
							 | 
						||
| 
								 | 
							
								INCLUDE_PREFIX="$WORKINGDIR"
							 | 
						||
| 
								 | 
							
								COMPILE_COMMANDS_JSON_FILE=
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								while :; do
							 | 
						||
| 
								 | 
							
								  case $1 in
							 | 
						||
| 
								 | 
							
								    -C|--directory)
							 | 
						||
| 
								 | 
							
								      if [ "$2" != '--' ]; then
							 | 
						||
| 
								 | 
							
								        WORKINGDIR="$2"
							 | 
						||
| 
								 | 
							
								        shift
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        printf 'error: "%s" requires a non-empty option argument.\n' "$1" >&2
							 | 
						||
| 
								 | 
							
								        exit 3
							 | 
						||
| 
								 | 
							
								      fi
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --directory=)
							 | 
						||
| 
								 | 
							
								      printf 'error: "%s" requires a non-empty option argument.\n' "$1" >&2
							 | 
						||
| 
								 | 
							
								      exit 3
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --directory=?*)
							 | 
						||
| 
								 | 
							
								      WORKINGDIR="${1#*=}"
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --project-root)
							 | 
						||
| 
								 | 
							
								      if [ "$2" != '--' ]; then
							 | 
						||
| 
								 | 
							
								        PROJECTDIR="$2"
							 | 
						||
| 
								 | 
							
								        shift
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        PROJECTDIR=
							 | 
						||
| 
								 | 
							
								      fi
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --project-root=)
							 | 
						||
| 
								 | 
							
								      PROJECTDIR=
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --project-root=?*)
							 | 
						||
| 
								 | 
							
								      PROJECTDIR="${1#*=}"
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --build-system)
							 | 
						||
| 
								 | 
							
								      if [ "$2" != '--' ]; then
							 | 
						||
| 
								 | 
							
								        BUILDSYSTEM="$2"
							 | 
						||
| 
								 | 
							
								        shift
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        BUILDSYSTEM=
							 | 
						||
| 
								 | 
							
								      fi
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --build-system=)
							 | 
						||
| 
								 | 
							
								      BUILDSYSTEM=
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --build-system=?*)
							 | 
						||
| 
								 | 
							
								      BUILDSYSTEM="${1#*=}"
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    -p|--include-prefix)
							 | 
						||
| 
								 | 
							
								      if [ "$2" != '--' ]; then
							 | 
						||
| 
								 | 
							
								        INCLUDE_PREFIX="$2"
							 | 
						||
| 
								 | 
							
								        shift
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        INCLUDE_PREFIX=
							 | 
						||
| 
								 | 
							
								      fi
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --include-prefix=)
							 | 
						||
| 
								 | 
							
								      INCLUDE_PREFIX=
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --include-prefix=?*)
							 | 
						||
| 
								 | 
							
								      INCLUDE_PREFIX="${1#*=}"
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    compile_commands.json|?*/compile_commands.json)
							 | 
						||
| 
								 | 
							
								      COMPILE_COMMANDS_JSON_FILE="$1"
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --help)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        printf 'Usage: %s [option...] [file...]\n' "$(basename "$0")"
							 | 
						||
| 
								 | 
							
								        printf 'Options:\n'
							 | 
						||
| 
								 | 
							
								        printf '\t-C|--directory\t\tWorking directory\n'
							 | 
						||
| 
								 | 
							
								        printf '\t--build-system\t\tBuildsystem kind e.g. cmake-make,cmake-ninja\n'
							 | 
						||
| 
								 | 
							
								        printf '\t--project-root\t\tProject root directory\n'
							 | 
						||
| 
								 | 
							
								        printf '\t-p|--include-prefix\tInclude prefix appended to all discovered include dirs\n'
							 | 
						||
| 
								 | 
							
								        printf 'Files:\n'
							 | 
						||
| 
								 | 
							
								        printf '\tBuildsystem specific configurations files e.g. CMakeCache.txt\n'
							 | 
						||
| 
								 | 
							
								      } >&2
							 | 
						||
| 
								 | 
							
								      exit 0
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    --)
							 | 
						||
| 
								 | 
							
								      shift
							 | 
						||
| 
								 | 
							
								      break
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								    *)
							 | 
						||
| 
								 | 
							
								      set -- "$@" "$1"
							 | 
						||
| 
								 | 
							
								      ;;
							 | 
						||
| 
								 | 
							
								  esac
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  shift
							 | 
						||
| 
								 | 
							
								done
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								OUTDIR="$WORKINGDIR/DoBuildFiles"
							 | 
						||
| 
								 | 
							
								mkdir -p "$OUTDIR"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								INCLUDE_PREFIX_REPLACEMENT="%OUTDIR%/$INCLUDE_PREFIX"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CACHED_VALUES_TMPFILE="$(mktemp -p "$OUTDIR" cached_values_XXXXXXXXXX.txt)"
							 | 
						||
| 
								 | 
							
								INCLUDE_DIRS_TMPFILE="$(mktemp -p "$OUTDIR" include_dirs_XXXXXXXXXX.txt)"
							 | 
						||
| 
								 | 
							
								INCLUDE_DIRS_TMPL_FILE="$OUTDIR/include_dirs.json.template"
							 | 
						||
| 
								 | 
							
								TARGETS_JSON_FILE="$OUTDIR/targets.json"
							 | 
						||
| 
								 | 
							
								TARGETS_TXT_FILE="$OUTDIR/targets.txt"
							 | 
						||
| 
								 | 
							
								COMPILE_COMMANDS_TMPL_FILE="$OUTDIR/compile_commands.json.template"
							 | 
						||
| 
								 | 
							
								C_BUILTIN_FILE="$OUTDIR/builtins.h"
							 | 
						||
| 
								 | 
							
								CXX_BUILTIN_FILE="$OUTDIR/builtins.hpp"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								detect_toolchain "$@"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								discover_targets "$@" | tee "$TARGETS_TXT_FILE" | format_json > "$TARGETS_JSON_FILE"
							 | 
						||
| 
								 | 
							
								discover_includes "$@" | tee "$INCLUDE_DIRS_TMPFILE" | prefix_dir "$INCLUDE_PREFIX_REPLACEMENT" | format_json > "$INCLUDE_DIRS_TMPL_FILE"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# FIXME: handle different compilers and language standards
							 | 
						||
| 
								 | 
							
								"$CC" -xc -dM -E - < /dev/null > "$C_BUILTIN_FILE"
							 | 
						||
| 
								 | 
							
								"$CXX" -xc++ -dM -E - < /dev/null > "$CXX_BUILTIN_FILE"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if [ -n "$COMPILE_COMMANDS_JSON_FILE" ]; then
							 | 
						||
| 
								 | 
							
								  set -- 
							 | 
						||
| 
								 | 
							
								  while IFS= read -r line; do
							 | 
						||
| 
								 | 
							
								    set -- "$@" -e "s/$(sed_keyword "${line}")/$(sed_replacement "${INCLUDE_PREFIX_REPLACEMENT}${line}")/g"
							 | 
						||
| 
								 | 
							
								  done < "$INCLUDE_DIRS_TMPFILE"
							 | 
						||
| 
								 | 
							
								  set -- "$@" -e "s/$(sed_keyword "$WORKINGDIR")/$(sed_replacement "%OUTDIR%")/g"
							 | 
						||
| 
								 | 
							
								  if [ -n "$PROJECTDIR" ]; then
							 | 
						||
| 
								 | 
							
								    set -- "$@" -e "s/$(sed_keyword "$PROJECTDIR")/$(sed_replacement "%PROJECTDIR%")/g"
							 | 
						||
| 
								 | 
							
								  fi
							 | 
						||
| 
								 | 
							
								  set -- "$@" "$COMPILE_COMMANDS_JSON_FILE"
							 | 
						||
| 
								 | 
							
								  sed "$@" > "$COMPILE_COMMANDS_TMPL_FILE"
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set --
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if [ -n "$INCLUDE_PREFIX" ]; then
							 | 
						||
| 
								 | 
							
								  while IFS= read -r file; do
							 | 
						||
| 
								 | 
							
								    set -- "$@" "$file"
							 | 
						||
| 
								 | 
							
								  done < "$INCLUDE_DIRS_TMPFILE"
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cleanup
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exec tar cf - -C / "$@"
							 |