diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml
index 33b6cc72c51755e11632c19f2dcba9db63500417..ce7e1ec6a52b719e40ee1d7b159652e9fbf647fe 100644
--- a/.github/workflows/artifacts.yml
+++ b/.github/workflows/artifacts.yml
@@ -26,11 +26,11 @@ jobs:
           add-apt-repository ppa:deadsnakes/ppa
           apt-get update
           apt-get install -y python3.8
-      - name: Update Hackage index
-        run: cabal v2-update
       - uses: actions/checkout@v2
       - name: Package project
-        run: python3.8 release.py
+        run: |
+          cabal v2-sdist --builddir=sdist Cabal cabal-install
+          python3.8 release.py --tarlib=sdist/sdist/Cabal-*.tar.gz --tarexe=sdist/sdist/cabal-install-*.tar.gz
       - uses: actions/upload-artifact@v2
         with:
           name: cabal-linux
@@ -61,11 +61,11 @@ jobs:
           echo "::add-path::/opt/ghc/8.6.5/bin"
           echo "::add-path::/opt/cabal/3.4/bin"
           echo "::add-path::$HOME/.cabal/bin"
-      - name: Update Hackage index
-        run: cabal v2-update
       - uses: actions/checkout@v2
       - name: Package project
-        run: python3 release.py
+        run: |
+          cabal v2-sdist --builddir=sdist Cabal cabal-install
+          python3 release.py --tarlib=sdist/sdist/Cabal-*.tar.gz --tarexe=sdist/sdist/cabal-install-*.tar.gz
       - uses: actions/upload-artifact@v2
         with:
           name: cabal-macos
@@ -91,12 +91,14 @@ jobs:
           ghc --version
           cabal --version
           cabal user-config init -a "http-transport: plain-http" -a "store-dir: C:\SR" -f -v3
-      - name: Update Hackage index
-        run: cabal v2-update
       - uses: actions/checkout@v2
       - name: Package project
-        run: python release.py
+        # We hardcode version 3 here to make first glob not overlap with cabal-install
+        run: |
+          cabal v2-sdist --builddir=sdist Cabal cabal-install
+          New-Item -Path "_build" -ItemType "directory"
+          python release.py --tarlib=$(Resolve-Path -Path sdist/sdist/Cabal-3.*.tar.gz) --tarexe=$(Resolve-Path -Path sdist/sdist/cabal-install-3.*.tar.gz)
       - uses: actions/upload-artifact@v2
         with:
-          name: cabal-macos
+          name: cabal-windows
           path: _build/artifacts/*
diff --git a/release.py b/release.py
index 04b69627d6f27dc644d114c20be08d8067f1edf0..46954deefb96abdd1f4ecface893b1bb08ac6035 100755
--- a/release.py
+++ b/release.py
@@ -35,10 +35,11 @@ Args = NamedTuple('Args', [
     ('compiler', Path),
     ('cabal', Path),
     ('indexstate', str),
-    ('rootdir', Path),
     ('builddir', Path),
     ('static', bool),
     ('ofdlocking', bool),
+    ('tarlib', Path),
+    ('tarexe', Path),
 ])
 
 # utils
@@ -110,7 +111,6 @@ def step_makedirs(args: Args):
     (args.builddir / 'bin').mkdir(parents=True, exist_ok=True)
     (args.builddir / 'cabal').mkdir(parents=True, exist_ok=True)
 
-# 57936384
 def step_config(args: Args):
     splitsections = ''
     if platform.system() == 'Linux':
@@ -123,6 +123,7 @@ def step_config(args: Args):
         if msysbin.is_dir():
             extraprogpath = extraprogpath + "," + str(msysbin)
 
+    # cabal.config
     config = dedent(f"""
         repository hackage.haskell.org
           url: http://hackage.haskell.org/
@@ -154,20 +155,34 @@ def step_config(args: Args):
     with open(args.builddir / 'cabal' / 'config', 'w') as f:
         f.write(config)
 
-    cabal_project_local =''
+    # cabal.project
+    cabal_project = dedent(f"""
+        packages: {args.tarlib}
+        packages: {args.tarexe}
+        tests: False
+        benchmarks: False
+        optimization: True
+
+        package Cabal
+          ghc-options: -fexpose-all-unfoldings -fspecialise-aggressively
+
+        package parsec
+          ghc-options: -fexpose-all-unfoldings
+    """)
+
     if args.static:
         # --enable-executable-static doesn't affect "non local" executables, as in v2-install project
-        cabal_project_local += dedent("""
+        cabal_project += dedent("""
             package cabal-install
                 executable-static: True
         """)
-    cabal_project_local += dedent(f"""
+    cabal_project += dedent(f"""
         package lukko
             flags: {'+' if args.ofdlocking else '-'}ofd_locking
     """)
 
-    with open(args.rootdir / 'cabal.project.release.local', 'w') as f:
-        f.write(cabal_project_local)
+    with open(args.builddir / 'cabal.project', 'w') as f:
+        f.write(cabal_project)
 
 def make_env(args: Args):
     env = {
@@ -197,7 +212,7 @@ def step_cabal_update(args: Args):
         'v2-update',
         '-v',
         f'--index-state={args.indexstate}',
-    ], check=True, env=env)
+    ], cwd=args.builddir, check=True, env=env)
 
 def step_cabal_install(args: Args):
     env = make_env(args)
@@ -206,9 +221,9 @@ def step_cabal_install(args: Args):
         'v2-install',
         '-v',
         'cabal-install:exe:cabal',
-        '--project-file=cabal.project.release',
+        '--project-file=cabal.project',
         f'--with-compiler={args.compiler}',
-    ], check=True, env=env)
+    ], cwd=args.builddir, check=True, env=env)
 
 def step_make_archive(args: Args):
     import tempfile
@@ -267,18 +282,21 @@ def main():
     parser.add_argument('-i', '--index-state', type=str, default=DEFAULT_INDEXSTATE, help='index state of Hackage to use')
     parser.add_argument('--enable-static-executable', '--disable-static-executable', dest='static', nargs=0, default=False, action=EnableDisable, help='Statically link cabal executable')
     parser.add_argument('--enable-ofd-locking', '--disable-ofd-locking', dest='ofd_locking', nargs=0, default=True, action=EnableDisable, help='OFD locking (lukko)')
+    parser.add_argument('--tarlib', dest='tarlib', required=True, metavar='LIBTAR', help='path to Cabal-version.tar.gz')
+    parser.add_argument('--tarexe', dest='tarexe', required=True, metavar='EXETAR', help='path to cabal-install-version.tar.gz')
+    parser.add_argument('--builddir', dest='builddir', type=str, default='_build', help='build directory')
 
     args = parser.parse_args()
 
-    rootdir = Path('.').resolve()
     args = Args(
         compiler   = Path(shutil.which(args.with_compiler)),
         cabal      = Path(shutil.which(args.with_cabal)),
         indexstate = args.index_state,
-        rootdir    = rootdir,
-        builddir   = rootdir.resolve() / '_build',
+        builddir   = Path(args.builddir).resolve(),
         static     = args.static,
-        ofdlocking = args.ofd_locking
+        ofdlocking = args.ofd_locking,
+        tarlib     = Path(args.tarlib).resolve(),
+        tarexe     = Path(args.tarexe).resolve()
     )
 
     print(dedent(f"""
@@ -288,6 +306,8 @@ def main():
         builddir:    {args.builddir}
         static:      {args.static}
         ofd-locking: {args.ofdlocking}
+        lib-tarball: {args.tarlib}
+        exe-tarball: {args.tarexe}
     """))
 
     # Check tools
diff --git a/templates/ci-artifacts.template.yml b/templates/ci-artifacts.template.yml
index 33b6cc72c51755e11632c19f2dcba9db63500417..ce7e1ec6a52b719e40ee1d7b159652e9fbf647fe 100644
--- a/templates/ci-artifacts.template.yml
+++ b/templates/ci-artifacts.template.yml
@@ -26,11 +26,11 @@ jobs:
           add-apt-repository ppa:deadsnakes/ppa
           apt-get update
           apt-get install -y python3.8
-      - name: Update Hackage index
-        run: cabal v2-update
       - uses: actions/checkout@v2
       - name: Package project
-        run: python3.8 release.py
+        run: |
+          cabal v2-sdist --builddir=sdist Cabal cabal-install
+          python3.8 release.py --tarlib=sdist/sdist/Cabal-*.tar.gz --tarexe=sdist/sdist/cabal-install-*.tar.gz
       - uses: actions/upload-artifact@v2
         with:
           name: cabal-linux
@@ -61,11 +61,11 @@ jobs:
           echo "::add-path::/opt/ghc/8.6.5/bin"
           echo "::add-path::/opt/cabal/3.4/bin"
           echo "::add-path::$HOME/.cabal/bin"
-      - name: Update Hackage index
-        run: cabal v2-update
       - uses: actions/checkout@v2
       - name: Package project
-        run: python3 release.py
+        run: |
+          cabal v2-sdist --builddir=sdist Cabal cabal-install
+          python3 release.py --tarlib=sdist/sdist/Cabal-*.tar.gz --tarexe=sdist/sdist/cabal-install-*.tar.gz
       - uses: actions/upload-artifact@v2
         with:
           name: cabal-macos
@@ -91,12 +91,14 @@ jobs:
           ghc --version
           cabal --version
           cabal user-config init -a "http-transport: plain-http" -a "store-dir: C:\SR" -f -v3
-      - name: Update Hackage index
-        run: cabal v2-update
       - uses: actions/checkout@v2
       - name: Package project
-        run: python release.py
+        # We hardcode version 3 here to make first glob not overlap with cabal-install
+        run: |
+          cabal v2-sdist --builddir=sdist Cabal cabal-install
+          New-Item -Path "_build" -ItemType "directory"
+          python release.py --tarlib=$(Resolve-Path -Path sdist/sdist/Cabal-3.*.tar.gz) --tarexe=$(Resolve-Path -Path sdist/sdist/cabal-install-3.*.tar.gz)
       - uses: actions/upload-artifact@v2
         with:
-          name: cabal-macos
+          name: cabal-windows
           path: _build/artifacts/*