Compile with OCCT/de

Übersicht

Um FreeCAD mit einer bestimmten Version von OpenCASCADE (OCCT) aufzubauen, ist zuerst sicherzustellen, dass FreeCAD auf dem eigenen System mit dem Standard-OCCT kompiliert werden kann. Danach folgen diese Schritte:

  1. Den OCCT-Quellcode erhalten.
  2. OCCT konfigurieren.
  3. OCCT kompilieren.
  4. Eine Distribution (Installation) von OCCT erstellen.
  5. FreeCAD konfigurieren.
  6. FreeCAD mit Verknüpfung zur Distribution kompilieren.
  7. Wahlweise die Befehle zum Kompilieren für eine übergreifende FreeCAD/OCCT Fehlersuche zusammenfassen.

Folgend wird von einer Installation unter Linux ausgegangen, aber der Vorgang ist unter Windows oder macOS sehr ähnlich.

Den OCCT-Quellcode erhalten

Im weiteren Verlauf dieser Seite gehen wir davon aus, dass wir den OCCT-Quellcode unter /home/user/occt-main gespeichert haben. Unter dieser Voraussetzung den folgenden Befehl ausführen.

git clone https://github.com/Open-Cascade-SAS/OCCT.git /home/user/occt-main

Der Quellcode von OCCT befindet sich im Hauptzweig. Von dort aus können problemlos mehrere Arbeitszweige erstellt werden.

OCCT Konfigurieren

Um OCCT zu kompilieren, empfiehlt es sich, ein Kompilierungsverzeichnis und ein Installationsverzeichnis festzulegen, zum Beispiel:

Quellverzeichnis /home/user/occt-main
Build-Verzeichnis /scratch/build-occt-main
Installationsverzeichnis /scratch/dist-occt-main

Sobald wir das festgestellt haben, können wir eine Datei namens CMakeUserPresets.json im Stammverzeichnis des Quellverzeichnisses erstellen (dabei beachten, dass wir das Installationsverzeichnis ausdrücklich angeben müssen):

{
  "version": 3,
  "cmakeMinimumRequired": {
    "major": 3,
    "minor": 19,
    "patch": 0
  },
  "configurePresets": [
    {
      "name": "debug",
      "description": "Preset for a debug build",
      "generator": "Ninja",
      "cacheVariables": {
        "INSTALL_DIR": "/scratch/dist-occt-main",
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
        "USE_RAPIDJSON": "ON"
      }
    }
  ]
}

Jetzt, da wir OCCT konfiguriert haben, können wir die folgenden Befehle ausführen, um es zu kompilieren:

mkdir /scratch/build-occt-main
cd /scratch/build-occt-main
cmake --preset debug /home/user/occt-main

OCCT Kompilieren

Normalerweise kompiliere ich einfach mit (vorausgesetzt, ich befinde mich noch im Build-Verzeichnis):

ninja

Eine Distribution erzeugen

Um eine Distribution zu erstellen und sie im Installationsverzeichnis zu installieren, einfach den folgenden Befehl ausführen, vorausgesetzt, wir befinden uns noch im Build-Verzeichnis:

ninja install

Es ist uns nicht gelungen, OCCT so zu installieren, dass FreeCAD eine Verbindung dazu herstellen kann.

FreeCAD konfigurieren

Es kann sinnvoll sein, einen Arbeitsbaum oder ein Git-Repository anzulegen, das auf die von Ihnen verwendete OCCT-Distribution verweist. Nehmen wir also an, wir haben einen Arbeitsbaum oder ein Git-Repository mit dem Quell- und Build-Verzeichnis von FreeCAD wie folgt:

Quellverzeichnis /home/user/freecad-occt-main
Build-Verzeichnis /scratch/build-freecad-occt-main

Es ist zu beachten, dass wir kein Installationsverzeichnis benötigen, da wir FreeCAD direkt aus dem Build-Verzeichnis heraus ausführen können.

Anhand dieser Informationen können wir eine Datei CMakeUserPresets.json erstellen, die wir im Quellcode von FreeCAD ablegen:

{
  "version": 4,
  "configurePresets": [
    {
      "name": "occt",
      "displayName": "Debug build with custom OCCT",
      "description": "User-specific debug build with custom OCCT.",
      "inherits": [
	"common"
      ],
      "generator": "Ninja",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "FREECAD_USE_OCC_VARIANT": "Official Version",
        "CMAKE_PREFIX_PATH": "/scratch/dist-occt-main",
        "FREECAD_USE_PCL": "OFF",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
        "FREECAD_QT_VERSION": "6",
        "BUILD_FEM": "OFF",
        "BUILD_OPENSCAD": "OFF",
        "BUILD_REVERSEENGINEERING": "OFF",
        "BUILD_ROBOT": "OFF",
        "BUILD_POINTS": "OFF",
        "BUILD_SMESH": "OFF",
        "BUILD_WEB": "OFF",
        "BUILD_SURFACE": "ON",
        "BUILD_INSPECTION": "OFF"
      }
    }
  ]
}

Es ist zu beachten, dass wir das Installationsverzeichnis von OCCT angegeben haben. Einige Module wurden deaktiviert, um auch die Kompilierungszeit zu verkürzen.

Die Konfiguration von FreeCAD lässt sich wie folgt zusammenfassen:

mkdir /scratch/build-freecad-occt-main
cd /scratch/build-freecad-occt-main
cmake --preset occt /home/user/freecad-occt-main

Der Bericht zu OCCT muss beachtet werden. OCCT sollte in /scratch/dist-occt-main gefunden worden sein.

Wenn all dies korrekt ist, kann FreeCAD kompiliert werden.

FreeCAD kompilieren

Angenommen, wir befinden uns noch im Build-Verzeichnis, dann können wir Folgendes tun:

ninja

Wenn FreeCAD in diesem Verzeichnis gestartet wird und die Informationen sowie die Bibliotheken überprüft werden, sollte FreeCAD die OCCT-Version Ihres jeweiligen Commits im OCCT-Quellcode anzeigen.

(Optional) Die Kompilierungsbefehle zusammenführen

Wenn man FreeCAD und OCCT gleichzeitig debuggen möchte, muss das Entwicklungswerkzeug die Kompilierungsbefehle sowohl von FreeCAD als auch von OCCT kennen.

Da die Dateien wahrscheinlich aus dem FreeCAD-Quellcode-Verzeichnis /home/user/freecad-occt-main geöffnet werden sollen, kann eine Datei /home/user/freecad-occt-main/compile_commands.json erstellt werden, die die Kompilierungsbefehle beider Builds enthält.

Das Skript unten kann wie folgt ausgeführt werden:

cd /home/user/freecad-occt-main
merge-compile-commands \
  /scratch/build-occt-main/compile_commands.json \
  /scratch/build-freecad-occt-main/compile_commands.json

Das Skript merge-compile-commands sollte zugänglich und ausführbar sein:

#!/bin/env python

import json
import os
import sys


def load(path):
    with open(path, "r") as f:
        return json.load(f)

def merge(files):
    merged = []
    for p in files:
        merged += load(p)
    return merged

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: merge-compile-commands /build1/compile_commands.json /build2/compile_commands.json")
        print("  Do this in the source tree from where you open files.")
        sys.exit(1)
    in_paths = sys.argv[1:]
    OUT_PATH = "compile_commands.json"

    if os.path.exists(OUT_PATH):
        os.remove(OUT_PATH)
    merged = merge(in_paths)
    with open(OUT_PATH, "w") as f:
        json.dump(merged, f, indent=2)
    print(f"Wrote {len(merged)} entries to {OUT_PATH}")