summaryrefslogtreecommitdiffstats
path: root/util/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'util/cmake')
-rwxr-xr-xutil/cmake/configurejson2cmake.py300
-rw-r--r--util/cmake/helper.py15
2 files changed, 197 insertions, 118 deletions
diff --git a/util/cmake/configurejson2cmake.py b/util/cmake/configurejson2cmake.py
index 6eea6e0be8..f0fb4f0817 100755
--- a/util/cmake/configurejson2cmake.py
+++ b/util/cmake/configurejson2cmake.py
@@ -222,6 +222,15 @@ def parseLib(ctx, lib, data, cm_fh, cmake_find_packages_set):
cm_fh.write(generate_find_package_info(newlib, **find_package_kwargs))
+ run_library_test = False
+ mapped_library = find_3rd_party_library_mapping(lib)
+ if mapped_library:
+ run_library_test = mapped_library.run_library_test
+
+ if run_library_test and "test" in data["libraries"][lib]:
+ test = data["libraries"][lib]["test"]
+ write_compile_test(ctx, lib, test, data, cm_fh, manual_library_list=[lib], is_library_test = True)
+
def lineify(label, value, quote=True):
if value:
@@ -491,6 +500,180 @@ def parseInput(ctx, sinput, data, cm_fh):
return
+def write_compile_test(ctx, name, details, data, cm_fh, manual_library_list = None, is_library_test = False):
+
+ if manual_library_list == None:
+ manual_library_list = []
+
+ inherited_test_name = details["inherit"] if "inherit" in details else None
+ inherit_details = None
+ if inherited_test_name and is_library_test:
+ inherit_details = data["libraries"][inherited_test_name]["test"]
+ if not inherit_details:
+ print(f" XXXX Failed to locate inherited library test {inherit}")
+
+ if isinstance(details, str):
+ rel_test_project_path = f"{ctx['test_dir']}/{details}"
+ if posixpath.exists(f"{ctx['project_dir']}/{rel_test_project_path}/CMakeLists.txt"):
+ cm_fh.write(
+ f"""
+qt_config_compile_test("{details}"
+ LABEL "{data['label']}"
+ PROJECT_PATH "${{CMAKE_CURRENT_SOURCE_DIR}}/{rel_test_project_path}")
+"""
+ )
+ return
+
+ def resolve_head(detail):
+ head = detail.get("head", "")
+ if isinstance(head, list):
+ head = "\n".join(head)
+ return head
+
+ head = ""
+ if inherit_details:
+ head += resolve_head(inherit_details)
+ head += resolve_head(details)
+
+ sourceCode = head + "\n"
+
+ def resolve_include(detail, keyword):
+ include = detail.get(keyword, "")
+ if isinstance(include, list):
+ include = "#include <" + ">\n#include <".join(include) + ">"
+ elif include:
+ include = f"#include <{include}>"
+ return include
+
+ include =""
+ if is_library_test:
+ if inherit_details:
+ inherited_lib_data = data["libraries"][inherited_test_name]
+ include += resolve_include(inherited_lib_data, "headers")
+ this_lib_data = data["libraries"][name]
+ include += resolve_include(this_lib_data, "headers")
+ else:
+ if inherit_details:
+ include += resolve_include(inherit_details, "include")
+ include += resolve_include(details, "include")
+
+ sourceCode += include + "\n"
+
+ def resolve_tail(detail):
+ tail = detail.get("tail", "")
+ if isinstance(tail, list):
+ tail = "\n".join(tail)
+ return tail
+
+ tail =""
+ if inherit_details:
+ tail += resolve_tail(inherit_details)
+ tail += resolve_tail(details)
+
+ sourceCode += tail + "\n"
+
+ sourceCode += "int main(int argc, char **argv)\n"
+ sourceCode += "{\n"
+ sourceCode += " (void)argc; (void)argv;\n"
+ sourceCode += " /* BEGIN TEST: */\n"
+
+ def resolve_main(detail):
+ main = detail.get("main", "")
+ if isinstance(main, list):
+ main = "\n".join(main)
+ return main
+
+ main = ""
+ if inherit_details:
+ main += resolve_main(inherit_details)
+ main += resolve_main(details)
+
+ sourceCode += main + "\n"
+
+ sourceCode += " /* END TEST: */\n"
+ sourceCode += " return 0;\n"
+ sourceCode += "}\n"
+
+ sourceCode = sourceCode.replace('"', '\\"')
+
+ librariesCmakeName = ""
+ languageStandard = ""
+ compileOptions = ""
+ qmakeFixme = ""
+
+ cm_fh.write(f"# {name}\n")
+
+ if "qmake" in details: # We don't really have many so we can just enumerate them all
+ if details["qmake"] == "unix:LIBS += -lpthread":
+ librariesCmakeName = format(featureName(name)) + "_TEST_LIBRARIES"
+ cm_fh.write("if (UNIX)\n")
+ cm_fh.write(" set(" + librariesCmakeName + " pthread)\n")
+ cm_fh.write("endif()\n")
+ elif details["qmake"] == "linux: LIBS += -lpthread -lrt":
+ librariesCmakeName = format(featureName(name)) + "_TEST_LIBRARIES"
+ cm_fh.write("if (LINUX)\n")
+ cm_fh.write(" set(" + librariesCmakeName + " pthread rt)\n")
+ cm_fh.write("endif()\n")
+ elif details["qmake"] == "!winrt: LIBS += runtimeobject.lib":
+ librariesCmakeName = format(featureName(name)) + "_TEST_LIBRARIES"
+ cm_fh.write("if (NOT WINRT)\n")
+ cm_fh.write(" set(" + librariesCmakeName + " runtimeobject)\n")
+ cm_fh.write("endif()\n")
+ elif details["qmake"] == "CONFIG += c++11":
+ # do nothing we're always in c++11 mode
+ pass
+ elif details["qmake"] == "CONFIG += c++11 c++14":
+ languageStandard = "CXX_STANDARD 14"
+ elif details["qmake"] == "CONFIG += c++11 c++14 c++17":
+ languageStandard = "CXX_STANDARD 17"
+ elif details["qmake"] == "CONFIG += c++11 c++14 c++17 c++2a":
+ languageStandard = "CXX_STANDARD 20"
+ elif details["qmake"] == "QMAKE_CXXFLAGS += -fstack-protector-strong":
+ compileOptions = details["qmake"][18:]
+ else:
+ qmakeFixme = f"# FIXME: qmake: {details['qmake']}\n"
+
+ library_list = []
+ test_libraries = manual_library_list
+
+ if "use" in data:
+ test_libraries += data["use"].split(" ")
+
+ for library in test_libraries:
+ if len(library) == 0:
+ continue
+
+ mapped_library = find_3rd_party_library_mapping(library)
+ if not mapped_library:
+ qmakeFixme += f"# FIXME: use: unmapped library: {library}\n"
+ continue
+ if mapped_library.test_library_overwrite:
+ library_list.append(mapped_library.test_library_overwrite)
+ else:
+ library_list.append(mapped_library.targetName)
+
+ cm_fh.write(f"qt_config_compile_test({featureName(name)}\n")
+ cm_fh.write(lineify("LABEL", data.get("label", "")))
+ if librariesCmakeName != "" or len(library_list) != 0:
+ cm_fh.write(" LIBRARIES\n")
+ if librariesCmakeName != "":
+ cm_fh.write(lineify("", "${" + librariesCmakeName + "}"))
+ if len(library_list) != 0:
+ cm_fh.write(" ")
+ cm_fh.write("\n ".join(library_list))
+ cm_fh.write("\n")
+ if compileOptions != "":
+ cm_fh.write(f" COMPILE_OPTIONS {compileOptions}\n")
+ cm_fh.write(" CODE\n")
+ cm_fh.write('"' + sourceCode + '"')
+ if qmakeFixme != "":
+ cm_fh.write(qmakeFixme)
+ if languageStandard != "":
+ cm_fh.write(f"\n {languageStandard}\n")
+ cm_fh.write(")\n\n")
+
+
+
# "tests": {
# "cxx11_future": {
# "label": "C++11 <future>",
@@ -532,122 +715,7 @@ def parseTest(ctx, test, data, cm_fh):
else:
details = test
- if isinstance(details, str):
- rel_test_project_path = f"{ctx['test_dir']}/{details}"
- if posixpath.exists(f"{ctx['project_dir']}/{rel_test_project_path}/CMakeLists.txt"):
- cm_fh.write(
- f"""
-qt_config_compile_test("{details}"
- LABEL "{data['label']}"
- PROJECT_PATH "${{CMAKE_CURRENT_SOURCE_DIR}}/{rel_test_project_path}")
-"""
- )
- return
-
- head = details.get("head", "")
- if isinstance(head, list):
- head = "\n".join(head)
-
- sourceCode = head + "\n"
-
- include = details.get("include", "")
- if isinstance(include, list):
- include = "#include <" + ">\n#include <".join(include) + ">"
- elif include:
- include = f"#include <{include}>"
-
- sourceCode += include + "\n"
-
- tail = details.get("tail", "")
- if isinstance(tail, list):
- tail = "\n".join(tail)
-
- sourceCode += tail + "\n"
-
- sourceCode += "int main(int argc, char **argv)\n"
- sourceCode += "{\n"
- sourceCode += " (void)argc; (void)argv;\n"
- sourceCode += " /* BEGIN TEST: */\n"
-
- main = details.get("main", "")
- if isinstance(main, list):
- main = "\n".join(main)
-
- sourceCode += main + "\n"
-
- sourceCode += " /* END TEST: */\n"
- sourceCode += " return 0;\n"
- sourceCode += "}\n"
-
- sourceCode = sourceCode.replace('"', '\\"')
-
- librariesCmakeName = ""
- languageStandard = ""
- compileOptions = ""
- qmakeFixme = ""
-
- cm_fh.write(f"# {test}\n")
- if "qmake" in details: # We don't really have many so we can just enumerate them all
- if details["qmake"] == "unix:LIBS += -lpthread":
- librariesCmakeName = format(featureName(test)) + "_TEST_LIBRARIES"
- cm_fh.write("if (UNIX)\n")
- cm_fh.write(" set(" + librariesCmakeName + " pthread)\n")
- cm_fh.write("endif()\n")
- elif details["qmake"] == "linux: LIBS += -lpthread -lrt":
- librariesCmakeName = format(featureName(test)) + "_TEST_LIBRARIES"
- cm_fh.write("if (LINUX)\n")
- cm_fh.write(" set(" + librariesCmakeName + " pthread rt)\n")
- cm_fh.write("endif()\n")
- elif details["qmake"] == "!winrt: LIBS += runtimeobject.lib":
- librariesCmakeName = format(featureName(test)) + "_TEST_LIBRARIES"
- cm_fh.write("if (NOT WINRT)\n")
- cm_fh.write(" set(" + librariesCmakeName + " runtimeobject)\n")
- cm_fh.write("endif()\n")
- elif details["qmake"] == "CONFIG += c++11":
- # do nothing we're always in c++11 mode
- pass
- elif details["qmake"] == "CONFIG += c++11 c++14":
- languageStandard = "CXX_STANDARD 14"
- elif details["qmake"] == "CONFIG += c++11 c++14 c++17":
- languageStandard = "CXX_STANDARD 17"
- elif details["qmake"] == "CONFIG += c++11 c++14 c++17 c++2a":
- languageStandard = "CXX_STANDARD 20"
- elif details["qmake"] == "QMAKE_CXXFLAGS += -fstack-protector-strong":
- compileOptions = details["qmake"][18:]
- else:
- qmakeFixme = f"# FIXME: qmake: {details['qmake']}\n"
-
- library_list = []
- if "use" in data:
- for library in data["use"].split(" "):
- if len(library) == 0:
- continue
-
- mapped_library = find_3rd_party_library_mapping(library)
- if not mapped_library:
- qmakeFixme += f"# FIXME: use: unmapped library: {library}\n"
- continue
- library_list.append(mapped_library.targetName)
-
- cm_fh.write(f"qt_config_compile_test({featureName(test)}\n")
- cm_fh.write(lineify("LABEL", data.get("label", "")))
- if librariesCmakeName != "" or len(library_list) != 0:
- cm_fh.write(" LIBRARIES\n")
- if librariesCmakeName != "":
- cm_fh.write(lineify("", "${" + librariesCmakeName + "}"))
- if len(library_list) != 0:
- cm_fh.write(" ")
- cm_fh.write("\n ".join(library_list))
- cm_fh.write("\n")
- if compileOptions != "":
- cm_fh.write(f" COMPILE_OPTIONS {compileOptions}\n")
- cm_fh.write(" CODE\n")
- cm_fh.write('"' + sourceCode + '"')
- if qmakeFixme != "":
- cm_fh.write(qmakeFixme)
- if languageStandard != "":
- cm_fh.write(f"\n {languageStandard}\n")
- cm_fh.write(")\n\n")
+ write_compile_test(ctx, test, details, data, cm_fh)
elif data["type"] == "libclang":
knownTests.add(test)
diff --git a/util/cmake/helper.py b/util/cmake/helper.py
index 9b9f347fff..bac0bdb725 100644
--- a/util/cmake/helper.py
+++ b/util/cmake/helper.py
@@ -42,6 +42,8 @@ class LibraryMapping:
appendFoundSuffix: bool = True,
emit_if: str = "",
is_bundled_with_qt: bool = False,
+ test_library_overwrite: str = "",
+ run_library_test: bool = False
) -> None:
self.soName = soName
self.packageName = packageName
@@ -57,6 +59,13 @@ class LibraryMapping:
# for a library will be surrounded by this condition.
self.emit_if = emit_if
+ # Allow overwriting library name when used with tests. E.g.: _nolink
+ # targets do not exist when used during compile tests
+ self.test_library_overwrite = test_library_overwrite
+
+ # Run the library compile test of configure.json
+ self.run_library_test = run_library_test
+
def is_qt(self) -> bool:
return self.packageName == "Qt" or self.packageName == "Qt5" or self.packageName == "Qt6"
@@ -437,10 +446,12 @@ _library_map = [
"openssl_headers",
"OpenSSL",
"OpenSSL::SSL_nolink",
- resultVariable="OPENSSL_INCLUDE_DIR",
+ resultVariable="TEST_openssl_headers",
appendFoundSuffix=False,
+ test_library_overwrite = "OpenSSL::SSL",
+ run_library_test=True
),
- LibraryMapping("openssl", "OpenSSL", "OpenSSL::SSL"),
+ LibraryMapping("openssl", "OpenSSL", "OpenSSL::SSL", resultVariable="TEST_openssl", appendFoundSuffix=False, run_library_test=True),
LibraryMapping("oci", "Oracle", "Oracle::OCI"),
LibraryMapping(
"pcre2", "WrapPCRE2", "WrapPCRE2::WrapPCRE2", extra=["REQUIRED"], is_bundled_with_qt=True