]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Introduce VALA_EXPORT for public symbols to improve portability
authorPrinceton Ferro <princetonferro@gmail.com>
Sun, 9 May 2021 20:00:11 +0000 (16:00 -0400)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 20 May 2021 09:59:28 +0000 (11:59 +0200)
Use it as replacement for "extern" and attribute every public symbol.

We want to ensure that public symbols are exported, which isn't the
default when generating a shared library in MSVC, for example.

12 files changed:
ccode/valaccodedeclaration.vala
ccode/valaccodefunction.vala
codegen/valaccodebasemodule.vala
codegen/valaccodemethodmodule.vala
codegen/valaccodestructmodule.vala
codegen/valagasyncmodule.vala
codegen/valagdbusclientmodule.vala
codegen/valagdbusservermodule.vala
codegen/valagerrormodule.vala
codegen/valagtypemodule.vala
codegen/valagvariantmodule.vala
codegen/valatyperegisterfunction.vala

index 6da01cfa6d1d434fa82c6c1623ca92bb37bad70f..d9bdd82b8851ab5157cb84dd7a26bb84b51662a7 100644 (file)
@@ -87,7 +87,7 @@ public class Vala.CCodeDeclaration : CCodeStatement {
                                writer.write_string ("volatile ");
                        }
                        if ((modifiers & CCodeModifiers.EXTERN) != 0 && !has_initializer ()) {
-                               writer.write_string ("extern ");
+                               writer.write_string ("VALA_EXTERN ");
                        }
                        if ((modifiers & CCodeModifiers.THREAD_LOCAL) != 0) {
                                writer.write_string ("thread_local ");
index b1a52971118f109cd29f4174e32318f0195f01bb..395ffdc8b131539b19fda21a11f22607877fb090 100644 (file)
@@ -110,6 +110,8 @@ public class Vala.CCodeFunction : CCodeNode {
                writer.write_indent (line);
                if (CCodeModifiers.INTERNAL in modifiers) {
                        writer.write_string (GNUC_INTERNAL);
+               } else if (is_declaration && CCodeModifiers.EXTERN in modifiers) {
+                       writer.write_string ("VALA_EXTERN ");
                }
                if (!is_declaration && CCodeModifiers.NO_INLINE in modifiers) {
                        writer.write_string (GNUC_NO_INLINE);
index 3b1163b94465d56df41667e5079d1e36361e072c..a1897e5757142a9500ba95ffdfd6b4fb101acc83 100644 (file)
@@ -366,6 +366,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        public bool requires_array_n_elements;
        public bool requires_clear_mutex;
        public bool requires_memdup2;
+       public bool requires_vala_extern;
 
        public Set<string> wrappers;
        Set<Symbol> generated_external_symbols;
@@ -799,6 +800,24 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                cfile.add_function (fun);
        }
 
+       /**
+        * Define a macro hint for exporting a symbol in a portable way.
+        */
+       void append_vala_extern_define (CCodeFile decl_space) {
+               var extern_define = new CCodeIfSection ("!defined(VALA_EXTERN)");
+
+               CCodeIfSection if_section;
+               if_section = new CCodeIfSection ("defined(_MSC_VER)");
+               extern_define.append (if_section);
+               if_section.append (new CCodeDefine ("VALA_EXTERN", "__declspec(dllexport) extern"));
+               if_section = if_section.append_else ("__GNUC__ >= 4");
+               if_section.append (new CCodeDefine ("VALA_EXTERN", "__attribute__((visibility(\"default\"))) extern"));
+               if_section = if_section.append_else ();
+               if_section.append (new CCodeDefine ("VALA_EXTERN", "extern"));
+
+               decl_space.add_define (extern_define);
+       }
+
        public override void visit_source_file (SourceFile source_file) {
                cfile = new CCodeFile (CCodeFileType.SOURCE, source_file);
 
@@ -812,6 +831,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                requires_array_length = false;
                requires_array_n_elements = false;
                requires_clear_mutex = false;
+               requires_vala_extern = false;
 
                wrappers = new HashSet<string> (str_hash, str_equal);
                generated_external_symbols = new HashSet<Symbol> ();
@@ -857,6 +877,20 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                if (requires_memdup2) {
                        append_vala_memdup2 ();
                }
+               if (requires_vala_extern) {
+                       if (context.header_filename != null) {
+                               if (!header_file.add_declaration ("VALA_EXTERN")) {
+                                       append_vala_extern_define (header_file);
+                               }
+                               cfile.add_include (source_file.get_cinclude_filename (), true);
+                               internal_header_file.add_include (source_file.get_cinclude_filename (), true);
+                       } else {
+                               if (!cfile.add_declaration ("VALA_EXTERN")) {
+                                       append_vala_extern_define (cfile);
+                                       append_vala_extern_define (internal_header_file);
+                               }
+                       }
+               }
 
                var comments = source_file.get_comments();
                if (comments != null) {
@@ -932,6 +966,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        regfun.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.UNUSED;
                } else if (context.hide_internal && en.is_internal_symbol ()) {
                        regfun.modifiers |= CCodeModifiers.INTERNAL;
+               } else {
+                       regfun.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
 
                decl_space.add_function_declaration (regfun);
@@ -1054,6 +1091,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                        cdecl.modifiers = CCodeModifiers.STATIC;
                                } else {
                                        cdecl.modifiers = CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
 
                                decl_space.add_constant_declaration (cdecl);
@@ -1148,6 +1186,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        cdecl.modifiers = CCodeModifiers.STATIC;
                } else {
                        cdecl.modifiers = CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                if (f.version.deprecated) {
                        cdecl.modifiers |= CCodeModifiers.DEPRECATED;
@@ -1167,6 +1206,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                flock.modifiers = CCodeModifiers.STATIC;
                        } else {
                                flock.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
                        decl_space.add_type_member_declaration (flock);
                }
@@ -1184,6 +1224,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                cdecl.modifiers = CCodeModifiers.STATIC;
                                        } else {
                                                cdecl.modifiers = CCodeModifiers.EXTERN;
+                                               requires_vala_extern = true;
                                        }
                                        decl_space.add_type_member_declaration (cdecl);
                                }
@@ -1199,6 +1240,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                        cdecl.modifiers = CCodeModifiers.STATIC;
                                } else {
                                        cdecl.modifiers = CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
                                decl_space.add_type_member_declaration (cdecl);
 
@@ -1209,6 +1251,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                cdecl.modifiers = CCodeModifiers.STATIC;
                                        } else {
                                                cdecl.modifiers = CCodeModifiers.EXTERN;
+                                               requires_vala_extern = true;
                                        }
                                        decl_space.add_type_member_declaration (cdecl);
                                }
@@ -1358,6 +1401,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                var_def.add_declarator (var_decl);
                                if (!f.is_private_symbol ()) {
                                        var_def.modifiers = CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                } else {
                                        var_def.modifiers = CCodeModifiers.STATIC;
                                }
@@ -1381,6 +1425,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                        len_def.add_declarator (new CCodeVariableDeclarator (get_variable_array_length_cname (f, dim), new CCodeConstant ("0")));
                                                        if (!f.is_private_symbol ()) {
                                                                len_def.modifiers = CCodeModifiers.EXTERN;
+                                                               requires_vala_extern = true;
                                                        } else {
                                                                len_def.modifiers = CCodeModifiers.STATIC;
                                                        }
@@ -1403,6 +1448,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                target_def.add_declarator (new CCodeVariableDeclarator (get_ccode_delegate_target_name (f), new CCodeConstant ("NULL")));
                                                if (!f.is_private_symbol ()) {
                                                        target_def.modifiers = CCodeModifiers.EXTERN;
+                                                       requires_vala_extern = true;
                                                } else {
                                                        target_def.modifiers = CCodeModifiers.STATIC;
                                                }
@@ -1413,6 +1459,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                        target_destroy_notify_def.add_declarator (new CCodeVariableDeclarator (get_ccode_delegate_target_destroy_notify_name (f), new CCodeConstant ("NULL")));
                                                        if (!f.is_private_symbol ()) {
                                                                target_destroy_notify_def.modifiers = CCodeModifiers.EXTERN;
+                                                               requires_vala_extern = true;
                                                        } else {
                                                                target_destroy_notify_def.modifiers = CCodeModifiers.STATIC;
                                                        }
@@ -1709,6 +1756,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        function.modifiers |= CCodeModifiers.STATIC;
                } else if (context.hide_internal && (prop.is_internal_symbol () || acc.access == SymbolAccessibility.INTERNAL)) {
                        function.modifiers |= CCodeModifiers.INTERNAL;
+               } else {
+                       function.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                decl_space.add_function_declaration (function);
        }
index cd9d6bd98b239816c954ef8ab6bd839896ac7827..89079688c3135dfd71a7dd612e919dcd2f70dab8 100644 (file)
@@ -171,6 +171,9 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                        }
                } else if (context.hide_internal && m.is_internal_symbol () && !m.external) {
                        function.modifiers |= CCodeModifiers.INTERNAL;
+               } else if (!m.entry_point && !m.external) {
+                       function.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
 
                if (m.entry_point) {
@@ -207,6 +210,9 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                                function.modifiers |= CCodeModifiers.STATIC;
                        } else if (context.hide_internal && m.is_internal_symbol ()) {
                                function.modifiers |= CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers |= CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        cparam_map = new HashMap<int,CCodeParameter> (direct_hash, direct_equal);
@@ -221,6 +227,11 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                                // _constructv function
                                function = new CCodeFunction (get_ccode_constructv_name ((CreationMethod) m));
 
+                               if (!m.is_private_symbol ()) {
+                                       function.modifiers |= CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
+                               }
+
                                cparam_map = new HashMap<int,CCodeParameter> (direct_hash, direct_equal);
                                generate_cparameters (m, decl_space, cparam_map, function);
 
index 5042698cd82a1b0006030cb821a9fe85d43a6118..d019a95e18eb49e4587ffd1bd35a04603a440a62 100644 (file)
@@ -67,6 +67,8 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                                var type_fun = new StructRegisterFunction (st);
                                type_fun.init_from_type (context, false, true);
                                decl_space.add_type_member_declaration (type_fun.get_declaration ());
+
+                               requires_vala_extern = true;
                        }
                }
 
@@ -104,6 +106,9 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                        function.modifiers = CCodeModifiers.STATIC;
                } else if (context.hide_internal && st.is_internal_symbol ()) {
                        function.modifiers = CCodeModifiers.INTERNAL;
+               } else {
+                       function.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                function.add_parameter (new CCodeParameter ("self", "const " + get_ccode_name (st) + "*"));
                decl_space.add_function_declaration (function);
@@ -113,6 +118,9 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                        function.modifiers = CCodeModifiers.STATIC;
                } else if (context.hide_internal && st.is_internal_symbol ()) {
                        function.modifiers = CCodeModifiers.INTERNAL;
+               } else {
+                       function.modifiers = CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                function.add_parameter (new CCodeParameter ("self", get_ccode_name (st) + "*"));
                decl_space.add_function_declaration (function);
@@ -123,6 +131,9 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                                function.modifiers = CCodeModifiers.STATIC;
                        } else if (context.hide_internal && st.is_internal_symbol ()) {
                                function.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
                        function.add_parameter (new CCodeParameter ("self", "const " + get_ccode_name (st) + "*"));
                        function.add_parameter (new CCodeParameter ("dest", get_ccode_name (st) + "*"));
@@ -133,6 +144,9 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                                function.modifiers = CCodeModifiers.STATIC;
                        } else if (context.hide_internal && st.is_internal_symbol ()) {
                                function.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
                        function.add_parameter (new CCodeParameter ("self", get_ccode_name (st) + "*"));
                        decl_space.add_function_declaration (function);
index 7019f8ee6d1c71b60c96972c500d9ac383d974d2..2ca56b705439891ce4f09d1cbe0ee1d2addc6a3c 100644 (file)
@@ -358,6 +358,9 @@ public class Vala.GAsyncModule : GtkModule {
                                asyncfunc.modifiers |= CCodeModifiers.STATIC;
                        } else if (context.hide_internal && m.is_internal_symbol ()) {
                                asyncfunc.modifiers |= CCodeModifiers.INTERNAL;
+                       } else {
+                               asyncfunc.modifiers |= CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        // do not generate _new functions for creation methods of abstract classes
@@ -375,6 +378,9 @@ public class Vala.GAsyncModule : GtkModule {
                                finishfunc.modifiers |= CCodeModifiers.STATIC;
                        } else if (context.hide_internal && m.is_internal_symbol ()) {
                                finishfunc.modifiers |= CCodeModifiers.INTERNAL;
+                       } else {
+                               finishfunc.modifiers |= CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        // do not generate _new functions for creation methods of abstract classes
@@ -392,6 +398,9 @@ public class Vala.GAsyncModule : GtkModule {
                                        function.modifiers |= CCodeModifiers.STATIC;
                                } else if (context.hide_internal && m.is_internal_symbol ()) {
                                        function.modifiers |= CCodeModifiers.INTERNAL;
+                               } else {
+                                       function.modifiers |= CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
 
                                cparam_map = new HashMap<int,CCodeParameter> (direct_hash, direct_equal);
@@ -405,6 +414,9 @@ public class Vala.GAsyncModule : GtkModule {
                                        function.modifiers |= CCodeModifiers.STATIC;
                                } else if (context.hide_internal && m.is_internal_symbol ()) {
                                        function.modifiers |= CCodeModifiers.INTERNAL;
+                               } else {
+                                       function.modifiers |= CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
 
                                cparam_map = new HashMap<int,CCodeParameter> (direct_hash, direct_equal);
index 51c83b67bdfe2980b1c416955e7dd2ade317f992..697b0875875f298bbc251b9af5c643a43c4a7d3e 100644 (file)
@@ -161,12 +161,17 @@ public class Vala.GDBusClientModule : GDBusModule {
 
                // declare proxy_get_type function
                var proxy_get_type = new CCodeFunction (get_type_name, "GType");
-               proxy_get_type.modifiers = CCodeModifiers.CONST;
+               proxy_get_type.modifiers = CCodeModifiers.CONST | CCodeModifiers.EXTERN;
+               requires_vala_extern = true;
+
                decl_space.add_function_declaration (proxy_get_type);
 
                if (in_plugin) {
                        var proxy_register_type = new CCodeFunction ("%sproxy_register_dynamic_type".printf (get_ccode_lower_case_prefix (iface)));
                        proxy_register_type.add_parameter (new CCodeParameter ("module", "GTypeModule*"));
+                       proxy_register_type.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
+
                        decl_space.add_function_declaration (proxy_register_type);
                }
        }
index 68ca2b7fb12c0175e1945eb85cdbc94a6d79ddd7..e6f379c9f808f231f2dca9eb281fb09b2c8e8576 100644 (file)
@@ -1087,6 +1087,9 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                        cfunc.modifiers |= CCodeModifiers.STATIC;
                } else if (context.hide_internal && sym.is_internal_symbol ()) {
                        cfunc.modifiers |= CCodeModifiers.INTERNAL;
+               } else {
+                       cfunc.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                decl_space.add_function_declaration (cfunc);
        }
index 92be271c760b1589dd6222f6cb3751857712e6d5..8deea612a1e31f2eb227b8fc8da1b28474334371 100644 (file)
@@ -52,6 +52,8 @@ public class Vala.GErrorModule : CCodeDelegateModule {
                decl_space.add_type_definition (error_domain_define);
 
                var cquark_fun = new CCodeFunction (quark_fun_name, get_ccode_name (gquark_type.type_symbol));
+               cquark_fun.modifiers |= CCodeModifiers.EXTERN;
+               requires_vala_extern = true;
 
                decl_space.add_function_declaration (cquark_fun);
        }
index 6ec1f6b6d9a6ba0a31a52b507a77c07bed83ef4c..63d27ea294bbcb2e60f8f941d7702df3926033e8 100644 (file)
@@ -104,6 +104,10 @@ public class Vala.GTypeModule : GErrorModule {
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                ref_fun.modifiers = CCodeModifiers.INTERNAL;
                                unref_fun.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               ref_fun.modifiers = CCodeModifiers.EXTERN;
+                               unref_fun.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        ref_fun.add_parameter (new CCodeParameter ("instance", "gpointer"));
@@ -125,6 +129,9 @@ public class Vala.GTypeModule : GErrorModule {
                                function.modifiers = CCodeModifiers.STATIC | CCodeModifiers.UNUSED;
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                function.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        decl_space.add_function_declaration (function);
@@ -139,6 +146,9 @@ public class Vala.GTypeModule : GErrorModule {
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                // avoid C warning as this function is not always used
                                function.modifiers = CCodeModifiers.INTERNAL | CCodeModifiers.UNUSED;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        decl_space.add_function_declaration (function);
@@ -152,6 +162,9 @@ public class Vala.GTypeModule : GErrorModule {
                                function.modifiers = CCodeModifiers.STATIC | CCodeModifiers.UNUSED;
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                function.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        decl_space.add_function_declaration (function);
@@ -165,6 +178,9 @@ public class Vala.GTypeModule : GErrorModule {
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                // avoid C warning as this function is not always used
                                function.modifiers = CCodeModifiers.INTERNAL | CCodeModifiers.UNUSED;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        decl_space.add_function_declaration (function);
@@ -175,6 +191,9 @@ public class Vala.GTypeModule : GErrorModule {
                                        function.modifiers = CCodeModifiers.STATIC;
                                } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                        function.modifiers = CCodeModifiers.INTERNAL;
+                               } else {
+                                       function.modifiers = CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
 
                                function.add_parameter (new CCodeParameter ("self", "%s *".printf (get_ccode_name (cl))));
@@ -189,6 +208,8 @@ public class Vala.GTypeModule : GErrorModule {
                        var type_fun = new ClassRegisterFunction (cl);
                        type_fun.init_from_type (context, in_plugin, true);
                        decl_space.add_type_member_declaration (type_fun.get_declaration ());
+
+                       requires_vala_extern = true;
                }
 
                var base_class = cl;
@@ -2157,6 +2178,8 @@ public class Vala.GTypeModule : GErrorModule {
                var type_fun = new InterfaceRegisterFunction (iface);
                type_fun.init_from_type (context, in_plugin, true);
                decl_space.add_type_member_declaration (type_fun.get_declaration ());
+
+               requires_vala_extern = true;
        }
 
        public override void visit_interface (Interface iface) {
index 2e4c4956ed039f6a62881b0748afa1d080c29ee2..9f53ca010e395c75dfdf903bb65519894336b342 100644 (file)
@@ -260,6 +260,8 @@ public class Vala.GVariantModule : GValueModule {
                var from_string_func = new CCodeFunction (from_string_name, get_ccode_name (en));
                from_string_func.add_parameter (new CCodeParameter ("str", "const char*"));
                from_string_func.add_parameter (new CCodeParameter ("error", "GError**"));
+               from_string_func.modifiers |= CCodeModifiers.EXTERN;
+               requires_vala_extern = true;
 
                return from_string_func;
        }
@@ -644,6 +646,8 @@ public class Vala.GVariantModule : GValueModule {
 
                var to_string_func = new CCodeFunction (to_string_name, "const char*");
                to_string_func.add_parameter (new CCodeParameter ("value", get_ccode_name (en)));
+               to_string_func.modifiers |= CCodeModifiers.EXTERN;
+               requires_vala_extern = true;
 
                return to_string_func;
        }
index 6276273b92ef0f813c4b77e9706856fe5016221f..67bb7efb92a88eec216e73bbfbd6633df56ddffa 100644 (file)
@@ -76,6 +76,8 @@ public abstract class Vala.TypeRegisterFunction {
                        } else if (context.hide_internal && get_accessibility () == SymbolAccessibility.INTERNAL) {
                                // avoid C warning as this function is not always used
                                fun.modifiers |= CCodeModifiers.INTERNAL | CCodeModifiers.UNUSED;
+                       } else {
+                               fun.modifiers |= CCodeModifiers.EXTERN;
                        }
 
                        fun.is_declaration = true;
@@ -100,7 +102,7 @@ public abstract class Vala.TypeRegisterFunction {
                        fun.is_declaration = false;
 
                        var get_fun = new CCodeFunction (get_ccode_type_function (type_symbol), "GType");
-                       get_fun.modifiers = CCodeModifiers.CONST;
+                       get_fun.modifiers = CCodeModifiers.CONST | CCodeModifiers.EXTERN;
 
                        get_fun.is_declaration = true;
                        declaration_fragment.append (get_fun.copy ());