From 0ab700c995130775ff521d3bdefba839e247fc9b Mon Sep 17 00:00:00 2001 From: maelstrom Date: Sun, 8 Jun 2025 15:45:05 +0200 Subject: [PATCH] fix(autogen): not compiling on windows due to difference in fs::path char_type --- autogen/CMakeLists.txt | 4 ++-- autogen/src/main.cpp | 28 +++++++++++++++++----------- autogen/src/object/analysis.cpp | 2 +- autogen/src/util.cpp | 4 ++++ autogen/src/util.h | 5 ++++- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/autogen/CMakeLists.txt b/autogen/CMakeLists.txt index d77d05e..04c184d 100644 --- a/autogen/CMakeLists.txt +++ b/autogen/CMakeLists.txt @@ -13,5 +13,5 @@ add_executable(autogen ) set_target_properties(autogen PROPERTIES OUTPUT_NAME "autogen") -target_link_libraries(autogen -lclang) -target_include_directories(autogen PUBLIC "src" ${CLANG_INCLUDE_DIRS}) \ No newline at end of file +target_link_libraries(autogen ${CLANG_LIBRARY}) +target_include_directories(autogen PUBLIC "src" ${CLANG_INCLUDE_DIR}) \ No newline at end of file diff --git a/autogen/src/main.cpp b/autogen/src/main.cpp index 14944a5..1bd3e11 100644 --- a/autogen/src/main.cpp +++ b/autogen/src/main.cpp @@ -12,6 +12,7 @@ #include "object/codegen.h" #include "data/analysis.h" #include "data/codegen.h" +#include "util.h" // namespace data { // #include "data/analysis.h" @@ -22,13 +23,17 @@ namespace fs = std::filesystem; // https://clang.llvm.org/docs/LibClang.html int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) { - const char* cargs[] = { "-x", "c++", "-I", srcRoot.c_str(), "-D__AUTOGEN__", 0 }; + std::string srcRootStr = string_of(srcRoot); + std::string srcPathStr = string_of(srcPath); + std::string outPathStr = string_of(outPath); + + const char* cargs[] = { "-x", "c++", "-I", srcRootStr.c_str(), "-D__AUTOGEN__", 0 }; // THANK YOU SO MUCH THIS STACKOVERFLOW ANSWER IS SO HELPFUL // https://stackoverflow.com/a/59206378/16255372 CXIndex index = clang_createIndex(0, 0); CXTranslationUnit unit = clang_parseTranslationUnit( index, - srcPath.c_str(), cargs, 5, + srcPathStr.c_str(), cargs, 5, nullptr, 0, CXTranslationUnit_None); @@ -55,15 +60,16 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) { enum_::AnalysisState enumAnlyState; fs::path relpath = fs::relative(srcPath, srcRoot); - printf("[AUTOGEN] Processing file %s...\n", relpath.c_str()); - object::analyzeClasses(cursor, srcRoot, &objectAnlyState); - data::analyzeClasses(cursor, srcRoot, &dataAnlyState); - enum_::analyzeClasses(cursor, srcRoot, &enumAnlyState); + std::string relpathStr = string_of(relpath); + printf("[AUTOGEN] Processing file %s...\n", relpathStr.c_str()); + object::analyzeClasses(cursor, srcRootStr, &objectAnlyState); + data::analyzeClasses(cursor, srcRootStr, &dataAnlyState); + enum_::analyzeClasses(cursor, srcRootStr, &enumAnlyState); fs::create_directories(outPath.parent_path()); // Make sure generated dir exists before we try writing to it - printf("[AUTOGEN] Generating file %s...\n", relpath.c_str()); - std::ofstream outStream(outPath); + printf("[AUTOGEN] Generating file %s...\n", relpathStr.c_str()); + std::ofstream outStream(outPathStr); if (!objectAnlyState.classes.empty() || !dataAnlyState.classes.empty()) { outStream << "/////////////////////////////////////////////////////////////////////////////////////////\n"; @@ -72,15 +78,15 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) { } for (auto& [_, clazz] : objectAnlyState.classes) { - object::writeCodeForClass(outStream, relpath, clazz); + object::writeCodeForClass(outStream, relpathStr, clazz); } for (auto& [_, clazz] : dataAnlyState.classes) { - data::writeCodeForClass(outStream, relpath, clazz); + data::writeCodeForClass(outStream, relpathStr, clazz); } for (auto& [_, clazz] : enumAnlyState.classes) { - enum_::writeCodeForClass(outStream, relpath, clazz); + enum_::writeCodeForClass(outStream, relpathStr, clazz); } outStream.close(); diff --git a/autogen/src/object/analysis.cpp b/autogen/src/object/analysis.cpp index a93fbe6..7aab6c6 100644 --- a/autogen/src/object/analysis.cpp +++ b/autogen/src/object/analysis.cpp @@ -162,7 +162,7 @@ static void processClass(CXCursor cur, AnalysisState* state, std::string classNa anly.name = className; anly.baseClass = baseClass; - anly.headerPath = headerPath; + anly.headerPath = string_of(headerPath); // Add misc flags and options auto instanceDef = findAnnotation(cur, "OB::def_inst"); diff --git a/autogen/src/util.cpp b/autogen/src/util.cpp index aeb9be5..2aeea91 100644 --- a/autogen/src/util.cpp +++ b/autogen/src/util.cpp @@ -108,4 +108,8 @@ std::optional findAnnotation(CXCursor cur, std::string annotationNa return CXChildVisit_Break; }); return ret; +} + +std::string string_of(std::filesystem::path path) { + return path.string(); } \ No newline at end of file diff --git a/autogen/src/util.h b/autogen/src/util.h index a95d181..21b80c0 100644 --- a/autogen/src/util.h +++ b/autogen/src/util.h @@ -5,6 +5,7 @@ #include #include #include +#include typedef std::function X_CXCursorVisitor; @@ -19,4 +20,6 @@ std::string x_clang_toString(CXString string); // "name": "Hello!", "world": "Test", "read_only": "" std::map parseAnnotationString(std::string src); -std::optional findAnnotation(CXCursor cur, std::string annotationName); \ No newline at end of file +std::optional findAnnotation(CXCursor cur, std::string annotationName); + +std::string string_of(std::filesystem::path path); \ No newline at end of file