Users reported issues caused by missing the right libstdc++-version-dev.
A new function 'check_c_toolchain' added in sanity.bbclass to test linking 
libstdc++
Fixes [YOCTO #<15712>]

Signed-off-by: Christos Gavros <[email protected]>
---
v1->v2
* use shortlog
* drop the meta-oe prefix
* fix format for bug reference
* change function description including libstdc++
* use BUILD_CC instead of specific compiler
* lines in comments are removed
* patch message less than 200 char
* bb.fatal is removed
* follow pattern of other functions in class
* use docstring instead of # in functions description
* make the print out message more clear
* fix comment style where the function is called
* change "hello world" from C++ to C program
* use gcc instead of g++
---
 meta/classes-global/sanity.bbclass | 40 ++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/meta/classes-global/sanity.bbclass 
b/meta/classes-global/sanity.bbclass
index 7b8a497d5a..3a5a1f5d66 100644
--- a/meta/classes-global/sanity.bbclass
+++ b/meta/classes-global/sanity.bbclass
@@ -780,6 +780,43 @@ def sanity_check_locale(d):
     except locale.Error:
         raise_sanity_error("Your system needs to support the en_US.UTF-8 
locale.", d)
 
+def check_c_toolchain(d):
+    """
+    it checks if the c compiling and linking to libstdc++ works properly in 
the native system
+    """
+    import os
+    import subprocess
+    from tempfile import NamedTemporaryFile
+    
+    try:
+        with NamedTemporaryFile(delete=False, suffix=".c") as c_file:
+            c_code = """
+            #include <stdio.h>
+            int main() {
+                printf(\"Hello, World!\\n\");
+                return 0;
+            }
+            """
+            c_file.write(c_code.encode('utf-8'))
+            c_file_name = c_file.name
+
+        build_cc = d.getVar('BUILD_CC').strip()
+        output_binary = c_file_name + ".out"
+        compile_command = [build_cc, c_file_name, '-o', 
output_binary,'-lstdc++']
+        result = subprocess.run(compile_command, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE)
+
+        if result.returncode == 0:
+            return None
+        else:
+            return f"C toolchain check failed to link against libstdc++. 
Please ensure libstdc++ and headers are installed. 
Error:\n{result.stderr.decode()}"
+    except Exception as e:
+        return f"An unexpected issue occurred during the C toolchain check: 
{str(e)}"
+    finally:
+        if c_file_name and os.path.exists(c_file_name):
+            os.remove(c_file_name)
+        if output_binary and os.path.exists(output_binary):
+            os.remove(output_binary)
+
 def check_sanity_everybuild(status, d):
     import os, stat
     # Sanity tests which test the users environment so need to run at each 
build (or are so cheap
@@ -976,6 +1013,9 @@ def check_sanity_everybuild(status, d):
         if '/dash' not in real_sh and '/bash' not in real_sh:
             status.addresult("Error, /bin/sh links to %s, must be dash or 
bash\n" % real_sh)
 
+    # Check if linking with lstdc++ is failing 
+    status.addresult(check_c_toolchain(d))
+
 def check_sanity(sanity_data):
     class SanityStatus(object):
         def __init__(self):
-- 
2.34.1

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#209924): 
https://lists.openembedded.org/g/openembedded-core/message/209924
Mute This Topic: https://lists.openembedded.org/mt/110634330/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to