mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-12-20 03:21:18 +01:00
Compare commits
1 Commits
dev/dbitor
...
dev/genera
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
62488a8ce6 |
@@ -33,6 +33,31 @@ def green(msg):
|
|||||||
return f"{GREENC}{msg}{ENDC}"
|
return f"{GREENC}{msg}{ENDC}"
|
||||||
|
|
||||||
|
|
||||||
|
QUALIFY_KINDS = {
|
||||||
|
cindex.CursorKind.NAMESPACE,
|
||||||
|
cindex.CursorKind.CLASS_DECL,
|
||||||
|
cindex.CursorKind.STRUCT_DECL,
|
||||||
|
cindex.CursorKind.CLASS_TEMPLATE,
|
||||||
|
cindex.CursorKind.ENUM_DECL,
|
||||||
|
cindex.CursorKind.UNION_DECL,
|
||||||
|
cindex.CursorKind.TYPE_ALIAS_DECL,
|
||||||
|
}
|
||||||
|
|
||||||
|
def qualified_name(cur: cindex.Cursor, include_leaf: bool = True) -> str:
|
||||||
|
"""
|
||||||
|
Build a fully-qualified name by following semantic_parent up to the TU.
|
||||||
|
If include_leaf is False, returns just the enclosing scope (namespaces, classes).
|
||||||
|
"""
|
||||||
|
parts = []
|
||||||
|
c = cur if include_leaf else cur.semantic_parent
|
||||||
|
while c and c.kind != cindex.CursorKind.TRANSLATION_UNIT:
|
||||||
|
name = c.spelling or c.displayname # displayname helps for anonymous namespaces
|
||||||
|
if name and (c.kind in QUALIFY_KINDS or c is cur):
|
||||||
|
parts.append(name)
|
||||||
|
c = c.semantic_parent
|
||||||
|
return "::".join(reversed(parts))
|
||||||
|
|
||||||
|
|
||||||
def check_libclang_version(required="12"):
|
def check_libclang_version(required="12"):
|
||||||
# Use already-loaded libclang, or let cindex resolve it
|
# Use already-loaded libclang, or let cindex resolve it
|
||||||
lib = ctypes.CDLL(cindex.Config.library_file or ctypes.util.find_library("clang"))
|
lib = ctypes.CDLL(cindex.Config.library_file or ctypes.util.find_library("clang"))
|
||||||
@@ -76,8 +101,8 @@ def check_for_compile_commands_json(path):
|
|||||||
print(msg)
|
print(msg)
|
||||||
|
|
||||||
|
|
||||||
default_build_path = "/home/l_frojdh/sls/build/"
|
default_build_path = Path("../../build/")
|
||||||
fpath = "../../slsDetectorSoftware/src/Detector.cpp"
|
fpath = Path("../../slsDetectorSoftware/src/Detector.cpp")
|
||||||
|
|
||||||
|
|
||||||
m = []
|
m = []
|
||||||
@@ -87,25 +112,14 @@ ag2 = []
|
|||||||
cn = []
|
cn = []
|
||||||
|
|
||||||
|
|
||||||
def get_arguments(node):
|
|
||||||
args = [a.type.spelling for a in node.get_arguments()]
|
|
||||||
args = [
|
|
||||||
"py::arg() = Positions{}" if item == "sls::Positions" else "py::arg()"
|
|
||||||
for item in args
|
|
||||||
]
|
|
||||||
args = ", ".join(args)
|
|
||||||
if args:
|
|
||||||
args = f", {args}"
|
|
||||||
return args
|
|
||||||
|
|
||||||
|
|
||||||
def get_arguments_with_default(node):
|
def get_arguments_with_default(node):
|
||||||
args = []
|
args = []
|
||||||
for arg in node.get_arguments():
|
for arg in node.get_arguments():
|
||||||
tokens = [t.spelling for t in arg.get_tokens()]
|
tokens = [t.spelling for t in arg.get_tokens()]
|
||||||
# print(tokens)
|
|
||||||
if "=" in tokens:
|
if "=" in tokens:
|
||||||
if arg.type.spelling == "sls::Positions": # TODO! automate
|
# if arg.type.spelling == "sls::Positions": # TODO! automate+
|
||||||
|
if arg.type.spelling == "Positions": # TODO! automate
|
||||||
args.append("py::arg() = Positions{}")
|
args.append("py::arg() = Positions{}")
|
||||||
else:
|
else:
|
||||||
args.append("py::arg()" + "".join(tokens[tokens.index("=") :]))
|
args.append("py::arg()" + "".join(tokens[tokens.index("=") :]))
|
||||||
@@ -174,6 +188,10 @@ def visit(node):
|
|||||||
m.append(child)
|
m.append(child)
|
||||||
args = get_arguments_with_default(child)
|
args = get_arguments_with_default(child)
|
||||||
fs = get_fdec(child)
|
fs = get_fdec(child)
|
||||||
|
qualified_class = qualified_name(child.semantic_parent) # "ns1::ns2::Detector"
|
||||||
|
# lines.append(
|
||||||
|
# f'CppDetectorApi.def("{child.spelling}", {fs} &{qualified_class}::{child.spelling}{args});'
|
||||||
|
# )
|
||||||
lines.append(
|
lines.append(
|
||||||
f'CppDetectorApi.def("{child.spelling}",{fs} &Detector::{child.spelling}{args});'
|
f'CppDetectorApi.def("{child.spelling}",{fs} &Detector::{child.spelling}{args});'
|
||||||
)
|
)
|
||||||
@@ -202,8 +220,11 @@ if __name__ == "__main__":
|
|||||||
)
|
)
|
||||||
cargs = parser.parse_args()
|
cargs = parser.parse_args()
|
||||||
|
|
||||||
check_libclang_version("12")
|
# check_libclang_version("12")
|
||||||
check_clang_format_version(12)
|
# check_clang_format_version(12)
|
||||||
|
cargs.build_path = cargs.build_path.resolve()
|
||||||
|
print(f'Using build path: {cargs.build_path}')
|
||||||
|
|
||||||
check_for_compile_commands_json(cargs.build_path)
|
check_for_compile_commands_json(cargs.build_path)
|
||||||
|
|
||||||
print("Parsing functions in Detector.h - ", end="", flush=True)
|
print("Parsing functions in Detector.h - ", end="", flush=True)
|
||||||
@@ -212,11 +233,17 @@ if __name__ == "__main__":
|
|||||||
db = cindex.CompilationDatabase.fromDirectory(cargs.build_path)
|
db = cindex.CompilationDatabase.fromDirectory(cargs.build_path)
|
||||||
index = cindex.Index.create()
|
index = cindex.Index.create()
|
||||||
args = db.getCompileCommands(fpath)
|
args = db.getCompileCommands(fpath)
|
||||||
|
|
||||||
|
|
||||||
args = list(iter(args).__next__().arguments)[0:-1]
|
args = list(iter(args).__next__().arguments)[0:-1]
|
||||||
args = args + "-x c++ --std=c++11".split()
|
# print('\n\nUsing compile commands:', args)
|
||||||
|
# args = args + "-x c++ --std=c++17".split()
|
||||||
syspath = system_include_paths("clang++")
|
syspath = system_include_paths("clang++")
|
||||||
incargs = ["-I" + inc for inc in syspath]
|
incargs = ["-I" + inc for inc in syspath]
|
||||||
args = args + incargs
|
args = args + incargs
|
||||||
|
args = [arg for arg in args if arg.startswith("-I") or arg.startswith("-D")]
|
||||||
|
# args = incargs
|
||||||
|
# print(f"\n\nUsing compile args: {' '.join(args)}")
|
||||||
tu = index.parse(fpath, args=args)
|
tu = index.parse(fpath, args=args)
|
||||||
visit(tu.cursor)
|
visit(tu.cursor)
|
||||||
print(green("OK"))
|
print(green("OK"))
|
||||||
@@ -241,5 +268,5 @@ if __name__ == "__main__":
|
|||||||
subprocess.run(["clang-format", "../src/detector.cpp", "-i"])
|
subprocess.run(["clang-format", "../src/detector.cpp", "-i"])
|
||||||
print(green(" OK"))
|
print(green(" OK"))
|
||||||
|
|
||||||
print("Changes since last commit:")
|
# print("Changes since last commit:")
|
||||||
subprocess.run(["git", "diff", "../src/detector.cpp"])
|
# subprocess.run(["git", "diff", "../src/detector.cpp"])
|
||||||
|
|||||||
@@ -79,4 +79,10 @@ def system_include_paths(compiler, cpp=True):
|
|||||||
line = line.strip()
|
line = line.strip()
|
||||||
paths.append(line)
|
paths.append(line)
|
||||||
paths = [p.decode('utf-8') for p in paths]
|
paths = [p.decode('utf-8') for p in paths]
|
||||||
|
|
||||||
|
# Only keep include paths from the conda prefix
|
||||||
|
# remove anything pointing to gcc
|
||||||
|
prefix = os.environ['CONDA_PREFIX']
|
||||||
|
paths = [p for p in paths if prefix in p]
|
||||||
|
paths = [p for p in paths if 'gcc' not in p]
|
||||||
return paths
|
return paths
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -12,11 +12,7 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
namespace py = pybind11;
|
namespace py = pybind11;
|
||||||
void init_det(py::module &m) {
|
void init_det(py::module &m) {
|
||||||
using sls::defs;
|
using namespace sls; //TODO! qualify arguments and return types to avoid this
|
||||||
using sls::Detector;
|
|
||||||
using sls::ns;
|
|
||||||
using sls::Positions;
|
|
||||||
using sls::Result;
|
|
||||||
|
|
||||||
m.def("freeSharedMemory", (void (*)(const int, const int)) &sls::freeSharedMemory, py::arg() = 0, py::arg() = -1);
|
m.def("freeSharedMemory", (void (*)(const int, const int)) &sls::freeSharedMemory, py::arg() = 0, py::arg() = -1);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user