mirror of
				https://github.com/falk-werner/webfuse
				synced 2025-06-13 12:54:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			291 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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 / "$@"
 |