Commit Graph

166 Commits

Author SHA1 Message Date
Jussi Pakkanen de83e94b5a Merge pull request #1171 from centricular/fix-extracted-generated-prebuilt-object-targets-linking
Several fixes to how we handle objects in build targets
2016-12-13 12:22:11 +02:00
Jussi Pakkanen 07679f0330 Merge pull request #1184 from centricular/cc.prefixes_underscore
Add a new compiler function 'symbols_have_underscore_prefix'
2016-12-13 12:21:50 +02:00
Nirbheek Chauhan 0fc4ad2a0b Also use objects to populate target compilers
This avoids us having no compilers at all for targets that are composed
entirely of objects with no sources.

Now we will always have a compiler for a target even if it is composed
entirely of objects generated with custom targets unless it has
completely unknown sources.
2016-12-13 09:20:34 +05:30
Nirbheek Chauhan 5240688f5c compilers: Fix output ext while compile-only on MSVC
When doing a compile-only self.compile() check, cl.exe expects an output
file of type *.obj, and passing it `output.exe` makes it write the
compiled object to `output.exe.obj`. Detect when we're doing
a compily-only check and change the suffix ourselves.

This is fine most of the time, but fails when you need to inspect the
compiled file manually.

Also store stdout/stderr on the returned object.
2016-12-13 09:17:06 +05:30
Nirbheek Chauhan 09f65b7a3c New compiler function 'symbols_have_underscore_prefix'
Check if the compiler prefixes an underscore to global symbols. This is
useful when linking to compiled assembly code, or other code that does
not have its C symbol mangling handled transparently by the compiler.

C symbol mangling is platform and architecture dependent, and a helper
function is needed to detect it. Eg: Windows 32-bit prefixes underscore,
but 64-bit does not. Linux does not prefix an underscore but OS X does.
2016-12-13 09:17:06 +05:30
Elliott Sales de Andrade ec47db6c0c Add Compiler.has_multi_arguments method.
It allows checking if a compiler supports a multi-argument option.
2016-12-12 23:34:03 +02:00
Nirbheek Chauhan 70f39ee21e unity builds: Assembly and LLVM IR are incompatible
Can't just #include them and use them directly in unity builds. Inline
assembly is a thing, but it's not trivial and is deprecated with some
compilers. Just build them separately and link them in. Ideally the user
would then use LTO to ensure the same result.
2016-12-11 14:54:30 +05:30
Nirbheek Chauhan 04c1909a4d compilers: Implement support for LLVM IR compilation
Also C++ compilers can build .S assembly files. This wasn't noticed
earlier because most people were also using C compilers in their C++
projects and we would fall back to using the C compiler for building the
assembly files. Now we have a test for this.

This was trivial to add; except that we needed a new LLVM IR rule
because the compiler emits warnings if you pass any special arguments to
it such as include arguments or dependency arguments.

Closes #1089
2016-12-11 14:54:30 +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 be04aa2a0b has_function: Fix checking for builtins with includes
We were checking for builtins explicitly like this because the ordinary
checks don't work for builtins at all. We do exactly the same check as
Autoconf and it doesn't work with Autoconf either (Autoconf is broken!)

So now we check for it in two ways: if there's no #include in prefix, we
check if `__builtin_symbol` exists (has_function allows checking for
functions without providing includes). If there's a #include, we check
if `symbol` exists.

The old method was causing problems with some buggy toolchains such as
MSYS2 which define some builtins in the C library but don't expose them
via headers which meant that `__builtin_symbol` would be found even
though `symbol` is not available.

Doing this allows people to always get the correct answer as long as
they specify the includes that are required to find a function while
also not forcing people to always specify includes to find a function
which is cumbersome.

Closes #1083
2016-12-10 23:18:17 +02:00
Jussi Pakkanen f62f730821 Merge pull request #1126 from mesonbuild/sharedmodule
Support for shared modules
2016-12-07 21:49:16 +02:00
Nirbheek Chauhan f5a9b3b249 Fix shared module support on Windows
Unlike Linux and OS X, when a library is loaded, all the symbols aren't
loaded into a single namespace. You must fetch the symbol by iterating over
all loaded modules.

So, we shouldn't use /FORCE:UNRESOLVED since that is not what modules do
on Windows. Instead, we now do exactly what GModule does on Windows.

Also use `void` for functions that take no arguments.
2016-12-07 05:44:34 +05:30
Jussi Pakkanen b54fc1d00e Apply magical flags to make OSX ignore missing symbols in plugins. 2016-12-04 20:15:06 +02:00
Nirbheek Chauhan 24be8b8474 compilers.py: Fix typo in function documentation 2016-12-04 00:34:54 +05:30
Nirbheek Chauhan cee9638cc4 Compiler check and extra args should always override
We want compiler check arguments (-O0, -fpermissive, etc) to override
all other arguments, and we want extra_args passed in by the build file
to always override everything.

To do this properly, we must split include arguments out, append them
first, append all other arguments as usual, and then append the rest.

As part of this, we also add the compiler check flags to the
cc.compiles() and cc.links() helper functions since they also most
likely need them.

Also includes a unit test for all this.
2016-12-04 00:32:24 +05:30
Jussi Pakkanen 2dd7f3cb47 Tell msvc not to error out on missing symbols. 2016-12-03 00:54:21 +02:00
Jussi Pakkanen 023dc6953c Arg fix. 2016-12-02 22:48:00 +02:00
Jussi Pakkanen 04a2e6ded3 Do not use -install_name or -shared when building modules on OSX,
but do use -bundle. Closes #1112.
2016-12-02 22:28:18 +02:00
Jussi Pakkanen 6d84b9b646 Created new shared module build target type, and make sure -Wl,--no-undefined is not used when linking it. 2016-12-02 21:55:56 +02:00
Jussi Pakkanen 7e1b674704 Add both native and cross compiler options to option list. 2016-11-26 11:24:20 -05:00
Jussi Pakkanen 82bb24b264 Made has_function survive optimization flags. Closes #1053. 2016-11-20 16:53:58 -05:00
Nirbheek Chauhan b438455ec1 Hotfix for cross-compilation from Windows to Linux
We currently pass cross-compiler options to the native compiler too and
when cross-compiling from Windows to Linux, `options` will contain
Linux-specific options which doesn't include `c_winlibs`.

The proper fix is to allow cross-info files to specify compiler options
and to maintain both cross and native compiler options in coredata, but
that will have to be done after the 0.36.0 release.

Also fixes a typo in MinGW cpp_winlibs option setting.

Closes #1029
2016-11-14 11:44:51 -05:00
Nirbheek Chauhan 085650a1e3 vala: Implement valac.find_library
Move CCompiler.compile to Compiler.compile so that ValaCompiler can use
it. Also rewrite ValaCompiler.sanity_check to use it since it does
a simple compile check.

At the same time, it enhances ExternalLibrary to support arguments for
languages other than C-like.

Includes a test for this that links against zlib through Vala.

Closes #983
2016-11-12 13:56:17 -05:00
Jussi Pakkanen 1d9c40c9c3 Merge pull request #1027 from centricular/has-header-prefix
cc.has_header: Allow specifying a prefix for headers
2016-11-12 12:16:16 -05:00
Scott D Phillips 3db969336f compilers: add werror flag for msvc 2016-11-12 11:51:59 -05:00
Nirbheek Chauhan aa5afba00b cc.has_header: Allow specifying a prefix for headers
Fixes #1026
2016-11-11 10:25:34 +05:30
Nirbheek Chauhan 88f1d400c0 Fix debug PCH builds with MSVC 2012 and later
With MSVC 2013 and newer, using pre-compiled headers with .pdb debugging
fails with the following error message:

fatal error C1041: cannot open program database '[...]\prog.pdb'; if multiple CL.EXE write to the same .PDB file, please use /FS

So we use /FS when PCH is enabled. When PCH is enabled and debugging is
disabled, this will have no effect since .pdb files will not be written.
2016-11-10 00:40:16 +05:30
Jussi Pakkanen cf7b50364f Merge pull request #1006 from centricular/cpp-has-header-symbol
A bunch of fixes for compiler checks with C++
2016-11-09 10:27:28 -05:00
Nirbheek Chauhan e90f21ae59 javac: Fail gracefully if there's no JVM
Without this, we error out with an exception if `javac` is found but
`java` isn't:

[...]
File "mesonbuild/interpreter.py", line 1759, in detect_compilers
  comp.sanity_check(self.environment.get_scratch_dir(), self.environment)
File "mesonbuild/compilers.py", line 1279, in sanity_check
  pe = subprocess.Popen(cmdlist, cwd=work_dir)
File "/usr/lib64/python3.5/subprocess.py", line 947, in __init__
  restore_signals, start_new_session)
File "/usr/lib64/python3.5/subprocess.py", line 1551, in _execute_child
  raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'java'
2016-11-09 02:37:56 +05:30
Nirbheek Chauhan 30392a3a8a Inherit VisualStudioCPPCompiler from CPPCompiler
Without this our custom C++ has_header_symbol implementation is not used
with the Visual Studio C++ compiler.
2016-11-08 23:52:01 +05:30
Nirbheek Chauhan f144e50f5c has_function: Cast to void* instead of int
Clang++ doesn't allow that, but void* will always be allowed because
lots of projects depend on that.

error: cast from pointer to smaller type 'int' loses information
2016-11-08 16:22:40 +05:30
Nirbheek Chauhan 7400284e32 has_function: Fix trivial typo
This was breaking has_function on C++
2016-11-08 16:05:32 +05:30
Nirbheek Chauhan 4d84241ccf has_header_symbol: Also detect C++ classes and templates
With the `using` keyword we can try to use the specified class or
template which will tell us if it exists.
2016-11-08 16:05:32 +05:30
Nirbheek Chauhan f6dfd36239 has_header_symbol: Make it work with C++ compilers
Need to pass -fpermissive to force C++ compilers to only warn about our
non-conformant code that tests for a symbol being defined.

Also do a simple #ifdef check first in has_header_symbol to allow
arbitrary macros to be detected which would not have been detected
earlier. This follows what AC_CHECK_DECL does.

Closes #958
2016-11-08 15:42:15 +05:30
Jussi Pakkanen 97c2321740 Merge pull request #949 from centricular/has-function-xcode8-fixes
Fix has_function with XCode 8 and related changes
2016-11-02 11:41:32 -07:00
Nirbheek Chauhan b8ef693a2a Clang also supports gnu89/99/11, gnu++03/11/14/1z
The list of supported standards is identical for GCC and Clang.

We don't list duplicate standard names however, such as c++03 and c++09

https://github.com/llvm-mirror/clang/blob/master/include/clang/Frontend/LangStandards.def
2016-10-30 06:43:49 -07:00
Nirbheek Chauhan b05d37db67 compilers: Ignore pthread flags when using MSVC
They don't make sense and just cause a build failure.
2016-10-27 10:51:26 -07:00
Nirbheek Chauhan 5ffb0bcd0d Use *FLAGS from the env in compiler checks
Every other build system does this, and at least OS X, iOS, and Android
depend on this to select the OS versions that your application is
targetting.

At the same time, just use a wrapper for self.run and self.links to
share the common (identical) code.
2016-10-26 23:16:06 +05:30
Nirbheek Chauhan 4be8e71fb3 has_function: Try to use the function being checked
Simply placing a reference to it isn't enough for the linker to try and
think it's being used and do a symbol availability check with
-Wl,-no_weak_imports on OS X ld.
2016-10-26 23:16:04 +05:30
Nirbheek Chauhan a06178f58f Add -Wl,-no_weak_imports to has_function with XCode 8
This is needed to ensure that symbol availability checks actually fail
at link time (instead of at runtime) which is necessary for has_function
to work correctly.
2016-10-25 09:44:15 +05:30
Nirbheek Chauhan ac58c13bbf has_function: Only ignore prototype when no includes are specified
The Autoconf-style check we were doing gives false positives when the
linker uses the prototype defined in the SDK header to decide whether
a function is available or not.

For example, with macOS 10.12, clock_gettime is now implemented
(alongwith other functions). These functions are always defined in the
XCode 8 SDK as weak imports and you're supposed to do a runtime check to
see if the symbols are available and use fallback code if they aren't.

The linker will always successfully link if you use one of those symbols
(without a runtime fallback) even if you target an older OS X version
with -mmacosx-version-min. This is the intended behaviour by Apple.

But this makes has_function useless because to test if the symbol is
available, we must know at link-time whether it is available.

To force the linker to do the check at link-time you must use
'-Wl,-no_weak_imports` *and* use the prototype in time.h which has an
availability macro which tells the linker whether the symbol is
available or not based on the -mmacosx-version-min flag.

An autoconf-style check would override this prototype and use its own
which would result in the linker thinking that the function is always
available (a false positive). Worse, this would manifest at runtime and
might not be picked up immediately.

We now use the function prototype in the user-provided includes if the
'prefix' kwarg contains a `#include` and use the old Autoconf-style
check if not. I've tested that the configure checks done by GStreamer
and GLib are completely unaffected by this; at least on Linux.

The next commit will also add `-Wl,-no_weak_imports` to extra_args by
default so that Meson avoids this mess completely. We always want this
because the user would not do a has_function check if they have
a runtime fallback for the function in their code.
2016-10-25 09:44:15 +05:30
Nirbheek Chauhan 02a2d69270 compilers: Derive ClangObj*Compiler from ClangCompiler too
The Clang ObjC/++ compiler is the same as the C/++ compiler.
2016-10-25 09:44:15 +05:30
Nirbheek Chauhan 9c9c5ab2a8 Implement get_default_suffix in the base Compiler class
This way every compiler has it implemented
2016-10-21 08:00:39 +05:30
Nirbheek Chauhan 4332df01b8 Add no-warning args while building Vala C code
This is done by adding a new compiler method called 'no_warn_args' which
returns the argument(s) required for the compiler to emit no warnings
for that compilation.

This take care of not disabling warnings for C code compiled into the
BuildTarget. Also includes tests for ensuring all this.

https://github.com/mesonbuild/meson/issues/864
2016-10-14 19:13:21 +05:30
Jussi Pakkanen 95a99682b0 Merge branch 'QuLogic-compiler-file-checks' 2016-10-12 23:26:30 +03:00
Jussi Pakkanen 28df8b800e Add an option to select if static libraries are built with -fPIC. 2016-10-10 21:28:28 +03:00
Jussi Pakkanen f0fee2e542 Fix soname to work on OSX. 2016-10-08 14:34:24 +02:00
Jussi Pakkanen 4dc798dc7e Check that soname matches the filename. Closes #785. 2016-10-08 07:34:39 -04:00
Nirbheek Chauhan 67c9e520de compilers: Don't pollute c_args with -fPIC on OS X
It's always enabled and the compiler just ignores all PIC-related
arguments. Relatedly, do the same thing for Clang as GCC.
2016-10-08 01:02:16 +05:30
Jussi Pakkanen 62ec92c8b0 Set soname with clang properly. 2016-10-02 12:52:16 -04:00