summaryrefslogtreecommitdiff
path: root/configure
diff options
context:
space:
mode:
Diffstat (limited to 'configure')
-rwxr-xr-xconfigure222
1 files changed, 222 insertions, 0 deletions
diff --git a/configure b/configure
new file mode 100755
index 0000000..95a3a55
--- /dev/null
+++ b/configure
@@ -0,0 +1,222 @@
+#! /bin/sh
+#
+# This file is part of Owl.
+#
+# Copyright © 2019-2021 Sergey Bugaev <bugaevc@gmail.com>
+#
+# Owl is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published
+# by the Free Software Foundation, either version 3 of the License,
+# or (at your option) any later version.
+#
+# Owl is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Owl. If not, see <http://www.gnu.org/licenses/>.
+
+# These are the environment variables that
+# the user can set to affect this script's
+# output.
+CC="${CC:-cc}"
+CFLAGS="${CFLAGS:-}"
+LDFLAGS="${LDFLAGS:-}"
+if [ "$(uname)" = Darwin ]; then
+ LIBS=${LIBS:-"-l wayland-server -framework Cocoa -framework OpenGL -framework IOSurface"}
+else
+ LIBS=${LIBS:-"-l wayland-server -l gnustep-gui -l gnustep-base -l objc"}
+fi
+
+# Find the root directory based on where this
+# script itself is located. It is expected that
+# the current directory is the build directory.
+root=$(dirname $0)
+echo "Owl root directory detected as $root" >&2
+
+if [ "$root" = . ]; then
+ echo "Refusing an in-source build" >&2
+ echo "Please create a separate build directory" >&2
+ exit 1
+fi
+
+# Redirect this script's standard output to Makefile.
+# All the following commands inherit it implicitly.
+exec > Makefile
+
+echo "# This makefile was generated by running $0 $*"
+
+# Essentially forward-declare the default target.
+# Makefile uses the first target in the Makefile
+# as the default target to make; but we would like
+# to only write out the rule for the default target
+# once we visit all the individual targets, if
+# only to prepare the list of dependencies of the
+# default target. So define a default target named
+# "all" that forwards to a target named "app" that
+# we will define later near the end.
+echo "all: app"
+echo
+
+# Find the list of source code directories.
+dirs=$(ls "$root/Sources" | grep -Fv .)
+
+includes="-I Protocol/ -I $root/Sources/Protocol/"
+headers=""
+objs=""
+generated=""
+resources=""
+
+# Go over the Wayland protocols, generate header and source
+# files for them, and build those source files.
+mkdir -p Protocol
+for xml in $(ls "$root/Sources/Protocol" | grep -F .xml); do
+ header="Protocol/${xml%.xml}.h"
+ code="Protocol/${xml%.xml}.c"
+ obj="Protocol/${xml%.xml}.o"
+ headers="$headers $header"
+ objs="$objs $obj"
+ generated="$generated $header $code"
+ echo "$header: $root/Sources/Protocol/$xml"
+ echo ' '"wayland-scanner server-header $root/Sources/Protocol/$xml $header"
+ echo
+ echo "$code: $root/Sources/Protocol/$xml"
+ echo ' '"wayland-scanner private-code $root/Sources/Protocol/$xml $code"
+ echo
+ echo "$obj: $code"
+ echo ' '"$CC $code \$(CFLAGS) -c -o $obj"
+ echo
+done
+
+# Go over MIG definitions, generate header and source
+# files for them, and build those source files.
+if [ "$(uname)" = Darwin ]; then
+ mig_headers=$(echo "$root"/Sources/Protocol/*.h)
+ headers="$headers $mig_headers"
+ for defs in $(ls "$root/Sources/Protocol" | grep -F .defs); do
+ header="Protocol/${defs%.defs}.h"
+ code="Protocol/${defs%.defs}.c"
+ obj="Protocol/${defs%.defs}.o"
+ headers="$headers $header"
+ objs="$objs $obj"
+ generated="$generated $header $code"
+ echo "$header: $root/Sources/Protocol/$defs"
+ echo ' '"mig -sheader $header -server /dev/null -header /dev/null -user /dev/null $root/Sources/Protocol/$defs"
+ echo
+ echo "$code: $root/Sources/Protocol/$defs"
+ echo ' '"mig -server $code -header /dev/null -user /dev/null $root/Sources/Protocol/$defs"
+ echo
+ echo "$obj: $code $mig_headers"
+ echo ' '"$CC $code \$(CFLAGS) -I $root/Sources/Protocol -c -o $obj"
+ echo
+ done
+fi
+
+# Collect the include directories and headers. Also create the
+# corresponding directories right now, at configure time.
+for dir in "" $dirs; do
+ if [ "$dir" = Mach ] && [ "$(uname)" != Darwin ]; then
+ continue
+ fi
+ includes="$includes -I $root/Sources/$dir"
+ headers=$(echo "$headers" "$root/Sources/$dir"/*.h)
+ if [ ! -z $dir ]; then
+ mkdir -p $dir
+ fi
+done
+
+echo "INCLUDES = $includes"
+echo "HEADERS = $headers"
+echo
+echo "CFLAGS = $CFLAGS"
+echo "LDFLAGS = $LDFLAGS $LIBS"
+echo
+
+
+for dir in $dirs; do
+ # Skip Mach/ unless running on Darwin.
+ if [ "$dir" = Mach ] && [ "$(uname)" != Darwin ]; then
+ continue
+ fi
+ for file in $(ls "$root/Sources/$dir" | grep -F .m); do
+ obj=${file%.m}.o
+ objs="$objs $dir/$obj"
+ echo "$dir/$obj: $root/Sources/$dir/$file \$(HEADERS)"
+ echo ' '"$CC $root/Sources/$dir/$file \$(INCLUDES) \$(CFLAGS) -c -o $dir/$obj"
+ echo
+ done
+done
+
+echo "OBJS = $objs"
+
+if [ "$(uname)" != Darwin ]; then
+ contents_dir=""
+else
+ contents_dir="/Contents"
+fi
+
+mkdir -p Owl.app$contents_dir/Resources/English.lproj
+
+for res in keymap.xkb Owl.icns; do
+ resources="$resources Owl.app$contents_dir/Resources/$res"
+ echo "Owl.app$contents_dir/Resources/$res: $root/Resources/$res"
+ echo ' '"cp $root/Resources/$res Owl.app$contents_dir/Resources/$res"
+ echo
+done
+
+if [ "$(uname)" != Darwin ]; then
+ # Just copy the xibs over
+ for xib in $(ls "$root/Resources/English.lproj" | grep -F .xib); do
+ resources="$resources Owl.app/Resources/English.lproj/$xib"
+ echo "Owl.app/Resources/English.lproj/$xib: $root/Resources/English.lproj/$xib"
+ echo ' '"cp $root/Resources/English.lproj/$xib Owl.app/Resources/English.lproj/$xib"
+ echo
+ done
+else
+ for xib in $(ls "$root/Resources/English.lproj" | grep -F .xib); do
+ nib="${xib%.xib}.nib"
+ resources="$resources Owl.app$contents_dir/Resources/English.lproj/$nib"
+ echo "Owl.app$contents_dir/Resources/English.lproj/$nib: $root/Resources/English.lproj/$xib"
+ echo ' '"ibtool --compile Owl.app$contents_dir/Resources/English.lproj/$nib $root/Resources/English.lproj/$xib"
+ echo
+ done
+fi
+
+if [ "$(uname)" != Darwin ]; then
+ resources="$resources Owl.app/Resources/Info-gnustep.plist"
+ echo "Owl.app/Resources/Info-gnustep.plist: $root/Resources/Owl-Info-gnustep.plist"
+ echo ' '"cp $root/Resources/Owl-Info-gnustep.plist Owl.app/Resources/Info-gnustep.plist"
+ echo
+else
+ resources="$resources Owl.app$contents_dir/Info.plist"
+ echo "Owl.app$contents_dir/Info.plist: $root/Resources/Owl-Info.plist"
+ echo ' '"cp $root/Resources/Owl-Info.plist Owl.app$contents_dir/Info.plist"
+ echo
+fi
+
+if [ "$(uname)" != Darwin ]; then
+ platform_dir=""
+else
+ case "$(sw_vers -productName)" in
+ "Mac OS X" | macOS)
+ platform_dir="/MacOS"
+ ;;
+ *)
+ echo "Don't know where to put the executable on this platform" >&2
+ exit 1
+ ;;
+ esac
+fi
+
+mkdir -p "Owl.app$contents_dir$platform_dir"
+
+echo "Owl.app$contents_dir$platform_dir/Owl: \$(OBJS)"
+echo ' '"$CC \$(OBJS) \$(LDFLAGS) -o Owl.app$contents_dir$platform_dir/Owl"
+echo
+echo "app: Owl.app$contents_dir$platform_dir/Owl $resources"
+echo
+
+echo ".PHONY: clean all app"
+echo "clean:"
+echo ' '"rm -f \$(OBJS) $generated $resources"