-
Notifications
You must be signed in to change notification settings - Fork 29.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
build: refactor pkg-config for shared libraries #1603
Changes from 1 commit
e7ce51e
38c6195
4365f34
d5990d1
43feb45
82e5af7
524de59
ac3df1b
bb6697f
1f99345
dea139a
0350f14
d8f4f6d
c5fed67
1e1b008
389a667
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -343,18 +343,31 @@ def b(value): | |
|
||
|
||
def pkg_config(pkg): | ||
cmd = os.popen('pkg-config --libs %s' % pkg, 'r') | ||
libs = cmd.readline().strip() | ||
ret = cmd.close() | ||
if (ret): return None | ||
pkg_config = os.environ.get('PKG_CONFIG', 'pkg-config') | ||
pkg_config_args = '--silence-errors' | ||
try: | ||
subprocess.check_output([pkg_config, '--version']) | ||
except OSError: | ||
# no pkg-config/pkgconf installed | ||
return (None, None) | ||
|
||
retval = () | ||
for flag in ['--libs', '--cflags']: | ||
try: | ||
val = subprocess.check_output([pkg_config, pkg_config_args, flag, pkg]) | ||
except subprocess.CalledProcessError: | ||
# most likely missing a .pc-file | ||
val = None | ||
|
||
cmd = os.popen('pkg-config --cflags %s' % pkg, 'r') | ||
cflags = cmd.readline().strip() | ||
ret = cmd.close() | ||
if (ret): return None | ||
retval += (val,) | ||
|
||
return (libs, cflags) | ||
return retval | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Style: two newlines after functions. |
||
|
||
def format_libraries(list): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Style: two newlines between functions. |
||
"""Returns string of space separated libraries""" | ||
list = list.replace(' ', '') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why are you stripping whitespace here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For consistency. Guess its cosmetics. |
||
set = list.split(',') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. good point. |
||
return ' '.join('-l{0}'.format(i) for i in set) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, was mixed for readability (based on feedback by bnoordhuis). I previously had format everywhere. |
||
|
||
def try_check_compiler(cc, lang): | ||
try: | ||
|
@@ -672,41 +685,25 @@ def configure_node(o): | |
o['variables']['node_target_type'] = 'static_library' | ||
|
||
|
||
def configure_libz(o): | ||
o['variables']['node_shared_zlib'] = b(options.shared_zlib) | ||
|
||
if options.shared_zlib: | ||
o['libraries'] += ['-l%s' % options.shared_zlib_libname] | ||
if options.shared_zlib_libpath: | ||
o['libraries'] += ['-L%s' % options.shared_zlib_libpath] | ||
if options.shared_zlib_includes: | ||
o['include_dirs'] += [options.shared_zlib_includes] | ||
|
||
|
||
def configure_http_parser(o): | ||
o['variables']['node_shared_http_parser'] = b(options.shared_http_parser) | ||
|
||
if options.shared_http_parser: | ||
o['libraries'] += ['-l%s' % options.shared_http_parser_libname] | ||
if options.shared_http_parser_libpath: | ||
o['libraries'] += ['-L%s' % options.shared_http_parser_libpath] | ||
if options.shared_http_parser_includes: | ||
o['include_dirs'] += [options.shared_http_parser_includes] | ||
|
||
|
||
def configure_libuv(o): | ||
o['variables']['node_shared_libuv'] = b(options.shared_libuv) | ||
|
||
if options.shared_libuv: | ||
o['libraries'] += ['-l%s' % options.shared_libuv_libname] | ||
if options.shared_libuv_libpath: | ||
o['libraries'] += ['-L%s' % options.shared_libuv_libpath] | ||
else: | ||
o['variables']['uv_library'] = 'static_library' | ||
|
||
if options.shared_libuv_includes: | ||
o['include_dirs'] += [options.shared_libuv_includes] | ||
|
||
def configure_library(lib, output): | ||
shared_lib = 'shared_%s' % lib | ||
output['variables']['node_%s' % shared_lib] = b(getattr(options, shared_lib)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just a note but you can write this as |
||
|
||
if getattr(options, shared_lib): | ||
default_lib = format_libraries(getattr(options, '%s_libname' % shared_lib)) | ||
default_libpath = getattr(options, '%s_libpath' % shared_lib) | ||
default_cflags = getattr(options, '%s_includes' % shared_lib) | ||
|
||
(pkg_libs, pkg_cflags) = pkg_config(lib) | ||
libs = pkg_libs if pkg_libs else default_lib | ||
cflags = pkg_cflags if pkg_cflags else default_cflags | ||
|
||
if libs: | ||
output['libraries'] += libs.split() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok. |
||
if cflags: | ||
output['include_dirs'] += cflags.split() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Apropos the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also, I'm not 100% confident it's correct to assign the result of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good point. Split is unsafe. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looking at it again, I don't think include_dirs is the right field, it should be cflags or cflags_cc. Probably the former. |
||
if default_libpath: | ||
output['libraries'] += ['-L%s' % default_libpath] | ||
|
||
def configure_v8(o): | ||
o['variables']['v8_enable_gdbjit'] = 1 if options.gdb else 0 | ||
|
@@ -718,26 +715,12 @@ def configure_v8(o): | |
def configure_openssl(o): | ||
o['variables']['node_use_openssl'] = b(not options.without_ssl) | ||
o['variables']['node_shared_openssl'] = b(options.shared_openssl) | ||
o['variables']['openssl_no_asm'] = ( | ||
1 if options.openssl_no_asm else 0) | ||
o['variables']['openssl_no_asm'] = 1 if options.openssl_no_asm else 0 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Any reason not to use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's not a boolean, its string true or false but the openssl build system requires 1 or 0. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, my bad. |
||
|
||
if options.without_ssl: | ||
return | ||
|
||
if options.shared_openssl: | ||
(libs, cflags) = pkg_config('openssl') or ('-lssl -lcrypto', '') | ||
|
||
libnames = options.shared_openssl_libname.split(',') | ||
o['libraries'] += ['-l%s' % s for s in libnames] | ||
|
||
if options.shared_openssl_libpath: | ||
o['libraries'] += ['-L%s' % options.shared_openssl_libpath] | ||
|
||
if options.shared_openssl_includes: | ||
o['include_dirs'] += [options.shared_openssl_includes] | ||
else: | ||
o['cflags'] += cflags.split() | ||
|
||
configure_library('openssl', o) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Style: two newlines. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How about a separate pr with a full pep8 on configure? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I personally don't care that much about pep8. As long as changes are not too incongruent with existing code, they're fine by me. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok; was just looking through the eslint PR and thought we could improve configure as well. |
||
|
||
def configure_fullystatic(o): | ||
if options.fully_static: | ||
|
@@ -1020,15 +1003,22 @@ if (options.dest_os): | |
flavor = GetFlavor(flavor_params) | ||
|
||
configure_node(output) | ||
configure_libz(output) | ||
configure_http_parser(output) | ||
configure_libuv(output) | ||
configure_library('zlib', output) | ||
configure_library('http_parser', output) | ||
configure_library('libuv', output) | ||
configure_v8(output) | ||
configure_openssl(output) | ||
configure_winsdk(output) | ||
configure_intl(output) | ||
configure_fullystatic(output) | ||
|
||
# remove duplicates from libraries | ||
unique_libraries = [] | ||
for library in output['libraries']: | ||
if library not in unique_libraries: | ||
unique_libraries.append(library) | ||
output['libraries'] = unique_libraries | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe just |
||
|
||
# variables should be a root level element, | ||
# move everything else to target_defaults | ||
variables = output['variables'] | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this explicit 'is pkg-config installed?' check necessary? Perhaps you can fold it into the subprocess call below? The net result - a
(None, None)
tuple - should be the same.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My thought was to avoid one call if
pkg-config
wasn't installed. I'll have a go at improving this.