Skip to content

إصلاح بناء ويندوز في السحابة: ترميز UTF-8 صريح وعدّاء مستضاف - #302

Merged
Shad7ows merged 8 commits into
alifcommunity:mainfrom
SalehKadah:ci/utf8-windows
Sep 9, 2026
Merged

Shad7ows merged 8 commits into
alifcommunity:mainfrom
SalehKadah:ci/utf8-windows

Conversation

@SalehKadah

@SalehKadah SalehKadah commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

نحن فريق محراب — بيئةُ تطويرٍ عربيّة شحنّا فيها إضافةَ لغة ألف ومفسِّرَها.

Important

حُدِّث بعد مراجعة @Shad7ows. كان الطلبُ يحمل خمسَ مسائلَ في تسعةِ ملفّاتٍ و٢٤٧ سطراً. عملاً بقاعدتكم «طلبٌ واحدٌ لمشكلةٍ واحدةٍ محدَّدة» صار خمسةَ ملفّاتٍ و٤٦ سطراً، كلُّها ملفّاتُ ويندوز، ويحلّ مشكلةً واحدة: بناءُ ويندوز في السحابة لا يُترجَم.

ما فيه

الملفّ التغيير
winBuild/Alif.vcxproj · AlifCore.vcxproj · FreezeModule.vcxproj /utf-8 في التهيئاتِ الأربعِ لكلٍّ منها (١٢ سطراً)
.github/workflows/msbuild.yml عدّاءٌ مستضافٌ بدل الذاتيّ · setup-msbuild@v2 · زرُّ تشغيلٍ يدويّ
source/FreezeModule/FreezeModule.cpp wmain ليصل المسارُ العربيُّ إلى FreezeModule سليماً

لماذا /utf-8 ضروريّ

في FormatterUStr.cpp حالاتُ switch مكتوبةٌ L'ف' وL'ه' وL'ط'. حين يُقرأ المصدرُ بصفحةِ ترميزٍ غير UTF-8 تنهار الأحرفُ إلى بايتِها الأوّلِ فتتكرّر قيمُ الحالاتِ وتُرفض الترجمة.

مقيسٌ على جهازٍ صفحةُ ترميزه ANSI هي ‏1255:

origin/main                → error C2196: case value '63629' already used
هذا الفرع                  → BUILD=0، ترجمةٌ نظيفةٌ من الصفر

فالعلّةُ ليست خاصّةً بالعدّاء: تصيب كلَّ من يبني من الشجرةِ على نظامٍ صفحتُه ليست عربيّة.

ولماذا wmain

البناءُ نفسُه يستدعي FreezeModule.exe بمسارٍ عربيّ:

FreezeModule.exe GetPath "…\source\Modules\تحديد_المسارات.alif" GetPath.h

والمعاملاتُ تصل إلى main بترميزِ صفحةِ النظام، فتتحوّل الحروفُ العربيّةُ إلى ? ويفشل فتحُ الملفّ. الشيفرةُ هنا هي التي اقترحها @Shad7ows حرفيّاً، وزيادةُ سطرٍ واحد:

if (n <= 0) return 2;

بدونه يبقى argv[i] غيرَ مهيّأٍ حين يفشل WideCharToMultiByte (نصُّ UTF-16 غيرُ صالح) ثمّ يُستعمَل مساراً.

النتيجة

ويندوز ٢/٢ على هذا الرأس — ‏Debug و‏Release.

ولا يمسّ الطلبُ لينكس ولا ماك في شيء، فملفُّ سيرِ عملهما خارجَه.

ما أُخرِج إلى طلباتٍ لاحقة

استجابةً للمراجعة، ولم يُحذف بل نُقل:

  1. source/AlifCore/Objects/Import.cpp — دوالُّ المسار العريضة. وهذا أوْلاها بالتقديم، لأنّ الطلبَ الحاليَّ يُصلح الترجمةَ لا التشغيل. مقيسٌ على الجهازِ نفسِه (صفحة ‏1255):

    الحال الترجمة التشغيل
    origin/main تفشل (‏C2196)
    هذا الفرع تنجح خطأُ تجزئةٍ عند أوّلِ نصّ
    هذا الفرع + Import.cpp تنجح مرحبا بالعالم

    أي أنّ stat وfopen لا تريان المكتبةَ العربيّةَ الاسمِ على نظامٍ صفحتُه ليست عربيّة. ليس انحداراً — main أسوأُ حالاً — لكنّ «إصلاحَ بناءِ ويندوز» يبقى ناقصاً بلا هذا.

  2. linuxBuild/Makefile-finput-charset و-fexec-charset لِـgcc، مشروطَين بألّا يكون المترجمُ clang (فclang لا يقبل الثاني وتفشل الترجمةُ على ماك).

  3. .github/scripts/run_check.sh وخطواتُ «تشغيل ما بُني» — الأخضرُ يعني «تُرجم» لا «يعمل».

نفتحها في الترتيب الذي ترونه.

Sad Lang Dev and others added 5 commits September 4, 2026 14:29
الشيفرة المصدرية تحوي نصوصاً عربية داخلها - رسائل ومعرّفات وحالات switch
مكتوبة بأحرف عربية - وهي محفوظة بترميز UTF-8 بلا علامة BOM. وحين لا يُذكر
الترميز صريحاً يقرؤها المترجم بصفحة ترميز النظام:

  FormatterUStr.cpp(221): error C2196: case value '217' already used

لأن L'ف' و L'ه' يبدآن كلاهما بالبايت D9 فينهاران إلى القيمة نفسها. فعلى
جهاز صفحته عربية يمر البناء، وعلى غيره يفشل بعشرين خطأ. لذا يضاف /utf-8
إلى تهيئات الترجمة الاثنتي عشرة، وعلمان مقابلان في Makefile - لـ gcc وحده،
فـ clang يعامل المصدر بـ UTF-8 دائماً ويرفض -fexec-charset فتفشل ترجمة ماك.

ويبقى بعد ذلك موضع ثالث: FreezeModule يتلقى مسار الوحدة المراد تجميدها من
سطر الأوامر، وويندوز يسلّم المعاملات إلى main بترميز صفحة النظام، فتتحول
حروف اسم الملف العربية إلى '?' ويفشل فتحه في حدث ما بعد البناء. فتُستقبل
عريضة عبر wmain وتُحوّل إلى UTF-8، ويُضبط ترميز مكتبة C على UTF-8 حتى تقبل
fopen المسارات العربية.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
سير بناء ويندوز كان مربوطاً بـ runs-on: [Win-MSBuild]، وهو عداء ذاتي
الاستضافة لا يلتقط الوظائف إلا حين يكون جهازه متصلاً - فيبقى فحص ويندوز في
الفروع وطلبات الدمج الواردة معلقاً بلا رسالة ولا مهلة انتهاء. وفيه أيضاً
أن شيفرة الطلبات الواردة من المتفرعات تُنفَّذ على ذلك الجهاز.

ومع النقل إلى windows-latest:
- تُرقّى setup-msbuild من v1.0.2 إلى v2، فالقديمة تعتمد إصداراً من Node لم
  يعد مدعوماً على العدّاءات.
- تُذكر المنصة x64 صراحةً بدل الاتكال على التهيئة الافتراضية في الحل. ويستحق
  الانتباه أن تهيئة Release|Win32 في FreezeModule.vcxproj وحدها بلا
  PostBuildEvent، فمن بنى بها لا يتولد عنده GetPath.h.
- يُحذف working-directory لأنه يشير إلى env.GITHUB_WORKSPACE، وهي متغير بيئة
  افتراضي لا مفتاح في سياق env، فيتمدد فارغاً.
- يُضاف workflow_dispatch إلى سيري العمل ليشغّل المشرف البناء يدوياً على أي
  فرع قبل أن يفتح طلب دمج.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
البناء الأخضر يثبت أن الشيفرة تُرجمت، لا أن المفسّر يعمل. وعلة الترميز
بالذات تمر من الترجمة ثم تظهر عند التشغيل: اسم ملف لا يُفتح، أو نص عربي
يُطبع مشوهاً. فيُضاف فحص يشغّل الأمثلة المتعقّبة في git، ثم يكتب ملفاً
عربي الاسم والمحتوى ويتحقق من أن المطبوع هو ما كُتب.

ويجهّز الفحص حزمة كما تُشحن - المفسّر ومكتبته وأمثلته في مجلد واحد - ثم
يشغّل منها، لا من مجلد البناء: المفسّر يحتاج library بجواره.

وهو مقصور على لينكس وماك: بناء ويندوز يخرج بالرمز 1 بلا أي مخرَج على هذه
الشجرة، حتى لبرنامج من سطر واحد، فتشغيله غير مغطّى هنا.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
المستورد يفتح مسارات UTF-8 بدوال ضيقة، وهي على ويندوز تفسّر البايتات
بصفحة النظام (ANSI) لا بـUTF-8. ومكتبة الإقلاع library/نظام_التشغيل.aliflib
اسمها عربي، فلا تراها الدوال الضيقة على نظام صفحته ليست 65001، ويموت
الإقلاع قبل قراءة أي وسيط: رمز الخروج 1 بلا حرف على المخرج أو الخطأ.

قيس على windows-latest من هذه الشجرة قبل الرقعة: ست صور تشغيل (من جذر
المستودع، ومن حزمة فيها library جنب التنفيذي، بمسار نسبي ومطلق، عبر bash
وعبر cmd، وبلا وسائط أصلاً) كلها رمز 1 وصفر بايت، وثمانية اختبارات من
ثمانية فاشلة.

ثلاثة مواضع، وكل واحد منها لازم قيس أثره:
- path_fopen: فتح المكتبة عربية الاسم، وبها وحدها يقلع المفسّر (7/8)
- path_stat: كشف مجلد الحزمة عربي الاسم، فـGetFileAttributesW بدل stat
- case_ok: مطابقة __تهيئة__.aliflib بعد إيجاد المجلد، بـMultiByteToWideChar
  بدل mbstowcs، وبمقارنة تامة بدل wcsncmp بطول بايتي كان يقبل أي اسم
  يكون المطلوب سابقة له

الأخيران يظهر أثرهما في examples/Status.alif وحده لأنه المثال الوحيد الذي
يستورد حزمة من مجلدات عربية (examples/مكتبة/فرعية)، فبدونهما 7/8 وبهما 8/8.

التغيير كله محجوب بـ#ifdef _WINDOWS، وفرع غير ويندوز يبقى stat و fopen
كما كانا لأن المسارات هناك بايتات UTF-8 أصلاً.
فحص التشغيل كان يعمل على لينكس وماك دون ويندوز، وويندوز أولى المنصات به:
علة الترميز تمر من الترجمة ثم تظهر عند التشغيل، فبناء أخضر لا يعني مفسّراً
عاملاً. وبعد رقعة الدوال العريضة صار يمر: ثمانية اختبارات من ثمانية في
Release و Debug، وهي الأمثلة السبعة المتعقّبة في تخطيط الحزمة كما تُشحن،
وملف عربي الاسم والمحتوى.

وبناء Debug يفعّل AddressSanitizer فيعتمد على clang_rt.asan_dynamic-x86_64.dll
وهي في مجلد أدوات MSVC لا في مسار النظام، فيخرج التنفيذي بالرمز 127 قبل أن
يبدأ. فتُضاف إلى المسار بدل تعطيل ASAN.

وصُحّح تعليقان كانا يقولان ما لم يُقس:
- الحل يسمّي المنصتين x86 و x64، و Win32 اسم على مستوى المشاريع لا الحل،
  فتمريره إلى الحل يُرفض قبل أي ترجمة. لا علاقة للأمر بـPostBuildEvent.
- فشل التشغيل من شجرة البناء على ويندوز لم يكن لغياب library بالجوار، بل
  لأن المستورد كان يفتح المكتبة عربية الاسم بدالة ضيقة.
@SalehKadah
SalehKadah marked this pull request as ready for review September 4, 2026 21:50

@Shad7ows Shad7ows left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

تمت المراجعة مع إقتراح بعض التعديلات
ملاحظة: يرجى عدم رفع أكثر من حالة في نفس الطلب وكل منها تحل مشكلة معينة, ويفضل أن يحل الطلب مشكلة واحدة محددة جدا ليتم مراجعتها واختبارها بشكل اسرع وافصل

Comment thread .github/scripts/run_check.sh Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

يرجى حذف هذا الجزء

Comment thread .github/workflows/makebuild.yml Outdated
run: cd linuxBuild && make ${{matrix.BUILD-CONFIGURATION}}

# البناء يثبت أن الشيفرة تُرجمت لا أن المفسّر يعمل، فنشغّل ما بُني
- name: تشغيل ما بُني

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

يرجى حذف هذا الجزء

Comment thread .github/workflows/makebuild.yml Outdated
run: cd linuxBuild && make ${{matrix.BUILD-CONFIGURATION}}

# البناء يثبت أن الشيفرة تُرجمت لا أن المفسّر يعمل، فنشغّل ما بُني
- name: تشغيل ما بُني

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

يرجى حذف هذا الجزء

Comment thread .github/workflows/msbuild.yml Outdated
branches: ["main"]
pull_request:
branches: ["main"]
# زر تشغيل يدوي: يتيح تجربة البناء على أي فرع بلا فتح طلب دمج.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

يرجى حذف التعليقات

Comment thread .github/workflows/msbuild.yml Outdated
jobs:
build:
runs-on: [Win-MSBuild]
# عداء مستضاف لدى GitHub بدل عداء ذاتي الاستضافة: الذاتي لا يلتقط

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

يرجى حذف التعليقات

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

يرجى حذف هذا الجزء

Comment thread winBuild/Alif.vcxproj

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

تمت المراجعة والإعتماد

Comment thread winBuild/AlifCore.vcxproj

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

تمت المراجعة والإعتماد

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

تمت المراجعة والإعتماد

Comment thread source/FreezeModule/FreezeModule.cpp Outdated
Comment on lines +189 to +205
#ifdef _WINDOWS
/* على ويندوز تصل المعاملات إلى main بترميز صفحة النظام (ANSI)، فتتحول
الحروف العربية في اسم الملف ولاحقته إلى '?' ويفشل فتح الملف على كل نظام
لغته ليست العربية. لذا نستقبلها عريضة عبر wmain ونحولها إلى UTF-8،
ونضبط ترميز مكتبة C على UTF-8 حتى تقبل fopen المسارات العربية. */
static char* utf8_fromWide(const wchar_t* _wide) {
int size = WideCharToMultiByte(CP_UTF8, 0, _wide, -1, nullptr, 0, nullptr, nullptr);
if (size <= 0) return nullptr;
char* out = (char*)malloc((size_t)size);
if (out == nullptr) return nullptr;
if (WideCharToMultiByte(CP_UTF8, 0, _wide, -1, out, size, nullptr, nullptr) <= 0) {
free(out);
return nullptr;
}
return out;
}
#endif

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

نقل هذا الجزء إلى أسفل freeze_main

@Shad7ows Shad7ows left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

تعديل مقترح

Comment thread source/FreezeModule/FreezeModule.cpp
SalehKadah and others added 2 commits September 6, 2026 17:11
استجابةً لمراجعة Shad7ows، ورئيسُها: «لا ترفع أكثر من حالة في نفس الطلب».
الطلب الآن يحل مشكلة واحدة محددة — فشل بناء ويندوز في السحابة بسبب
الترميز — ويتقلص من تسعة ملفات و٢٤٧ سطراً إلى ستة ملفات و٤٧ سطراً.

نُقل إلى طلبات لاحقة:
- .github/scripts/run_check.sh وخطوات «تشغيل ما بُني» الثلاث
- إضافة -finput-charset/-fexec-charset في linuxBuild/Makefile
- دوال المسار العريضة في source/AlifCore/Objects/Import.cpp
- خطوة إضافة وقت تشغيل ASAN إلى المسار (تابعة لـ run_check)

ونُفذت الملاحظات السطرية:
- حذف التعليقات من msbuild.yml
- إعادة working-directory إلى خطوة Build
- حذف /p:Platform=x64. اختُبر: msbuild بلا تحديد منصة يبني إلى x64
  ويخرج بالرمز صفر، فالإضافة كانت زائدة.
- تبسيط wmain كما اقتُرح، وسقطت معه الدالة المساعدة utf8_fromWide
  فلم تعد هناك حاجة لنقلها. أُبقي فحص واحد على قيمة WideCharToMultiByte
  الأولى: بدونه يبقى argv[i] غير مهيأ حين تفشل (نص UTF-16 غير صالح)
  ثم يُستعمل مساراً.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
مراجعةٌ داخليّةٌ ثانيةٌ للطلب بعد تطبيق ملاحظات Shad7ows الست عشرة كشفت
ثلاثة أمور، اثنان منها يخالفان مبدأه المعلن «طلب واحد لمشكلة واحدة»:

- `.github/workflows/makebuild.yml` كان تغييره الوحيد الباقي سطر
  `workflow_dispatch` — ملف سير عمل لينكس وماك في طلب عنوانه بناء ويندوز.
  لا علاقة له بالترميز، فأُخرج. والملف الآن خارج الطلب كلّه، فلم تبق فيه
  إلا ملفات ويندوز: ثلاثة vcxproj و msbuild.yml و FreezeModule.cpp.

- التعليق فوق `wmain` كان قبل `#ifdef _WINDOWS`، فيبقى في بناء لينكس وماك
  حيث لا معنى له. نُقل داخل الشرط.

وبقي `workflow_dispatch` في `msbuild.yml` عمداً: هو تشغيل يدوي لبناء
ويندوز نفسه، والمراجع علّق على السطر الذي فوقه مباشرة فطلب حذف التعليق
دون السطر.

و`runs-on: windows-latest` باق أيضاً: عنوان الطلب يذكر «وعدّاء مستضاف»
صراحةً، فهو معلن لا مهرَّب، وبدونه لا تعمل وظيفة ويندوز في السحابة أصلاً
وهي موضوع الطلب.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@SalehKadah

Copy link
Copy Markdown
Contributor Author

شكراً على المراجعةِ الدقيقة @Shad7ows. نُفِّذت الملاحظاتُ الستَّ عشرةُ كلُّها.

@Shad7ows Shad7ows left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

تمت مراجعة التصحيحات المقدمة وقد تم إعتمادها
يوجد بعض الملاحظات البسيطة التي تتطلب العمل عليها قبل دمج الطلب

Comment thread source/FreezeModule/FreezeModule.cpp Outdated

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

بما أنه لا يتم إستخدامها إلا مع ويندوز, يفضل نقلها لداخل وسم تعريف ويندوز
#ifdef _WINDOWS

Comment thread source/FreezeModule/FreezeModule.cpp Outdated
Comment on lines +235 to +236
/* تصل المعاملات إلى main بترميز صفحة النظام، فتتحول الحروف العربية في
المسار إلى '?' ويفشل فتح الملف على نظام لغته ليست العربية. */

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

هذا التعليق غير ضروري فالبرنامج يشرح نفسه
يرجى حذفه

- `locale.h` تدخل `#ifdef _WINDOWS`: لا تُستعمل إلا في `wmain` وهي كلها
  داخل الوسم، فكانت تُحمَّل على لينكس وماك بلا مستعمل واحد.
- حذف التعليق فوق `wmain`.

لا شيء غيرهما: أربعة أسطر في الأثر. البناء نظيف (`BUILD=0`).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@SalehKadah

Copy link
Copy Markdown
Contributor Author

شكرا على المراجعة ، تفذ الملاحظتين

@Shad7ows Shad7ows left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

تمت المراجعة والموافقة على دمج الطلب

@Shad7ows
Shad7ows merged commit a799ff8 into alifcommunity:main Sep 9, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants