Per seguire l'eccellente risposta di MBuhot, l'ho appena fatto per far funzionare un "hello world" di Swift OpenGL su un paio di sistemi Linux e posso aggiungere qualche dettaglio in più.
Nel mio caso, avevo bisogno sia di OpenGL che delle funzioni GLUT, quindi ho prima creato un modulo di sistema COngGL. Il sorgente di questo modulo può essere trovato su GitHub, ma fondamentalmente è una directory con due file:un Package.swift vuoto e il seguente module.modulemap:
module COpenGL [system] {
header "/usr/include/GL/gl.h"
link "GL"
export *
}
Nota la GL maiuscola nelle opzioni di intestazione e collegamento, di cui avevo bisogno per abbinare le intestazioni e le librerie di Mesa.
Per le funzioni GLUT, ho creato un modulo CFreeGLUT simile (di nuovo, su GitHub) con il seguente module.modulemap:
module CFreeGLUT [system] {
header "/usr/include/GL/freeglut.h"
link "glut"
export *
}
Per l'applicazione, se desideri utilizzare Swift Package Manager, dovrai creare un Package.swift nella directory principale che assomigli a questo:
import PackageDescription
let package = Package(
dependencies: [
.package(url: "https://github.com/BradLarson/COpenGL.git", from: "1.0.0"),
.package(url: "https://github.com/BradLarson/CFreeGLUT.git", from: "1.0.0")
]
)
Quanto sopra estrae dalle mie versioni GitHub dei moduli di sistema, ma puoi modificare i percorsi in modo che puntino a copie locali, se lo desideri.
Come base ho usato l'applicazione "ciao mondo" del Red Book, che una volta convertita in Swift ha l'aspetto seguente:
import COpenGL
import CFreeGLUT
func renderFunction() {
glClearColor(0.0, 0.0, 0.0, 0.0)
glClear(UInt32(GL_COLOR_BUFFER_BIT))
glColor3f(1.0, 0.0, 0.0)
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)
glBegin(UInt32(GL_POLYGON))
glVertex2f(-0.5, -0.5)
glVertex2f(-0.5, 0.5)
glVertex2f(0.5, 0.5)
glVertex2f(0.5, -0.5)
glEnd()
glFlush()
}
var localArgc = CommandLine.argc
glutInit(&localArgc, CommandLine.unsafeArgv)
glutInitDisplayMode(UInt32(GLUT_SINGLE))
glutInitWindowSize(500,500)
glutInitWindowPosition(100,100)
glutCreateWindow("OpenGL - First window demo")
glutDisplayFunc(renderFunction)
glutMainLoop()
Mettilo in un main.swift
file all'interno della sottodirectory Sources. Esegui swift build
e lo Swift Package Manager uscirà, scaricherà i moduli di sistema, creerà l'applicazione e collegherà i moduli ad essa.
Se non desideri utilizzare Swift Package Manager, puoi comunque utilizzare manualmente questi moduli di sistema dalla riga di comando. Per farlo, scaricateli in una directory locale e fatevi riferimento esplicitamente durante la compilazione:
swiftc -I ./COpenGL -I ./CFreeGLUT main.swift
Le mappe dei moduli verranno lette e sarai in grado di accedere a OpenGL e alle funzioni GLUT dall'interno della tua applicazione Swift su Linux.
Usa un modulo di sistema per importare il file di intestazione OpenGL:https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md
Supponendo che tu abbia un layout di directory come:
COpenGL/
Package.swift
module.modulemap
.git/
YourApp/
Package.swift
main.swift
.git/
il file COpenGL/module.modulemap avrà un aspetto simile a:
module COpenGL [system] {
header "/usr/include/gl/gl.h"
link "gl"
export *
}
Questo deve essere creato in un repository git separato, con un tag di versione:
touch Package.swift
git init
git add .
git commit -m "Initial Commit"
git tag 1.0.0
Quindi dichiaralo come dipendenza nel file YourApp/Package.swift
import PackageDescription
let package = Package(
dependencies: [
.Package(url: "../COpenGL", majorVersion: 1)
]
)
Quindi nel tuo file main.swift puoi importarlo:
import COpenGL
// use opengl calls here...