15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2011 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""cups-config wrapper.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cups-config, at least on Ubuntu Lucid and Natty, dumps all
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cflags/ldflags/libs when passed the --libs argument.  gyp would like
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to keep these separate: cflags are only needed when compiling files
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that use cups directly, while libs are only needed on the final link
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)line.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)This can be dramatically simplified or maybe removed (depending on GN
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)requirements) when this is fixed:
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  https://bugs.launchpad.net/ubuntu/+source/cupsys/+bug/163704
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)is fixed.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import subprocess
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def usage():
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  print 'usage: %s {--api-version|--cflags|--ldflags|--libs|--libs-for-gn}' % \
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      sys.argv[0]
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def run_cups_config(mode):
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Run cups-config with all --cflags etc modes, parse out the mode we want,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  and return those flags as a list."""
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cups = subprocess.Popen(['cups-config', '--cflags', '--ldflags', '--libs'],
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          stdout=subprocess.PIPE)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  flags = cups.communicate()[0].strip()
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  flags_subset = []
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for flag in flags.split():
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flag_mode = None
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if flag.startswith('-l'):
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flag_mode = '--libs'
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif (flag.startswith('-L') or flag.startswith('-Wl,')):
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flag_mode = '--ldflags'
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif (flag.startswith('-I') or flag.startswith('-D')):
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flag_mode = '--cflags'
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Be conservative: for flags where we don't know which mode they
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # belong in, always include them.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if flag_mode is None or flag_mode == mode:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_subset.append(flag)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  # Note: cross build is confused by the option, and may trigger linker
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  # warning causing build error.
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if '-lgnutls' in flags_subset:
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    flags_subset.remove('-lgnutls')
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return flags_subset
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main():
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if len(sys.argv) != 2:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage()
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mode = sys.argv[1]
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if mode == '--api-version':
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    subprocess.call(['cups-config', '--api-version'])
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return 0
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  # All other modes get the flags.
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if mode not in ('--cflags', '--libs', '--libs-for-gn', '--ldflags'):
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usage()
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if mode == '--libs-for-gn':
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    gn_libs_output = True
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    mode = '--libs'
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  else:
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    gn_libs_output = False
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  flags = run_cups_config(mode)
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if gn_libs_output:
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    # Strip "-l" from beginning of libs, quote, and surround in [ ].
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    print '['
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for lib in flags:
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if lib[:2] == "-l":
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        print '"%s", ' % lib[2:]
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    print ']'
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  else:
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    print ' '.join(flags)
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.exit(main())
97