#536 Alternative Kompilationsmöglichkeit unter Windows ohne Visual Studio / WDK

Open
opened 4 months ago by steffen23 · 7 comments

Dieses Issue ist eine Anleitung, um Neo ohne Visual Studio, alleine mit dem MKLC, zu kompilieren.

Der Microsoft Keyboard Layout Creator (MKLC) 1.4, hier frei verfügbar, ermöglicht es, Keyboard Layouts per GUI zu erzeugen. Für Neo ist er leider nicht geeignet, da einige Tasten nicht geändert werden können, u.a. CapsLock.

Installation

Allerdings basiert der MKLC intern auch auf dem Windows Driver Kit. Nach seiner Installation finden sich (fast?) alle benötigten Header und Libraries unter C:\Program Files (x86)\Microsoft Keyboard Layout Creator 1.4. Auch alle benötigten Binaries rc.exe, cl.exe und link.exe sind in der Installation enthalten. Die Installation ist sehr kompakt, nur 25MB.

MKLC ruft den Compiler intern auf, es gibt auch ein Kommandozeilentool, das die für Neo unzureichenden .klc Dateien zu DLLs kompiliert:

kbdutool.exe -u -x my_layout.klc

In diesem Blog wird beschrieben, wie man die korrekten Kommandos extrahieren kann: https://levicki.net/articles/2006/09/29/HOWTO_Build_keyboard_layouts_for_Windows_x64.php

Für ein Arabisches Layout hat sich PromyLOph die Mühe gemacht, ein Makefile zu erstellen 4679f89e8f/README.rst

Das Makefile ist nicht direkt im Code enthalten, man muss erst ninja ausführen:

./gen.sh > build.ninja && ninja ninja _build/_temp/winkbd/customization.h ninja _build/report/ar-lulua-w64.zip

Die Kommandos funktionieren nicht zu 100%, da einige Dateien wie im Blog beschrieben fehlen, aber danach findet sich die Datei make.bat im Ordner _build/_temp/winkbd/. Um Euch die Arbeit zu ersparen, habe ich make.bat angefügt. Es müssen nur die Dateinamen angepasst werden, kbdneo2 statt kbdarlulua und kbdneo2.XYZ statt keyboard.XYZ.

make.bat benutzt den Compiler, der mit MKLC mitgeliefert wird.

Treiber kompilieren

Um den Windows 10 Treiber zu kompilieren sind die folgenden Schritte nötig:

  1. Installiere MKLC von https://www.microsoft.com/en-us/download/details.aspx?id=22339
  2. git clone https://git.neo-layout.org/neo/neo-layout/ in Arbeitsverzeichnis
  3. cd neo-layout\windows\kbdneo2\Quelldateien
  4. Kopiere angefügte Datei make.bat nach Quelldateien
  5. Überprüfe, daß der Pfad in make.bat für MKLC korrekt ist: SET MSKLC="C:\Program Files (x86)\Microsoft Keyboard Layout Creator 1.4"
  6. #include <dontuse.h> in kbdneo2.c auskommentieren
  7. Fehlende Headerdateien nach Quelldateien entpacken. Die Dateien kommen ursprünglich von mingw64. Wer einen Kompiler installiert hat, kann stattdessen den entsprechenden Pfad setzen.
  8. make.bat ausführen. Der Treiber kbdneo2.dll ist danach im Ordner system32 zu finden.
  9. Den Treiber nach %windir%/system32 kopieren.
  10. Einen Registrierungseintrag anpassen. Der Einfachheit den für Dvorak unter Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00010409\Layout file auf kbdneo2.dll ändern.
  11. Test: MKLC aufrufen. File|Load Existing Keyboard. Wenn der Treiber nicht auf der Liste erscheint, dann stimmt etwas nicht.
  12. Installation im System: Hier hat sich leider einiges in der Systemsteuerung geändert und die klassischen Menüs im Control Panel gibt es nicht mehr. Auf meinem System ist dies unter „Language Preferences“, „Preferred Language“, „Options“, „Add a Keyboard“.

Ich bekomme bei Schritt 8 jetzt eine Warnung, die vorher nur bei der 32-Bit-Variante aufgetreten ist. Der Treiber scheint aber trotzdem zu funktionieren.

“C:\Program Files (x86)\Microsoft Keyboard Layout Creator 1.4”\bin\i386\link.exe -nologo -base:0x5FFE0000 -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re -MERGE:_PAGE=PAGE -MERGE:_TEXT=.text -MACHINE:AMD64 -SECTION:INIT,d -OPT:REF -OPT:ICF -IGNORE:4039,4078 -noentry -dll -subsystem:native,5.2 -merge:.rdata=.text -PDBPATH:NONE -STACK:0x40000,0x1000 /opt:nowin98 -debugtype:cv,fixup -debug -osversion:5.2 -version:5.2 /release -def:kbdneo2.def -out:system32\kbdneo2.dll kbdneo2.res kbdneo2.obj || exit /b

Creating library system32\kbdneo2.lib and object system32\kbdneo2.exp
LINK : warning LNK4254: section ‘.edata’ (40000040) merged into ‘.data’ (C0000040) with different attributes
LINK : warning LNK4254: section ‘.rdata’ (40000040) merged into ‘.data’ (C0000040) with different attributes
LINK : warning LNK4254: section ‘.text’ (60000020) merged into ‘.data’ (C0000040) with different attributes
LINK : warning LNK4254: section ‘.bss’ (C0000080) merged into ‘.data’ (C0000040) with different attributes
LINK : warning LNK4253: section ‘.rdata’ not merged into ‘.text’; already merged into ‘.data’

Dieses Issue ist eine Anleitung, um Neo ohne Visual Studio, alleine mit dem MKLC, zu kompilieren. Der Microsoft Keyboard Layout Creator (MKLC) 1.4, [hier frei verfügbar](https://www.microsoft.com/en-us/download/details.aspx?id=22339), ermöglicht es, Keyboard Layouts per GUI zu erzeugen. Für Neo ist er leider nicht geeignet, da einige Tasten nicht geändert werden können, u.a. CapsLock. ## Installation Allerdings basiert der MKLC intern auch auf dem Windows Driver Kit. Nach seiner Installation finden sich (fast?) alle benötigten Header und Libraries unter `C:\Program Files (x86)\Microsoft Keyboard Layout Creator 1.4`. Auch alle benötigten Binaries `rc.exe`, `cl.exe` und `link.exe` sind in der Installation enthalten. Die Installation ist sehr kompakt, nur 25MB. MKLC ruft den Compiler intern auf, es gibt auch ein Kommandozeilentool, das die für Neo unzureichenden .klc Dateien zu DLLs kompiliert: ``` kbdutool.exe -u -x my_layout.klc ``` In diesem Blog wird beschrieben, wie man die korrekten Kommandos extrahieren kann: https://levicki.net/articles/2006/09/29/HOWTO_Build_keyboard_layouts_for_Windows_x64.php Für ein Arabisches Layout hat sich PromyLOph die Mühe gemacht, ein Makefile zu erstellen 4679f89e8f/README.rst Das Makefile ist nicht direkt im Code enthalten, man muss erst ninja ausführen: ``` ./gen.sh > build.ninja && ninja ninja _build/_temp/winkbd/customization.h ninja _build/report/ar-lulua-w64.zip ``` Die Kommandos funktionieren nicht zu 100%, da einige Dateien wie im Blog beschrieben fehlen, aber danach findet sich die Datei make.bat im Ordner `_build/_temp/winkbd/`. Um Euch die Arbeit zu ersparen, habe ich make.bat angefügt. Es müssen nur die Dateinamen angepasst werden, kbdneo2 statt kbdarlulua und kbdneo2.XYZ statt keyboard.XYZ. `make.bat` benutzt den Compiler, der mit MKLC mitgeliefert wird. ## Treiber kompilieren Um den Windows 10 Treiber zu kompilieren sind die folgenden Schritte nötig: 1. Installiere MKLC von https://www.microsoft.com/en-us/download/details.aspx?id=22339 2. `git clone https://git.neo-layout.org/neo/neo-layout/` in Arbeitsverzeichnis 3. `cd neo-layout\windows\kbdneo2\Quelldateien` 4. Kopiere angefügte Datei make.bat nach Quelldateien 5. Überprüfe, daß der Pfad in make.bat für MKLC korrekt ist: `SET MSKLC="C:\Program Files (x86)\Microsoft Keyboard Layout Creator 1.4"` 6. `#include <dontuse.h>` in kbdneo2.c auskommentieren 7. Fehlende Headerdateien nach Quelldateien entpacken. Die Dateien kommen ursprünglich von mingw64. Wer einen Kompiler installiert hat, kann stattdessen den entsprechenden Pfad setzen. 8. make.bat ausführen. Der Treiber kbdneo2.dll ist danach im Ordner system32 zu finden. 9. Den Treiber nach `%windir%/system32` kopieren. 10. Einen Registrierungseintrag anpassen. Der Einfachheit den für Dvorak unter `Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00010409\Layout file` auf kbdneo2.dll ändern. 11. Test: MKLC aufrufen. File|Load Existing Keyboard. Wenn der Treiber nicht auf der Liste erscheint, dann stimmt etwas nicht. 12. **Installation im System:** Hier hat sich leider einiges in der Systemsteuerung geändert und die klassischen Menüs im Control Panel gibt es nicht mehr. Auf meinem System ist dies unter „Language Preferences“, „Preferred Language“, „Options“, „Add a Keyboard“. Ich bekomme bei Schritt 8 jetzt eine Warnung, die vorher nur bei der 32-Bit-Variante aufgetreten ist. Der Treiber scheint aber trotzdem zu funktionieren. > "C:\Program Files (x86)\Microsoft Keyboard Layout Creator 1.4"\bin\i386\link.exe -nologo -base:0x5FFE0000 -merge:.edata=.data -merge:.rdata=.data -merge:.text=.data -merge:.bss=.data -section:.data,re -MERGE:_PAGE=PAGE -MERGE:_TEXT=.text -MACHINE:AMD64 -SECTION:INIT,d -OPT:REF -OPT:ICF -IGNORE:4039,4078 -noentry -dll -subsystem:native,5.2 -merge:.rdata=.text -PDBPATH:NONE -STACK:0x40000,0x1000 /opt:nowin98 -debugtype:cv,fixup -debug -osversion:5.2 -version:5.2 /release -def:kbdneo2.def -out:system32\kbdneo2.dll kbdneo2.res kbdneo2.obj || exit /b > > Creating library system32\kbdneo2.lib and object system32\kbdneo2.exp > LINK : warning LNK4254: section '.edata' (40000040) merged into '.data' (C0000040) with different attributes > LINK : warning LNK4254: section '.rdata' (40000040) merged into '.data' (C0000040) with different attributes > LINK : warning LNK4254: section '.text' (60000020) merged into '.data' (C0000040) with different attributes > LINK : warning LNK4254: section '.bss' (C0000080) merged into '.data' (C0000040) with different attributes > LINK : warning LNK4253: section '.rdata' not merged into '.text'; already merged into '.data'
qwertfisch added the
Treiber/Windows/kbdneo
label 4 months ago
qwertfisch changed title from Alternative Kompilationsmöglichkeit unter Windows ohne Visual Studio DDK (nur zur Info) to Alternative Kompilationsmöglichkeit unter Windows ohne Visual Studio / WDK 4 months ago
mi-skam commented 3 months ago

Hi,

einiges in der Anleitung war nicht ganz so wie in meinem Ordner.

  1. statt cd neo-layout\windows\kbdneo2\Quelldateien habe ich folgende Ordnerstruktur cd windows\kbdneo2\source\kbdneo2 (Punkt 3)
  2. #include <dontuse.h> wird in kbdneo.h nicht in kbdneo.c referenziert (Punkt 6)
  3. Den Treiber habe ich neben windows\system32 auch noch in den Ordner für 32-Bit-Anwendungen windows\SysWOW64 kopiert
Hi, einiges in der Anleitung war nicht ganz so wie in meinem Ordner. 1. statt `cd neo-layout\windows\kbdneo2\Quelldateien` habe ich folgende Ordnerstruktur `cd windows\kbdneo2\source\kbdneo2` (Punkt 3) 2. `#include <dontuse.h>` wird in `kbdneo.h` nicht in `kbdneo.c` referenziert (Punkt 6) 3. Den Treiber habe ich neben `windows\system32` auch noch in den Ordner für 32-Bit-Anwendungen `windows\SysWOW64` kopiert
qwertfisch commented 3 months ago
Owner

Danke für die Hinweise.

Die Anleitung bezog sich auf den Quellcode der früheren Version. Verzeichnisnamen habe ich angepasst mit dem neuen Projekt. Der Quellcode ist aber (erstmal) identisch.

Danke für die Hinweise. Die Anleitung bezog sich auf den Quellcode der [früheren Version](https://git.neo-layout.org/neo/neo-layout/src/branch/master/windows/kbdneo2/legacy_source). Verzeichnisnamen habe ich angepasst mit dem neuen Projekt. Der Quellcode ist aber (erstmal) identisch.
qwertfisch commented 3 months ago
Owner

In Commit d3a8e148 habe ich eine Möglichkeit bereitgestellt, kbdneo/kbdbone/kbdqwertz zu kompilieren, ohne ein Visual Studio oder das Windows Driver Kit installieren zu müssen. Dafür sind entsprechende Buildskripte hinzugekommen.

Benötigt werden dabei nur noch das normale Windows SDK sowie die Visual Studio Build Tools (deutlich kleiner). Die Beschreibung steht in der README im Abschnitt „Manueller Build“.

In Commit d3a8e148 habe ich eine Möglichkeit bereitgestellt, kbdneo/kbdbone/kbdqwertz zu kompilieren, ohne ein Visual Studio oder das Windows Driver Kit installieren zu müssen. Dafür sind entsprechende Buildskripte hinzugekommen. Benötigt werden dabei nur noch das normale Windows SDK sowie die Visual Studio Build Tools (deutlich kleiner). Die Beschreibung steht in der [README](src/branch/master/windows/kbdneo2/) im Abschnitt „Manueller Build“.

Ich bin Autor des oben genannten arabischen Layouts und selber auch Neo2-Nutzer. Ursprünglich war meine Hoffnung die DLL für Windows unter Linux mit dem GCC cross-compilieren zu können, wodurch ich den gesamten Prozess hätte automatisieren können. Aber a) fehlen die Header und b) kenne ich leider die benötigten Compileroptionen nicht – Windows ist da sehr wählerisch und akzeptiert nicht jede beliebige DLL. a) könnte man durch Kopieren der MSKLC-Header lösen (mit Anpassungen). Wenn jemand für b) eine Lösung hat, dann wäre ich sehr interessiert.

Ich bin Autor des oben genannten [arabischen Layouts](https://6xq.net/لؤلؤة/) und selber auch Neo2-Nutzer. Ursprünglich war meine Hoffnung die DLL für Windows unter Linux mit dem GCC cross-compilieren zu können, wodurch ich den gesamten Prozess hätte automatisieren können. Aber a) fehlen die Header und b) kenne ich leider die benötigten Compileroptionen nicht – Windows ist da sehr wählerisch und akzeptiert nicht jede beliebige DLL. a) könnte man durch Kopieren der MSKLC-Header lösen (mit Anpassungen). Wenn jemand für b) eine Lösung hat, dann wäre ich sehr interessiert.
qwertfisch commented 1 week ago
Owner

Hast Du den Beitrag über dir gelesen? Ich hatte ein bisschen mit den Buildoptionen vom Visual Studio experimentiert und bin schließlich, ausgehend von den Standardoptionen, auf eine funktionierende Konfiguration gekommen. Notwendig für die Kompilierung sind nun ausschließlich der Compiler, der Resource Compiler und der Linker, die sich in den Visual Studio Build Tools befinden. Siehe auch hier (Variante 2) sowie im unterliegenden build/-Ordner.

Ob man das auch unter Linux bauen kann, ist fraglich. Es werden einige Libraries und Headerdateien aus dem Windows 10 SDK benötigt (siehe Buildskript). Eventuell kannst Du die von einer Windows-Installation rüberkopieren. Problem (b) wiederum sollte nun durch die Kommandos nachvollziehbar sein, wobei ich nicht alle explizit identifiziert habe. Da müsstest Du ggf. die Dokumentation dazu bemühen. Die meisten Optionen sind eben VS-Standard, nur entsprechend angepasst, dass eine schlanke DLL herauskommt.

Sinnvoll wäre es wohl, den GCC (und das SDK) auf Windows zu installieren und damit zu experimentieren, bis das Ergebnis übereinstimmt.

Hast Du den Beitrag über dir gelesen? Ich hatte ein bisschen mit den Buildoptionen vom Visual Studio experimentiert und bin schließlich, ausgehend von den Standardoptionen, auf eine funktionierende Konfiguration gekommen. Notwendig für die Kompilierung sind nun ausschließlich der Compiler, der Resource Compiler und der Linker, die sich in den Visual Studio Build Tools befinden. Siehe auch [hier](https://git.neo-layout.org/neo/neo-layout/src/branch/master/windows/kbdneo2) (Variante 2) sowie im unterliegenden build/-Ordner. Ob man das auch unter Linux bauen kann, ist fraglich. Es werden einige Libraries und Headerdateien aus dem Windows 10 SDK benötigt (siehe Buildskript). Eventuell kannst Du die von einer Windows-Installation rüberkopieren. Problem (b) wiederum sollte nun durch die Kommandos nachvollziehbar sein, wobei ich nicht alle explizit identifiziert habe. Da müsstest Du ggf. die Dokumentation dazu bemühen. Die meisten Optionen sind eben VS-Standard, nur entsprechend angepasst, dass eine schlanke DLL herauskommt. Sinnvoll wäre es wohl, den GCC (und das SDK) auf Windows zu installieren und damit zu experimentieren, bis das Ergebnis übereinstimmt.
PromyLOPh commented 1 week ago

Ob man das auch unter Linux bauen kann, ist fraglich. Es werden einige Libraries und Headerdateien aus dem Windows 10 SDK benötigt (siehe Buildskript). Eventuell kannst Du die von einer Windows-Installation rüberkopieren. Problem (b) wiederum sollte nun durch die Kommandos nachvollziehbar sein, wobei ich nicht alle explizit identifiziert habe. Da müsstest Du ggf. die Dokumentation dazu bemühen. Die meisten Optionen sind eben VS-Standard, nur entsprechend angepasst, dass eine schlanke DLL herauskommt.

Der einzige benötigte Header ist eine abgespeckte Variante von kbd.h, Bibliotheken überhaupt keine (sind ja nur Daten), ein paar Compileroptionen und ein Linkerskript. Ich habe es jetzt mit der Hilfe von ReactOS implementiert: 1b6e5b491a
Inspiration war: https://github.com/reactos/reactos/blob/master/dll/keyboard/CMakeLists.txt

> Ob man das auch unter Linux bauen kann, ist fraglich. Es werden einige Libraries und Headerdateien aus dem Windows 10 SDK benötigt (siehe Buildskript). Eventuell kannst Du die von einer Windows-Installation rüberkopieren. Problem (b) wiederum sollte nun durch die Kommandos nachvollziehbar sein, wobei ich nicht alle explizit identifiziert habe. Da müsstest Du ggf. die Dokumentation dazu bemühen. Die meisten Optionen sind eben VS-Standard, nur entsprechend angepasst, dass eine schlanke DLL herauskommt. Der einzige benötigte Header ist eine abgespeckte Variante von `kbd.h`, Bibliotheken überhaupt keine (sind ja nur Daten), ein paar Compileroptionen und ein Linkerskript. Ich habe es jetzt mit der Hilfe von ReactOS implementiert: https://github.com/PromyLOPh/lulua/commit/1b6e5b491ae717eb096a7d4a68df9f772de577ae Inspiration war: https://github.com/reactos/reactos/blob/master/dll/keyboard/CMakeLists.txt
qwertfisch commented 1 week ago
Owner

Schön, dass es bereits auf anderem Wege funktioniert hat.

Schön, dass es bereits auf anderem Wege funktioniert hat.
Sign in to join this conversation.
Loading…
There is no content yet.