2012-06-21 24 views
6

Estoy tratando de escribir un Go wrapper usando CGo para ENet.compilación condicional en Go

Cuando traté de compilar mi envoltorio en una Mac, la biblioteca era más antigua y tenía una interfaz ligeramente diferente. El 99% del código es el mismo, solo unas pocas llamadas C deben cambiar.

¿Cuál es la mejor práctica para hacer frente a un problema como este en Go?
¿Hay alguna manera de hacer compilaciones condicionales o importaciones condicionales?

Respuesta

1

Go no tiene compilación condicional ni importaciones condicionales. Maneje las diferencias de tipo en el código C.

Are the [Go] authors opposed to preprocessing?

+0

Go realmente tiene compilación condicional usando sufijos de nombre de archivo como lo demuestra la respuesta andyBallholm. –

+1

Downvoters va a odiar :). En serio, @peterSO tiene la respuesta correcta para mi problema particular. Resulta que lo de Mac es una pista falsa. El verdadero problema es con las versiones de la biblioteca, que solo se pueden detectar como '# define' en los archivos de encabezado. '_darwin.go' o' _linux.go' solo enmascararía el problema hasta que uno de ellos actualizara su biblioteca ENet con un cambio incompatible hacia atrás. –

14

separar la materia específica de la plataforma en un archivo separado, por ejemplo, stuff.go

Ahora reemplace stuff.go con versiones para las distintas plataformas, como stuff_darwin.go (para Mac), stuff_windows.go, stuff_linux.go, etc.

Si un archivo tiene un sufijo como esa , el comando go compilará solo en la plataforma especificada.

+0

Eso es realmente bueno de saber. –

+8

Documentado en "Build Constriants" en [descripción general] (http://golang.org/pkg/go/build/#overview) del paquete go/build. – Sonia

+1

Eso es en realidad una solución brillante (cabe Go). –

Cuestiones relacionadas