<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[214250] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/214250">214250</a></dd>
<dt>Author</dt> <dd>clopez@igalia.com</dd>
<dt>Date</dt> <dd>2017-03-22 07:36:32 -0700 (Wed, 22 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Linux] determineArchitecture is not cross-compile aware
https://bugs.webkit.org/show_bug.cgi?id=169886

Reviewed by Michael Catanzaro.

Try to detect the target architecture name from the GCC triplet
when cross-building.

The aarch64 architecture is renamed to arm64 (this is coherent with
the rest of the perl tooling that consults the architecture determined
in determineArchitecture(), the check for this arch is always done
with the arm64 name).

* Scripts/webkitdirs.pm: Remove the isARM() function: its dead code
and not cross-build aware.
(determineArchitecture): When crossbuilding, try to detect the target
architecture name from the GCC triplet.
Remove also the fallback option to run the arch command, because this
command doesn't print the expected on Mac/BSD, and on Linux is the
same than uname -m. See https://bugs.webkit.org/show_bug.cgi?id=152958#c6
(isCrossCompilation): Some cross-compilers (buildroot one for example)
don't define the --host option. Add another option to detect that
we are cross-building by building a dummy program and checking if
we can run it.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsScriptswebkitdirspm">trunk/Tools/Scripts/webkitdirs.pm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (214249 => 214250)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-03-22 11:59:33 UTC (rev 214249)
+++ trunk/Tools/ChangeLog        2017-03-22 14:36:32 UTC (rev 214250)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2017-03-22  Carlos Alberto Lopez Perez  &lt;clopez@igalia.com&gt;
+
+        [Linux] determineArchitecture is not cross-compile aware
+        https://bugs.webkit.org/show_bug.cgi?id=169886
+
+        Reviewed by Michael Catanzaro.
+
+        Try to detect the target architecture name from the GCC triplet
+        when cross-building.
+
+        The aarch64 architecture is renamed to arm64 (this is coherent with
+        the rest of the perl tooling that consults the architecture determined
+        in determineArchitecture(), the check for this arch is always done
+        with the arm64 name).
+
+        * Scripts/webkitdirs.pm: Remove the isARM() function: its dead code
+        and not cross-build aware.
+        (determineArchitecture): When crossbuilding, try to detect the target
+        architecture name from the GCC triplet.
+        Remove also the fallback option to run the arch command, because this
+        command doesn't print the expected on Mac/BSD, and on Linux is the
+        same than uname -m. See https://bugs.webkit.org/show_bug.cgi?id=152958#c6
+        (isCrossCompilation): Some cross-compilers (buildroot one for example)
+        don't define the --host option. Add another option to detect that
+        we are cross-building by building a dummy program and checking if
+        we can run it.
+
</ins><span class="cx"> 2017-03-22  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Several WPT tests are failing since they were added in the last update in r213882
</span></span></pre></div>
<a id="trunkToolsScriptswebkitdirspm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitdirs.pm (214249 => 214250)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitdirs.pm        2017-03-22 11:59:33 UTC (rev 214249)
+++ trunk/Tools/Scripts/webkitdirs.pm        2017-03-22 14:36:32 UTC (rev 214250)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> use File::Find;
</span><span class="cx"> use File::Path qw(make_path mkpath rmtree);
</span><span class="cx"> use File::Spec;
</span><ins>+use File::Temp qw(tempdir);
</ins><span class="cx"> use File::stat;
</span><span class="cx"> use List::Util;
</span><span class="cx"> use POSIX;
</span><span class="lines">@@ -343,12 +344,16 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     } elsif (isCMakeBuild()) {
</span><del>-        if (open my $cmake_sysinfo, &quot;cmake --system-information |&quot;) {
</del><ins>+        if (isCrossCompilation()) {
+            my $compiler = &quot;gcc&quot;;
+            $compiler = $ENV{'CC'} if (defined($ENV{'CC'}));
+            my @compiler_machine = split('-', `$compiler -dumpmachine`);
+            $architecture = $compiler_machine[0];
+        } elsif (open my $cmake_sysinfo, &quot;cmake --system-information |&quot;) {
</ins><span class="cx">             while (&lt;$cmake_sysinfo&gt;) {
</span><span class="cx">                 next unless index($_, 'CMAKE_SYSTEM_PROCESSOR') == 0;
</span><span class="cx">                 if (/^CMAKE_SYSTEM_PROCESSOR \&quot;([^&quot;]+)\&quot;/) {
</span><span class="cx">                     $architecture = $1;
</span><del>-                    $architecture = 'x86_64' if $architecture eq 'amd64';
</del><span class="cx">                     last;
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="lines">@@ -358,12 +363,6 @@
</span><span class="cx"> 
</span><span class="cx">     if (!isAnyWindows()) {
</span><span class="cx">         if (!$architecture) {
</span><del>-            # Fall back to output of `arch', if it is present.
-            $architecture = `arch`;
-            chomp $architecture;
-        }
-
-        if (!$architecture) {
</del><span class="cx">             # Fall back to output of `uname -m', if it is present.
</span><span class="cx">             $architecture = `uname -m`;
</span><span class="cx">             chomp $architecture;
</span><span class="lines">@@ -370,7 +369,8 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    $architecture = 'x86_64' if ($architecture =~ /amd64/ &amp;&amp; isBSD());
</del><ins>+    $architecture = 'x86_64' if $architecture =~ /amd64/i;
+    $architecture = 'arm64' if $architecture =~ /aarch64/i;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub determineASanIsEnabled
</span><span class="lines">@@ -1185,11 +1185,6 @@
</span><span class="cx">     return ($^O eq &quot;freebsd&quot;) || ($^O eq &quot;openbsd&quot;) || ($^O eq &quot;netbsd&quot;) || 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-sub isARM()
-{
-    return ($Config{archname} =~ /^arm[v\-]/) || ($Config{archname} =~ /^aarch64[v\-]/);
-}
-
</del><span class="cx"> sub isX86_64()
</span><span class="cx"> {
</span><span class="cx">     return (architecture() eq &quot;x86_64&quot;) || 0;
</span><span class="lines">@@ -1197,16 +1192,28 @@
</span><span class="cx"> 
</span><span class="cx"> sub isCrossCompilation()
</span><span class="cx"> {
</span><del>-  my $compiler = &quot;&quot;;
-  $compiler = $ENV{'CC'} if (defined($ENV{'CC'}));
-  if ($compiler =~ /gcc/) {
-      my $compiler_options = `$compiler -v 2&gt;&amp;1`;
-      my @host = $compiler_options =~ m/--host=(.*?)\s/;
-      my @target = $compiler_options =~ m/--target=(.*?)\s/;
-
-      return ($host[0] ne &quot;&quot; &amp;&amp; $target[0] ne &quot;&quot; &amp;&amp; $host[0] ne $target[0]);
-  }
-  return 0;
</del><ins>+    my $compiler = &quot;&quot;;
+    $compiler = $ENV{'CC'} if (defined($ENV{'CC'}));
+    if ($compiler =~ /gcc/) {
+        my $compilerOptions = `$compiler -v 2&gt;&amp;1`;
+        my @host = $compilerOptions =~ m/--host=(.*?)\s/;
+        my @target = $compilerOptions =~ m/--target=(.*?)\s/;
+        if ($target[0] ne &quot;&quot; &amp;&amp; $host[0] ne &quot;&quot;) {
+                return ($host[0] ne $target[0]);
+        } else {
+                # $tempDir gets automatically deleted when goes out of scope
+                my $tempDir = File::Temp-&gt;newdir();
+                my $testProgramSourcePath = File::Spec-&gt;catfile($tempDir, &quot;testcross.c&quot;);
+                my $testProgramBinaryPath = File::Spec-&gt;catfile($tempDir, &quot;testcross&quot;);
+                open(my $testProgramSourceHandler, &quot;&gt;&quot;, $testProgramSourcePath);
+                print $testProgramSourceHandler &quot;int main() { return 0; }\n&quot;;
+                system(&quot;$compiler $testProgramSourcePath -o $testProgramBinaryPath &gt; /dev/null 2&gt;&amp;1&quot;) == 0 or return 0;
+                # Crosscompiling if the program fails to run (because it was built for other arch)
+                system(&quot;$testProgramBinaryPath &gt; /dev/null 2&gt;&amp;1&quot;) == 0 or return 1;
+                return 0;
+        }
+    }
+    return 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> sub isAppleWebKit()
</span></span></pre>
</div>
</div>

</body>
</html>