[libc] Make static_assert() available via assert.h

Expose static_assert() via assert.h and migrate link-time assertions
to build-time assertions where possible.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
diff --git a/src/drivers/infiniband/arbel.c b/src/drivers/infiniband/arbel.c
index 293c1b6..24c0b53 100644
--- a/src/drivers/infiniband/arbel.c
+++ b/src/drivers/infiniband/arbel.c
@@ -545,8 +545,8 @@
 	union arbelprm_mad mad_ifc;
 	int rc;
 
-	linker_assert ( sizeof ( *mad ) == sizeof ( mad_ifc.mad ),
-			mad_size_mismatch );
+	/* Sanity check */
+	static_assert ( sizeof ( *mad ) == sizeof ( mad_ifc.mad ) );
 
 	/* Copy in request packet */
 	memcpy ( &mad_ifc.mad, mad, sizeof ( mad_ifc.mad ) );
diff --git a/src/drivers/infiniband/hermon.c b/src/drivers/infiniband/hermon.c
index c09baf7..6fc7d8b 100644
--- a/src/drivers/infiniband/hermon.c
+++ b/src/drivers/infiniband/hermon.c
@@ -779,8 +779,8 @@
 	union hermonprm_mad mad_ifc;
 	int rc;
 
-	linker_assert ( sizeof ( *mad ) == sizeof ( mad_ifc.mad ),
-			mad_size_mismatch );
+	/* Sanity check */
+	static_assert ( sizeof ( *mad ) == sizeof ( mad_ifc.mad ) );
 
 	/* Copy in request packet */
 	memcpy ( &mad_ifc.mad, mad, sizeof ( mad_ifc.mad ) );
diff --git a/src/image/script.c b/src/image/script.c
index 49b3564..9e8566b 100644
--- a/src/image/script.c
+++ b/src/image/script.c
@@ -219,8 +219,7 @@
 static int script_probe ( struct image *image ) {
 	static const char ipxe_magic[] = "#!ipxe";
 	static const char gpxe_magic[] = "#!gpxe";
-	linker_assert ( sizeof ( ipxe_magic ) == sizeof ( gpxe_magic ),
-			magic_size_mismatch );
+	static_assert ( sizeof ( ipxe_magic ) == sizeof ( gpxe_magic ) );
 	char test[ sizeof ( ipxe_magic ) - 1 /* NUL */
 		   + 1 /* terminating space */];
 
diff --git a/src/include/assert.h b/src/include/assert.h
index dd71fa7..6d05318 100644
--- a/src/include/assert.h
+++ b/src/include/assert.h
@@ -56,6 +56,15 @@
 	} while ( 0 )
 
 /**
+ * Assert a condition at build time
+ *
+ * If the compiler cannot prove that the condition is true, the build
+ * will fail with an error message.
+ */
+#undef static_assert
+#define static_assert(x) _Static_assert( x, #x )
+
+/**
  * Assert a condition at link-time.
  *
  * If the condition is not true, the link will fail with an unresolved
diff --git a/src/net/aoe.c b/src/net/aoe.c
index e785e89..dba4f51 100644
--- a/src/net/aoe.c
+++ b/src/net/aoe.c
@@ -374,7 +374,7 @@
 	struct aoeata *aoeata = &aoehdr->payload[0].ata;
 
 	/* Sanity check */
-	linker_assert ( AOE_FL_DEV_HEAD	== ATA_DEV_SLAVE, __fix_ata_h__ );
+	static_assert ( AOE_FL_DEV_HEAD == ATA_DEV_SLAVE );
 	assert ( len == ( sizeof ( *aoehdr ) + sizeof ( *aoeata ) +
 			  command->data_out_len ) );