diff --git a/Application.mk b/Application.mk index 923407800..b482ea347 100644 --- a/Application.mk +++ b/Application.mk @@ -94,7 +94,7 @@ ifneq ($(BUILD_MODULE),y) endif ifneq ($(strip $(PROGNAME)),) - PROGOBJ := $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ) + PROGOBJ := $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ) $(MAINZIGOBJ) PROGLIST := $(addprefix $(BINDIR)$(DELIM),$(PROGNAME)) REGLIST := $(addprefix $(BUILTIN_REGISTRY)$(DELIM),$(addsuffix .bdat,$(PROGNAME))) @@ -168,9 +168,9 @@ define ELFCOMPILERUST $(ECHO_END) endef +# Remove target suffix here since zig compiler add .o automatically define ELFCOMPILEZIG $(ECHO_BEGIN)"ZIG: $1 " - # Remove target suffix here since zig compiler add .o automatically $(Q) $(ZIG) build-obj $(ZIGELFFLAGS) $($(strip $1)_ZIGELFFLAGS) --name $(basename $2) $1 $(ECHO_END) endef @@ -181,6 +181,13 @@ define ELFLD $(ECHO_END) endef +# rename "main()" in $1 to "xxx_main()" and save to $2 +define RENAMEMAIN + $(ECHO_BEGIN)"Rename main() in $1 and save to $2" + $(Q) ${shell cat $1 | sed -e "s/fn[ ]\+main/fn $(addsuffix _main,$(PROGNAME_$@))/" > $2} + $(ECHO_END) +endef + $(RAOBJS): %.s$(SUFFIX)$(OBJEXT): %.s $(if $(and $(CONFIG_BUILD_LOADABLE),$(AELFFLAGS)), \ $(call ELFASSEMBLE, $<, $@), $(call ASSEMBLE, $<, $@)) @@ -235,9 +242,13 @@ $(MAINCOBJ): %.c$(SUFFIX)$(OBJEXT): %.c $(if $(and $(CONFIG_BUILD_LOADABLE),$(CELFFLAGS)), \ $(call ELFCOMPILE, $<, $@), $(call COMPILE, $<, $@)) -$(PROGLIST): $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ) +$(MAINZIGOBJ): %$(ZIGEXT)$(SUFFIX)$(OBJEXT): %$(ZIGEXT) + $(if $(and $(CONFIG_BUILD_LOADABLE),$(CELFFLAGS)), \ + $(call ELFCOMPILEZIG, $<, $@), $(call COMPILEZIG, $<, $@)) + +$(PROGLIST): $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ) $(MAINZIGOBJ) $(Q) mkdir -p $(BINDIR) - $(call ELFLD,$(PROGOBJ_$@),$(call CONVERT_PATH,$@)) + $(call ELFLD, $(PROGOBJ_$@), $(call CONVERT_PATH,$@)) $(Q) chmod +x $@ ifneq ($(CONFIG_DEBUG_SYMBOLS),y) $(Q) $(STRIP) $@ @@ -265,8 +276,10 @@ $(MAINRUSTOBJ): %$(RUSTEXT)$(SUFFIX)$(OBJEXT): %$(RUSTEXT) $(call ELFCOMPILERUST, $<, $@), $(call COMPILERUST, $<, $@)) $(MAINZIGOBJ): %$(ZIGEXT)$(SUFFIX)$(OBJEXT): %$(ZIGEXT) + $(Q) $(call RENAMEMAIN, $<, $(basename $<)_tmp.zig) $(if $(and $(CONFIG_BUILD_LOADABLE),$(CELFFLAGS)), \ - $(call ELFCOMPILEZIG, $<, $@), $(call COMPILEZIG, $<, $@)) + $(call ELFCOMPILEZIG, $(basename $<)_tmp.zig, $@), $(call COMPILEZIG, $(basename $<)_tmp.zig, $@)) + $(Q) rm -f $(basename $<)_tmp.zig install:: @: diff --git a/examples/hello_zig/Makefile b/examples/hello_zig/Makefile index a1657034b..5413dc580 100644 --- a/examples/hello_zig/Makefile +++ b/examples/hello_zig/Makefile @@ -22,7 +22,7 @@ include $(APPDIR)/Make.defs # Hello, Zig! Example -MAINSRC = hello_zig_main.zig +MAINSRC = hello_zig.zig # Hello, Zig! built-in application info diff --git a/examples/hello_zig/hello_zig.zig b/examples/hello_zig/hello_zig.zig new file mode 100644 index 000000000..6d7f271eb --- /dev/null +++ b/examples/hello_zig/hello_zig.zig @@ -0,0 +1,40 @@ +//*************************************************************************** +// examples/hello_zig/hello_zig.zig +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. The +// ASF licenses this file to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance with the +// License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. +// +//*************************************************************************** + +//*************************************************************************** +// Included Files +//*************************************************************************** +const std = @import("std"); + +//**************************************************************************** +//* Externs +//**************************************************************************** + +pub extern fn printf(_format: [*:0]const u8) c_int; + +//**************************************************************************** +//* hello_zig_main +//**************************************************************************** +pub export fn main(_argc: c_int, _argv: [*]const [*]const u8) u8 { + _ = _argc; + _ = _argv; + _ = printf("Hello, Zig!\n"); + return 0; +}