diff --git a/recipes/mesa/llvm-config b/bin/x86_64-unknown-redox-llvm-config
similarity index 97%
rename from recipes/mesa/llvm-config
rename to bin/x86_64-unknown-redox-llvm-config
index 20cc72a92cd528dbfc1bb29001c4134163063d5c..fdb2a68f5db6d83440757505eee805455fe3f5e2 100755
--- a/recipes/mesa/llvm-config
+++ b/bin/x86_64-unknown-redox-llvm-config
@@ -1,11 +1,5 @@
 #!/usr/bin/env python3
 
-import sys
-import os
-
-args = sys.argv[1:]
-prefix = os.path.realpath(os.path.dirname(os.path.abspath(sys.argv[0])) + "/sysroot")
-
 # The values here are copied from the output of llvm-config running under Redox.
 # This is a hack, and should be replaced if possible.
 
@@ -80,9 +74,29 @@ components = {
     "x86utils": "-lLLVMX86Utils -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle",
 }
 
-if args == []:
+import os
+import sys
+
+def fail(message):
+    print("redox llvm-config failure", file=sys.stderr)
+    print(message, file=sys.stderr)
     sys.exit(1)
-if args == ["--version"]:
+
+prefix = os.environ["COOKBOOK_RECIPE"] + "/sysroot"
+
+args = []
+link_static = False
+for arg in sys.argv[1:]:
+    if arg == "--link-static":
+        link_static = True
+    elif arg == "--link-shared":
+        fail("shared linking disabled")
+    else:
+        args.append(arg)
+
+if args == []:
+    fail("no arguments")
+elif args == ["--version"]:
     print("8.0.0svn")
 elif args == ["--cppflags"]:
     print("-I" + prefix + "/include -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS")
@@ -110,5 +124,4 @@ elif args[0] == "--libs":
 elif args[0] == "--shared-mode":
     print("static")
 else:
-    print("\n".join(args), file=sys.stderr)
-    sys.exit(1)
+    fail("unknown arguments: " + " ".join(args))
diff --git a/config.sh b/config.sh
index fb4c4eeb14c2c9efa56ff6cbe9cc576c54a70cb3..087774eb6643b9b18f1f1710fc6701f22f522f1e 100755
--- a/config.sh
+++ b/config.sh
@@ -15,16 +15,16 @@ REPO="$ROOT/repo/$TARGET"
 export PATH="${ROOT}/bin:$PATH"
 export XARGO_HOME="${ROOT}/xargo"
 
-export AR="${HOST}-ar"
+export AR="${HOST}-gcc-ar"
 export AS="${HOST}-as"
 export CC="${HOST}-gcc"
 export CXX="${HOST}-g++"
 export LD="${HOST}-ld"
-export NM="${HOST}-nm"
+export NM="${HOST}-gcc-nm"
 export OBJCOPY="${HOST}-objcopy"
 export OBJDUMP="${HOST}-objdump"
 export PKG_CONFIG="${HOST}-pkg-config"
-export RANLIB="${HOST}-ranlib"
+export RANLIB="${HOST}-gcc-ranlib"
 export READELF="${HOST}-readelf"
 export STRIP="${HOST}-strip"
 
diff --git a/recipes/gears/recipe.sh b/recipes/gears/recipe.sh
index 6d0a6e1331f9504aefa4c5bd6aef7d2d470fab39..d5c268fe92755b3e694d9b5201e1e431e8f2be09 100644
--- a/recipes/gears/recipe.sh
+++ b/recipes/gears/recipe.sh
@@ -1,4 +1,4 @@
-BUILD_DEPENDS=(liborbital mesa mesa_glu)
+BUILD_DEPENDS=(liborbital llvm mesa mesa_glu)
 
 function recipe_version {
     printf "1.0.0"
@@ -19,7 +19,7 @@ function recipe_prepare {
 function recipe_build {
     sysroot="$(realpath ../sysroot)"
     set -x
-    "${CXX}" -I "$sysroot/include" -L "$sysroot/lib" gears.c -o gears -lorbital -lOSMesa -lGLU -lglapi -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -lm
+    "${CXX}" -I "$sysroot/include" -L "$sysroot/lib" gears.c -o gears -lorbital $("${PKG_CONFIG}" --libs glu)
     set +x
     skip=1
 }
diff --git a/recipes/llvm/recipe.sh b/recipes/llvm/recipe.sh
index a2c285b003137e549ff90c0648eb48dc14448141..cc2516257abede2a7698be1e99681c22b3208ca3 100644
--- a/recipes/llvm/recipe.sh
+++ b/recipes/llvm/recipe.sh
@@ -22,38 +22,42 @@ function recipe_build {
     source="$(realpath ../source)"
     sysroot="$(realpath ../sysroot)"
     CMAKE_ARGS=(
-        -Wno-dev
+        -DCMAKE_AR="$(which "${AR}")"
+        -DCMAKE_BUILD_TYPE=Release
         -DCMAKE_CROSSCOMPILING=True
-        -DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$native"
+        -DCMAKE_CXX_FLAGS="--std=gnu++11 -Wl,--whole-archive -lpthread -Wl,--no-whole-archive"
+        -DCMAKE_RANLIB="$(which "${RANLIB}")"
         -DCMAKE_INSTALL_PREFIX="/"
-        -DLLVM_DEFAULT_TARGET_TRIPLE="$HOST"
-        -DLLVM_TARGET_ARCH="$ARCH"
-        -DLLVM_TARGETS_TO_BUILD=X86
         -DCMAKE_SYSTEM_NAME=Generic
-        -DPYTHON_EXECUTABLE="/usr/bin/python2"
-        #-DLLVM_TABLEGEN="/usr/bin/llvm-tblgen-8"
-        -DUNIX=1
-        -DLLVM_ENABLE_THREADS=On
+        -DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$native"
         -DLLVM_BUILD_BENCHMARKS=Off
-        -DLLVM_INCLUDE_BENCHMARKS=Off
         -DLLVM_BUILD_EXAMPLES=Off
-        -DLLVM_INCLUDE_EXAMPLES=Off
         -DLLVM_BUILD_TESTS=Off
-        -DLLVM_INCLUDE_TESTS=Off
         -DLLVM_BUILD_UTILS=Off
+        -DLLVM_DEFAULT_TARGET_TRIPLE="$HOST"
+        -DLLVM_ENABLE_LTO=On
+        -DLLVM_ENABLE_THREADS=On
+        -DLLVM_INCLUDE_BENCHMARKS=Off
+        -DLLVM_INCLUDE_EXAMPLES=Off
+        -DLLVM_INCLUDE_TESTS=Off
         -DLLVM_INCLUDE_UTILS=Off
-        -target="$HOST"
-        -I"$sysroot/include"
-        -DCMAKE_CXX_FLAGS='--std=gnu++11 -Wl,--whole-archive -lpthread -Wl,--no-whole-archive'
-        -DLLVM_TOOL_LTO_BUILD=Off
-        -DLLVM_TOOL_LLVM_PROFDATA_BUILD=Off
-        -DLLVM_TOOL_LLI_BUILD=Off
-        -DLLVM_TOOL_RDOBJ_BUILD=Off
+        -DLLVM_OPTIMIZED_TABLEGEN=On
+        #-DLLVM_TABLEGEN="/usr/bin/llvm-tblgen-8"
+        -DLLVM_TARGET_ARCH="$ARCH"
+        -DLLVM_TARGETS_TO_BUILD=X86
         -DLLVM_TOOL_LLVM_COV_BUILD=Off
-        -DLLVM_TOOL_LLVM_XRAY_BUILD=Off
-        -DLLVM_TOOL_LLVM_LTO2_BUILD=Off
         -DLLVM_TOOL_LLVM_LTO_BUILD=Off
+        -DLLVM_TOOL_LLVM_LTO2_BUILD=Off
+        -DLLVM_TOOL_LLVM_PROFDATA_BUILD=Off
         -DLLVM_TOOL_LLVM_RTDYLD_BUILD=Off
+        -DLLVM_TOOL_LLVM_XRAY_BUILD=Off
+        -DLLVM_TOOL_LLI_BUILD=Off
+        -DLLVM_TOOL_LTO_BUILD=Off
+        -DPYTHON_EXECUTABLE="/usr/bin/python2"
+        -DUNIX=1
+        -target="$HOST"
+        -I"$sysroot/include"
+        -Wno-dev
     )
     cmake "${CMAKE_ARGS[@]}" "$source"
     make -j$(nproc)
@@ -73,6 +77,6 @@ function recipe_clean {
 function recipe_stage {
     dest="$(realpath $1)"
     make DESTDIR="$dest" install
-    find "$dest"/{bin,lib} -exec $STRIP {} ';' 2> /dev/null
+    find "$dest"/bin -exec $STRIP {} ';' 2> /dev/null
     skip=1
 }
diff --git a/recipes/mesa/recipe.sh b/recipes/mesa/recipe.sh
index 5161b09903ca651f2d6d8170b31dcb8eb5080316..347551bdaac7a2afe1d31a73382e91978cfdd9d0 100644
--- a/recipes/mesa/recipe.sh
+++ b/recipes/mesa/recipe.sh
@@ -19,8 +19,8 @@ function recipe_build {
     export CPPFLAGS="-I$sysroot/include -DHAVE_PTHREAD=1"
     export LDFLAGS="-L$sysroot/lib"
     export LIBS="-Wl,--whole-archive -lpthread -Wl,--no-whole-archive"
-    export LLVM_CONFIG="$(realpath ../llvm-config)"
-    NOCONFIGURE=1 ./autogen.sh
+    export LLVM_CONFIG="x86_64-unknown-redox-llvm-config"
+    #NOCONFIGURE=1 ./autogen.sh
     ./configure \
         --host="${HOST}" \
         --prefix=/ \
@@ -50,12 +50,7 @@ function recipe_clean {
 }
 
 function recipe_stage {
-    sysroot="$(realpath ../sysroot)"
-    export CFLAGS="-I$sysroot/include -DHAVE_PTHREAD=1"
-    export CPPFLAGS="-I$sysroot/include -DHAVE_PTHREAD=1"
-    export LDFLAGS="-L$sysroot/lib"
-    export LIBS="-Wl,--whole-archive -lpthread -Wl,--no-whole-archive"
-    export LLVM_CONFIG="$(realpath ../llvm-config)"
+    export LLVM_CONFIG="x86_64-unknown-redox-llvm-config"
     dest="$(realpath $1)"
     make DESTDIR="$dest" install
     rm -f "$dest/lib/"*.la
diff --git a/recipes/rust/config.toml b/recipes/rust/config.toml
index e4b39ee1c06fda24f3f2bf4928c651fc7851e648..fe2b8ec4a7791fce0aa9dbe7929a040dc246dd1d 100644
--- a/recipes/rust/config.toml
+++ b/recipes/rust/config.toml
@@ -19,5 +19,5 @@ cc = "x86_64-unknown-redox-gcc"
 cxx = "x86_64-unknown-redox-g++"
 ar = "x86_64-unknown-redox-ar"
 linker = "x86_64-unknown-redox-gcc"
-llvm-config = "../llvm-config"
+llvm-config = "x86_64-unknown-redox-llvm-config"
 crt-static = true
diff --git a/recipes/rust/llvm-config b/recipes/rust/llvm-config
deleted file mode 100755
index e387d06602961590d98703a957ae096d05c334c6..0000000000000000000000000000000000000000
--- a/recipes/rust/llvm-config
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import os
-
-args = sys.argv[1:]
-prefix = os.path.realpath(os.path.dirname(os.path.abspath(sys.argv[0])) + "/sysroot")
-
-# The values here are copied from the output of llvm-config running under Redox.
-# This is a hack, and should be replaced if possible.
-
-if args == ["--version"]:
-    print("8.0.0svn")
-elif args == ["--cxxflags"]:
-    print("-I" + prefix + "/include --std=gnu++11 -fPIC -Werror=date-time -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-comment -g -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS")
-elif args == ["--components"]:
-    print(
-        "aggressiveinstcombine all all-targets analysis asmparser asmprinter binaryformat bitreader"
-        + " bitwriter codegen core coroutines coverage debuginfocodeview debuginfodwarf debuginfomsf"
-        + " debuginfopdb demangle dlltooldriver engine executionengine fuzzmutate globalisel instcombine"
-        + " instrumentation interpreter ipo irreader libdriver lineeditor linker lto mc mcdisassembler"
-        + " mcjit mcparser mirparser native nativecodegen objcarcopts object objectyaml option orcjit"
-        + " passes profiledata runtimedyld scalaropts selectiondag support symbolize tablegen target"
-        + " transformutils vectorize windowsmanifest x86 x86asmparser x86asmprinter x86codegen x86desc"
-        + " x86disassembler x86info x86utils")
-elif args == ["--link-static", "--libs", "asmparser", "bitreader", "bitwriter", "instrumentation", "interpreter", "ipo", "linker", "lto", "mcjit", "x86"]:
-    print(
-        "-lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMGlobalISel -lLLVMSelectionDAG"
-        + " -lLLVMAsmPrinter -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter"
-        + " -lLLVMX86Utils -lLLVMMCJIT -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts -lLLVMipo -lLLVMVectorize"
-        + " -lLLVMLinker -lLLVMIRReader -lLLVMInterpreter -lLLVMExecutionEngine -lLLVMRuntimeDyld"
-        + " -lLLVMCodeGen -lLLVMTarget -lLLVMScalarOpts -lLLVMInstCombine -lLLVMAggressiveInstCombine"
-        + " -lLLVMInstrumentation -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData"
-        + " -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMBitReader"
-        + " -lLLVMAsmParser -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle"
-        + " -lstdc++ -lgcc"
-    )
-    # FIXME last two -l are a hack
-elif args == ["--link-static", "--ldflags"]:
-    print("-L" + prefix + "/lib");
-else:
-    sys.exit(1)