Commit Graph

82 Commits

Author SHA1 Message Date
Aaron Small b5e30fd8e0 Fix qt4 tool location detection, which may result in incorrectly picking
up qt5 tools when using the qt4 module.
2017-03-27 21:59:28 +03:00
Nirbheek Chauhan 6946029d16 Fix regen when using pkg-deps when there's no pkg-config
Without this, we'd fail with a "no attribute modversion" error.
2017-03-25 21:07:22 +02:00
Thibault Saunier 650ad9dc88 Never accept a directory as being an executable program
Otherwise we will possibly use a subfolder with the name an
executable we are looking for as an executable
2017-03-25 17:55:15 +02:00
Nirbheek Chauhan 2478bb144d rpm: We no longer provide the full path to a library
Ever since we changed how we do library searching, the full path to the
library has not been available under `.fullpath`. This has been broken
for at least a year...
2017-02-19 03:50:43 +05:30
Nirbheek Chauhan 7d1cee9d84 dependencies: Remove useless and verbose dict.get() call
We already ensured that the cross-info binaries section has pkg-config
in the if check above.
2017-02-19 03:50:43 +05:30
Nirbheek Chauhan 7e805a019a find_program: Fix implementation of .path()
And actually test that prog.path() works. The earlier test was just
running the command without checking if it succeeded.

Also make everything use prog.get_command() or get_path() instead of
accessing the internal member prog.fullpath directly.
2017-02-19 03:49:31 +05:30
Nirbheek Chauhan 18bce47691 find_program: Correctly use scripts found in PATH
We also need to check whether the program found in PATH can be executed
directly by Windows or if we need to figure out what the interpreter is
and add it to the list.

Also add `msc` to the list of extensions that can be executed natively

Includes a project test and a unit test for this and all expected
behaviours on Windows.
2017-02-18 02:38:54 +05:30
Jussi Pakkanen 1f2f010765 Detect Boost libraries primarily with the C++ compiler's find_library. 2017-02-13 11:45:56 +02:00
Nirbheek Chauhan 781e69094a dependencies: Distinguish native/cross while caching
Closes https://github.com/mesonbuild/meson/issues/1366
2017-02-07 20:55:24 +02:00
Jussi Pakkanen c63b92f8ef Check cross-pkg-config's viability with ExternalProgram. Closes #1329. 2017-01-28 19:06:09 +02:00
Jussi Pakkanen 4a08841331 Merge pull request #1335 from tp-m/test-custom-target-used-in-test-cmd
tests: check custom target output is created before being used in a t…
2017-01-28 19:05:54 +02:00
Nirbheek Chauhan 2bb58c909f Use CompilerArgs for generation of compile commands
At the same time, also fix the order in which compile arguments are
added. Detailed comments have been added concerning the priority and
order of the arguments.

Also adds a unit test and an integration test for the same.
2017-01-28 05:09:51 +05:30
Nirbheek Chauhan 534ee8baa8 find_program: Translate 'python3' to sys.executable on Windows
While reading shebangs, when we detect an attempt to run 'python3', use
sys.executable instead. For example:

  #!/usr/bin/python3
  #!python3
  #!/usr/bin/env python3
2017-01-28 02:02:06 +05:30
Jussi Pakkanen 4c9c14121f Merge pull request #1302 from centricular/install-mode
Support file perms for install_data and install_subdir
2017-01-23 22:03:14 +02:00
Jussi Pakkanen 8e9f0c954c Gracefully fallback when cross pkg-config can not be found for an optional dependency. 2017-01-23 21:02:39 +02:00
Nirbheek Chauhan 905ff35611 wx deps: Always set modversion, even if dep not found
Fixes:

Traceback (most recent call last):
  File "mesonbuild/mesonmain.py", line 295, in run
    app.generate()
  File "mesonbuild/mesonmain.py", line 177, in generate
    intr.run()
  File "mesonbuild/interpreter.py", line 2444, in run
    super().run()
  File "mesonbuild/interpreterbase.py", line 124, in run
    self.evaluate_codeblock(self.ast, start=1)
  File "mesonbuild/interpreterbase.py", line 145, in evaluate_codeblock
    raise e
  File "mesonbuild/interpreterbase.py", line 139, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "mesonbuild/interpreterbase.py", line 152, in evaluate_statement
    return self.assignment(cur)
  File "mesonbuild/interpreterbase.py", line 546, in assignment
    value = self.evaluate_statement(node.value)
  File "mesonbuild/interpreterbase.py", line 150, in evaluate_statement
    return self.function_call(cur)
  File "mesonbuild/interpreterbase.py", line 371, in function_call
    return self.funcs[func_name](node, self.flatten(posargs), kwargs)
  File "mesonbuild/interpreter.py", line 1876, in func_dependency
    found = cached_dep.get_version()
  File "mesonbuild/dependencies.py", line 369, in get_version
    return self.modversion
AttributeError: 'WxDependency' object has no attribute 'modversion'
ninja: error: rebuilding 'build.ninja': subcommand failed
2017-01-24 00:19:25 +05:30
Jussi Pakkanen 577a9b40d5 Merge pull request #1312 from centricular/print-pkgdep-error-osx
Fix pkg-config error handling on OS X
2017-01-18 21:27:52 +02:00
Mike Sinkovsky 969be1f679 cleanup: Remove redundant parentheses 2017-01-18 21:22:47 +02:00
Mike Sinkovsky 1d177fb127 cleanup: Unused local variables 2017-01-18 21:22:47 +02:00
Nirbheek Chauhan 705612f7cf pkgdep: Print found message after setting cargs/libs
Fetching cflags and libs can also fail if, for instance, the pkg-config
file for a dependency needed by this package isn't found. Without this,
we will print "Found: YES" and then "Found: NO".
2017-01-17 15:39:02 +05:30
Nirbheek Chauhan 2d31851d3b Print pkg-config error when framework dep isn't found
Without this, macOS users can't figure out why a particular dependency
wasn't found because the pkg-config error message gets masked by the
fresh and useless DependencyException.
2017-01-17 15:39:01 +05:30
Nirbheek Chauhan e441a74282 Derive all exceptions correctly from base exceptions
Don't need to define __init__ and manually call the parent init. Doing
so messes up the error message you get by doing str(exception) because
it includes the current class name in it repeatedly.
2017-01-17 15:39:01 +05:30
Mike Sinkovsky 5b626ab4cb style: [E1**] Indentation 2017-01-11 12:33:27 -05:00
Mike Sinkovsky 77515ee541 style: [E303] too many blank lines (2) 2017-01-11 12:33:27 -05:00
Mike Sinkovsky 84902cb93a style: [E301] expected 1 blank line, found 0 2017-01-11 12:33:27 -05:00
Mike Sinkovsky e9a891fe25 style: [E502] the backslash is redundant between brackets 2017-01-11 12:33:27 -05:00
Igor Gnatenko 969dc7e995 style: fix E124 violations
E124: closing bracket does not match visual indentation

Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
2017-01-01 12:02:05 -05:00
Igor Gnatenko ef608f217d style: fix E222 violations
E222: multiple spaces after operator

Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
2017-01-01 12:02:05 -05:00
Jussi Pakkanen b55235dfbd Fix space before :. 2016-12-31 16:28:15 +02:00
Nirbheek Chauhan a97291dc6d Add get_version() method to all dependencies
We unconditionally check the version of all dependencies, so without
this regen will fail if you use that dependency.
2016-12-23 19:07:45 +02:00
Nirbheek Chauhan de0b02ee2d Store pkg-config path on the instance too
We were storing the pkg-config path on the class as a static variable --
PkgConfigDependency.pkgbin. When we regenerate via Ninja, the found-deps
are all cached in a pickled coredata, so if you have a statement that
does dep.get_pkgconfig_variable(), it will raise the following exception
because the static class variables are per-meson-invocation.

To fix this, we store the pkg-config binary as both a class variable and
an instance variable.

Traceback (most recent call last):
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/mesonmain.py", line 289, in run
    app.generate()
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/mesonmain.py", line 177, in generate
    intr.run()
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreter.py", line 2215, in run
    super().run()
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 124, in run
    self.evaluate_codeblock(self.ast, start=1)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 145, in evaluate_codeblock
    raise e
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 139, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 150, in evaluate_statement
    return self.function_call(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 371, in function_call
    return self.funcs[func_name](node, self.flatten(posargs), kwargs)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 47, in wrapped
    return f(self, node, args, kwargs)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreter.py", line 2035, in func_subdir
    self.evaluate_codeblock(codeblock)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 145, in evaluate_codeblock
    raise e
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 139, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 160, in evaluate_statement
    return self.evaluate_if(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 213, in evaluate_if
    self.evaluate_codeblock(i.block)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 145, in evaluate_codeblock
    raise e
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 139, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 160, in evaluate_statement
    return self.evaluate_if(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 213, in evaluate_if
    self.evaluate_codeblock(i.block)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 145, in evaluate_codeblock
    raise e
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 139, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 182, in evaluate_statement
    return self.evaluate_plusassign(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 333, in evaluate_plusassign
    addition = self.evaluate_statement(node.value)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 166, in evaluate_statement
    return self.evaluate_arraystatement(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 193, in evaluate_arraystatement
    (arguments, kwargs) = self.reduce_arguments(cur.args)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 515, in reduce_arguments
    reduced_pos = [self.evaluate_statement(arg) for arg in args.arguments]
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 515, in <listcomp>
    reduced_pos = [self.evaluate_statement(arg) for arg in args.arguments]
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 154, in evaluate_statement
    return self.method_call(cur)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreterbase.py", line 399, in method_call
    return obj.method_call(method_name, self.flatten(args), kwargs)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/interpreter.py", line 982, in method_call
    value = fn(state, args, kwargs)
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/modules/gnome.py", line 499, in generate_gir
    girdir = dep.get_pkgconfig_variable("girdir")
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/dependencies.py", line 219, in get_pkgconfig_variable
    ret, out = self._call_pkgbin(['--variable=' + variable_name, self.name])
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/dependencies.py", line 184, in _call_pkgbin
    p, out = Popen_safe([PkgConfigDependency.pkgbin] + args, env=os.environ)[0:2]
  File "/home/nirbheek/projects/repositories/github/meson.git/mesonbuild/mesonlib.py", line 392, in Popen_safe
    stderr=stderr, **kwargs)
  File "/usr/lib64/python3.5/subprocess.py", line 947, in __init__
    restore_signals, start_new_session)
  File "/usr/lib64/python3.5/subprocess.py", line 1474, in _execute_child
    executable = os.fsencode(executable)
  File "/usr/lib64/python3.5/os.py", line 862, in fsencode
    raise TypeError("expect bytes or str, not %s" % type(filename).__name__)
TypeError: expect bytes or str, not NoneType
FAILED: build.ninja
'/usr/bin/python3' '/home/nirbheek/projects/repositories/github/meson.git/meson.py' --internal regenerate '/home/nirbheek/projects/repositories/gst/gstreamer' '/home/nirbheek/projects/repositories/gst/gstreamer/build' --backend ninja
ninja: error: rebuilding 'build.ninja': subcommand failed
2016-12-21 21:14:45 +02:00
Jussi Pakkanen a2528a8816 Merge pull request #1233 from mesonbuild/wip/ignatenko/code-style
Trivial cleanups in code
2016-12-21 00:09:44 +02:00
Nirbheek Chauhan 9bc07a0941 Fix several more lint errors
Found by Igor Gnatenko

************* Module mesonbuild.interpreter
E:1232,33: No value for argument 'interp' in constructor call (no-value-for-parameter)
************* Module mesonbuild.dependencies
E: 68, 4: An attribute defined in mesonbuild.dependencies line 39 hides this method (method-hidden)
************* Module mesonbuild.environment
E: 26, 0: class already defined line 19 (function-redefined)
E: 68,18: Undefined variable 'InterpreterException' (undefined-variable)
E:641,39: Undefined variable 'want_cross' (undefined-variable)
E:850,94: Undefined variable 'varname' (undefined-variable)
E:854,94: Undefined variable 'varname' (undefined-variable)
E:860,102: Undefined variable 'varname' (undefined-variable)
E:863,94: Undefined variable 'varname' (undefined-variable)
************* Module mesonbuild.modules.gnome
E:438,26: Undefined variable 'compilers' (undefined-variable)
2016-12-20 00:07:00 +02:00
Igor Gnatenko 139e020ede tree-wide: use proper 'not in' notation
Let's be more pythonic and 'not is' seems really weird.

Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
2016-12-19 21:48:35 +01:00
Nirbheek Chauhan b4cead2763 find_program: Don't leak mutable array in get_command()
In several places in the gnome module, we are getting an array from this
and directly appending to it which changes the original command array
ever since we started caching the find_program results.

We urgently need to move to immutable types for all object properties.

Reported by Alexandor Larsson on IRC.
2016-12-19 21:37:27 +02:00
Igor Gnatenko 8268eb4959 tree-wide: remove unused imports
./setup.py:17:1: F401 'os' imported but unused
import os
^
./setup.py:37:1: F401 'stat.ST_MODE' imported but unused
from stat import ST_MODE
^
./run_tests.py:17:1: F401 'os' imported but unused
import subprocess, sys, os
^
./run_tests.py:18:1: F401 'shutil' imported but unused
import shutil
^
./run_unittests.py:23:1: F401 'mesonbuild.dependencies.Qt5Dependency' imported but unused
from mesonbuild.dependencies import PkgConfigDependency, Qt5Dependency
^
./mesonbuild/build.py:15:1: F401 '.coredata' imported but unused
from . import coredata
^
./mesonbuild/interpreter.py:32:1: F401 'subprocess' imported but unused
import os, sys, subprocess, shutil, uuid, re
^
./mesonbuild/interpreter.py:32:1: F401 're' imported but unused
import os, sys, subprocess, shutil, uuid, re
^
./mesonbuild/dependencies.py:23:1: F401 'subprocess' imported but unused
import os, stat, glob, subprocess, shutil
^
./mesonbuild/mesonlib.py:17:1: F401 'sys' imported but unused
import platform, subprocess, operator, os, shutil, re, sys
^
./mesonbuild/modules/qt5.py:15:1: F401 'subprocess' imported but unused
import os, subprocess
^
./mesonbuild/modules/pkgconfig.py:15:1: F401 '..coredata' imported but unused
from .. import coredata, build
^
./mesonbuild/scripts/scanbuild.py:15:1: F401 'sys' imported but unused
import sys, os
^
./mesonbuild/scripts/meson_exe.py:20:1: F401 'subprocess' imported but unused
import subprocess
^
./mesonbuild/scripts/meson_exe.py:22:1: F401 '..mesonlib.MesonException' imported but unused
from ..mesonlib import MesonException, Popen_safe
^
./mesonbuild/scripts/symbolextractor.py:23:1: F401 'subprocess' imported but unused
import os, sys, subprocess
^
./mesonbuild/scripts/symbolextractor.py:25:1: F401 '..mesonlib.MesonException' imported but unused
from ..mesonlib import MesonException, Popen_safe
^
./mesonbuild/scripts/meson_install.py:19:1: F401 '..mesonlib.MesonException' imported but unused
from ..mesonlib import MesonException, Popen_safe
^
./mesonbuild/scripts/yelphelper.py:15:1: F401 'sys' imported but unused
import sys, os
^
./mesonbuild/scripts/yelphelper.py:20:1: F401 '..mesonlib.MesonException' imported but unused
from ..mesonlib import MesonException
^
./mesonbuild/backend/vs2010backend.py:17:1: F401 're' imported but unused
import re
^
./test cases/vala/8 generated sources/src/copy_file.py:3:1: F401 'os' imported but unused
import os
^
./test cases/common/107 postconf/postconf.py:3:1: F401 'sys' imported but unused
import sys, os
^
./test cases/common/129 object only target/obj_generator.py:5:1: F401 'shutil' imported but unused
import sys, shutil, subprocess
^
./test cases/common/57 custom target chain/usetarget/subcomp.py:3:1: F401 'os' imported but unused
import sys, os
^
./test cases/common/95 dep fallback/subprojects/boblib/genbob.py:3:1: F401 'os' imported but unused
import os
^
./test cases/common/98 gen extra/srcgen.py:4:1: F401 'os' imported but unused
import os
^
./test cases/common/113 generatorcustom/gen.py:3:1: F401 'os' imported but unused
import sys, os
^
./test cases/common/113 generatorcustom/catter.py:3:1: F401 'os' imported but unused
import sys, os
^
./test cases/common/59 object generator/obj_generator.py:5:1: F401 'shutil' imported but unused
import sys, shutil, subprocess
^

Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
2016-12-19 18:19:35 +01:00
Elliott Sales de Andrade f9c1cc9d93 Fix pkg-config during cross-compile. 2016-12-19 14:07:25 +02:00
Nirbheek Chauhan ade1f695a6 Fix detection of pkg-config on all platforms
a) Don't search for pkg-config if we're only cross-compiling
b) Don't unconditionally error out while cross-compiling if the
   specified pkg-config is not found and the dependency is optional
c) Use the pkg-config binary that was found in check_pkgconfig for the
   actual testing
d) Use shutil.which on the found pkg-config only if it finds it.
   Sometimes shutil.which fails to find it, for instance on Windows
   with absolute paths.
2016-12-18 13:41:56 +05:30
Nirbheek Chauhan ef2c2eeed1 QtDependency: Only use -fPIC on Linux
It is enabled by default on OS X and on it doesn't make sense on
Windows.
2016-12-18 13:40:50 +05:30
Nirbheek Chauhan 361ae8d22b qt: Fix detection of tools on Windows
When you pass an absolute path to shutil.which, it will not implicitly
append any extensions. This is problematic on Windows, so we need to
account for that.

This fixes detection of Qt tools on Windows which are searched with the
full path to the Qt bindir.
2016-12-18 13:38:39 +05:30
Nirbheek Chauhan 807a53c6fc PkgConfigDependency.version_reqs must be a list
If it isn't, the --target-glib check in generate_vala_compile will
iterate over the version_reqs as a string and fail to add the
--target-glib argument.
2016-12-15 04:12:23 +05:30
Nirbheek Chauhan 60716fcd6d Use universal_newlines=True for all Popen calls
Instead of adding it everywhere manually, create a wrapper called
mesonlib.Popen_safe and use that everywhere that we call an executable
and extract its output.

This will also allow us to tweak it to do more/different things if
needed for some locales and/or systems.

Closes #1079
2016-12-11 01:59:58 +02:00
Nirbheek Chauhan 2c5680d721 python3 dep: Check arch of libraries before using
On Windows, we can build with both 32-bit and 64-bit compilers, but the
Python is either 32-bit or 64-bit. Check the architecture of the found
Python libraries and don't use them if they don't match our
build_machine.

Also skip the tests if the Python 3 dependency is not found.
2016-12-10 00:58:50 +02:00
Marc-Antoine Perennou 6d1b6de6b0 dependencies: allow overriding pkg-config with PKG_CONFIG when setting pkgbin
Signed-off-by: Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
2016-12-05 10:57:10 +01:00
Marc-Antoine Perennou e9b2084592 dependencies: allow overriding pkg-config with PKG_CONFIG in check_pkgconfig
Signed-off-by: Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
2016-12-05 10:57:10 +01:00
Nirbheek Chauhan e1c9d94708 Allow many version conditions for pkg-config deps
Sometimes we want to restrict the acceptable versions to a list of
versions, or a smallest-version + largest-version, or both. For
instance, GStreamer's opencv plugin is only compatible with
3.1.0 >= opencv >= 2.3.0
2016-12-03 21:46:20 +02:00
Nirbheek Chauhan 09fd24ea78 Always catch PermissionError while looking for Ninja
Also convert a few other generic `except Exception`s to be more specific

Closes #1088
2016-11-26 12:56:08 -05:00
Jussi Pakkanen c23c822196 Only add src_include_dir if it has been defined. 2016-11-14 11:43:37 -05:00
Jussi Pakkanen 08c82fd17c Merge pull request #1042 from centricular/fix-qt4-testcase-qtwidgets
qt: Fix qmake detection on Linux and Windows
2016-11-13 12:38:17 -05:00
Jussi Pakkanen 918b8d098d GTest and GMock changed their entire project layout on 1.8.0. Again. Fix it. 2016-11-13 11:00:04 -05:00