MESA_UTIL_GENERATED_FILES = \
        format_srgb.c \
-       format/u_format_table.c
+       format/u_format_table.c \
+       format/u_format_pack.h
 
 XMLCONFIG_FILES := \
        xmlconfig.c \
 
     command = python_cmd + ' $SCRIPT > $TARGET'
 )
 
+env.CodeGenerate(
+    target = 'format/u_format_pack.h',
+    script = 'format/u_format_table.py',
+    source = ['format/u_format.csv'],
+    command = python_cmd + ' $SCRIPT $SOURCE --header > $TARGET'
+)
+
+env.Depends('format/u_format_pack.h', [
+    'format/u_format_parse.py',
+    'format/u_format_pack.py',
+])
+
 env.CodeGenerate(
     target = 'format/u_format_table.c',
     script = 'format/u_format_table.py',
 
   'u_format_zs.c',
 ]
 
+u_format_pack_h = custom_target(
+  'u_format_pack.h',
+  input : ['u_format_table.py', 'u_format.csv'],
+  output : 'u_format_pack.h',
+  command : [prog_python, '@INPUT@', '--header'],
+  depend_files : files('u_format_pack.py', 'u_format_parse.py'),
+  capture : true,
+)
+
 u_format_table_c = custom_target(
   'u_format_table.c',
   input : ['u_format_table.py', 'u_format.csv'],
 
 libmesa_format = static_library(
   'mesa_format',
-  [files_mesa_format, u_format_table_c],
+  [files_mesa_format, u_format_table_c, u_format_pack_h],
   include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
   dependencies : dep_m,
   c_args : [c_msvc_compat_args],
 
 else:
     integer_types = (int, )
 
-
 def inv_swizzles(swizzles):
     '''Return an array[4] of inverse swizzle terms'''
     '''Only pick the first matching value to avoid l8 getting blue and i8 getting alpha'''
 
     name = format.short_name()
 
-    print('static inline void')
+    print('void')
     print('util_format_%s_pack_%s(uint8_t *dst_row, unsigned dst_stride, const %s *src_row, unsigned src_stride, unsigned width, unsigned height)' % (name, src_suffix, src_native_type))
     print('{')
+
+    print('void util_format_%s_pack_%s(uint8_t *dst_row, unsigned dst_stride, const %s *src_row, unsigned src_stride, unsigned width, unsigned height);' % (name, src_suffix, src_native_type), file=sys.stdout2)
     
     if is_format_supported(format):
         print('   unsigned x, y;')
     print('#include "util/format_srgb.h"')
     print('#include "u_format_yuv.h"')
     print('#include "u_format_zs.h"')
+    print('#include "u_format_pack.h"')
     print()
 
     for format in formats:
 
                 generate_format_unpack(format, channel, native_type, suffix)
                 generate_format_pack(format, channel, native_type, suffix)
-
 
 '''
 
 
-import sys
+import sys, os
 
 from u_format_parse import *
 import u_format_pack
         return False
     return True
 
-def write_format_table(formats):
-    print('/* This file is autogenerated by u_format_table.py from u_format.csv. Do not edit directly. */')
-    print()
+def write_format_table_header(file):
+    print('/* This file is autogenerated by u_format_table.py from u_format.csv. Do not edit directly. */', file=file)
+    print(file=file)
     # This will print the copyright message on the top of this file
-    print(CopyRight.strip())
-    print()
-    print('#include "u_format.h"')
+    print(CopyRight.strip(), file=file)
+    print(file=file)
+    print('#include "util/format/u_format.h"', file=file)
+
+def write_format_table(formats):
+    write_format_table_header(sys.stdout)
     print('#include "u_format_bptc.h"')
     print('#include "u_format_s3tc.h"')
     print('#include "u_format_rgtc.h"')
     print('#include "u_format_latc.h"')
     print('#include "u_format_etc.h"')
     print()
+
+    write_format_table_header(sys.stdout2)
     
     u_format_pack.generate(formats)
     
     generate_table_getter("unpack_")
 
 def main():
-
     formats = []
+
+    sys.stdout2 = open(os.devnull, "w")
+
     for arg in sys.argv[1:]:
+        if arg == '--header':
+            sys.stdout2 = sys.stdout
+            sys.stdout = open(os.devnull, "w")
+            continue
+
         formats.extend(parse(arg))
-    write_format_table(formats)
 
+    write_format_table(formats)
 
 if __name__ == '__main__':
     main()