diff options
23 files changed, 734 insertions, 811 deletions
diff --git a/native_client_sdk/src/examples/hello_world/Makefile b/native_client_sdk/src/examples/hello_world/Makefile deleted file mode 100644 index f5d6e46..0000000 --- a/native_client_sdk/src/examples/hello_world/Makefile +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright (c) 2011 The Native Client Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# -# GNU Make based build file. For details on GNU Make see: -# http://www.gnu.org/software/make/manual/make.html -# - -# -# Project information -# -# These variables store project specific settings for the project name -# build flags, files to copy or install. In the examples it is typically -# only the list of sources and project name that will actually change and -# the rest of the makefile is boilerplate for defining build rules. -# -PROJECT:=hello_world -CXX_SOURCES:=hello_world.cc helper_functions.cc -COPY_FILES:=hello_world.html hello_world.nmf -LDFLAGS:=-lppapi_cpp -lppapi - - -# -# Get pepper directory for toolchain and includes. -# -# If PEPPER_ROOT is not set, then assume it can be found a two directories up, -# from the default example directory location. -# -THIS_MAKEFILE:=$(abspath $(lastword $(MAKEFILE_LIST))) -PEPPER_ROOT?=$(abspath $(dir $(THIS_MAKEFILE))../..) - -# Project Build flags -DEFINES:= -INCLUDES:= -WARNINGS:=-Wno-long-long -Wall -Wswitch-enum -pedantic -Werror -CXXFLAGS:=-pthread -std=gnu++98 $(WARNINGS) $(DEFINES) $(INCLUDES) - -# -# Compute tool paths -# -# -OSNAME:=$(shell python $(PEPPER_ROOT)/tools/getos.py) -TC_PATH:=$(abspath $(PEPPER_ROOT)/toolchain/$(OSNAME)_x86_newlib) -CC:=$(TC_PATH)/bin/i686-nacl-gcc -CXX:=$(TC_PATH)/bin/i686-nacl-g++ -STRIP:=$(TC_PATH)/bin/i686-nacl-strip - -# -# Create shell aliases -# -# Create Python based aliases for common shell commands like copy or move. -# -COPY = python $(PEPPER_ROOT)/tools/oshelpers.py cp -MKDIR = python $(PEPPER_ROOT)/tools/oshelpers.py mkdir -RM = python $(PEPPER_ROOT)/tools/oshelpers.py rm -MV = python $(PEPPER_ROOT)/tools/oshelpers.py mv - -# -# Disable DOS PATH warning when using Cygwin based tools Windows -# -CYGWIN ?= nodosfilewarning -export CYGWIN - -# -# Define a macro for copying files to the configuration directory -# -# Copys a source file to the destination directory, removing the base path -# from the source. Adds a dependency to the destination directory in case it -# needs to be created. -# -# $(1) = Source file -# $(2) = Destination directory -define FILE_COPY -$(2)/$(notdir $(1)) : $(1) | $(2) - $(COPY) $(1) $(2) -$(2)_COPIES+=$(2)/$(notdir $(1)) -endef - - -# Declare the ALL target first, to make the 'all' target the default build -all: DEBUG RELEASE - - -# -# Debug Build rules. -# -DEBUG_x86_32_FLAGS:=-m32 -O0 -g -DEBUG_x86_64_FLAGS:=-m64 -O0 -g -DEBUG_x86_32_OBJS:=$(patsubst %.cc,DBG/x86_32/%.o,$(CXX_SOURCES)) -DEBUG_x86_64_OBJS:=$(patsubst %.cc,DBG/x86_64/%.o,$(CXX_SOURCES)) - -# Create DBG configuration directories -DBG: - $(MKDIR) -p $@ - -DBG/x86_32: - $(MKDIR) -p $@ - -DBG/x86_64: - $(MKDIR) -p $@ - -# Copy all files to that config -$(foreach src,$(COPY_FILES),$(eval $(call FILE_COPY,$(src),DBG))) - -# Include generated dependencies --include DBG/x86_32/*.d --include DBG/x86_64/*.d - -# Define compile rule for all 32 bit debug objects -DBG/x86_32/%.o : %.cc $(THIS_MAKE) | DBG/x86_32 - $(CXX) -o $@ -c $< $(DEBUG_x86_32_FLAGS) $(CXXFLAGS) -MMD -MF $@.d - -# Define compile rule for all 64 bit debug objects -DBG/x86_64/%.o : %.cc $(THIS_MAKE) | DBG/x86_64 - $(CXX) -o $@ -c $< $(DEBUG_x86_64_FLAGS) $(CXXFLAGS) - -# Define Link rule for 32 bit debug NEXE -DBG/$(PROJECT)_x86_32.nexe : $(DEBUG_x86_32_OBJS) - $(CXX) -o $@ $^ $(DEBUG_x86_32_FLAGS) $(LDFLAGS) - -# Define Link rule for 64 bit debug NEXE -DBG/$(PROJECT)_x86_64.nexe : $(DEBUG_x86_64_OBJS) - $(CXX) -o $@ $^ $(DEBUG_x86_64_FLAGS) $(LDFLAGS) - -# Define a DEBUG alias to build the debug version -.PHONY : DEBUG RUN_DEBUG -DEBUG : DBG/$(PROJECT)_x86_32.nexe DBG/$(PROJECT)_x86_64.nexe $(DBG_COPIES) - -# Define a RUN_DEBUG alias to build and server the DEBUG version -RUN_DEBUG: DEBUG - cd DBG && python ../../httpd.py - - -# -# Release build rules. -# -RELEASE_x86_32_FLAGS:=-m32 -O2 -g -RELEASE_x86_64_FLAGS:=-m64 -O2 -g -RELEASE_x86_32_OBJS:=$(patsubst %.cc,REL/x86_32/%.o,$(CXX_SOURCES)) -RELEASE_x86_64_OBJS:=$(patsubst %.cc,REL/x86_64/%.o,$(CXX_SOURCES)) - -REL: - $(MKDIR) -p $@ - -REL/x86_32: - $(MKDIR) -p $@ - -REL/x86_64: - $(MKDIR) -p $@ - -# Copy all files to that config -$(foreach src,$(COPY_FILES),$(eval $(call FILE_COPY,$(src),REL))) - -# Include generated dependencies --include REL/x86_32/*.d --include REL/x86_64/*.d - -# Define compile rule for all 32 bit debug objects -REL/x86_32/%.o : %.cc $(THIS_MAKE) | REL/x86_32 - $(CXX) -o $@ -c $< $(RELEASE_x86_32_FLAGS) $(CXXFLAGS) -MMD -MF $@.d - -# Define compile rule for all 64 bit debug objects -REL/x86_64/%.o : %.cc $(THIS_MAKE) | REL/x86_64 - $(CXX) -o $@ -c $< $(RELEASE_x86_64_FLAGS) $(CXXFLAGS) - -# Define Link rule for 32 bit optimized and stripped NEXE -REL/$(PROJECT)_x86_32.nexe : $(RELEASE_x86_32_OBJS) - $(CXX) -o $@.unstripped $^ $(RELEASE_x86_32_FLAGS) $(LDFLAGS) - $(STRIP) $< -o $@ - -# Define Link rule for 64 bit optimized and stripped NEXE -REL/$(PROJECT)_x86_64.nexe : $(RELEASE_x86_64_OBJS) - $(CXX) -o $@.unstripped $^ $(RELEASE_x86_64_FLAGS) $(LDFLAGS) - $(STRIP) $@.unstripped -o $@ - -# Define a RELEASE alias to build the debug version -.PHONY : RELEASE RUN_RELEASE -RELEASE : REL/$(PROJECT)_x86_32.nexe REL/$(PROJECT)_x86_64.nexe $(REL_COPIES) - -# Define a RUN_RELEASE alias to build and server the RELEASE version -RUN_RELEASE: RELEASE - cd REL && python ../../httpd.py diff --git a/native_client_sdk/src/examples/hello_world_c/Makefile b/native_client_sdk/src/examples/hello_world_c/Makefile deleted file mode 100644 index d66ef26..0000000 --- a/native_client_sdk/src/examples/hello_world_c/Makefile +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright (c) 2011 The Native Client Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# -# GNU Make based build file. For details on GNU Make see: -# http://www.gnu.org/software/make/manual/make.html -# - -# -# Project information -# -# These variables store project specific settings for the project name -# build flags, files to copy or install. In the examples it is typically -# only the list of sources and project name that will actually change and -# the rest of the makefile is boilerplate for defining build rules. -# -PROJECT:=hello_world_c -C_SOURCES:=hello_world_c.c -COPY_FILES:=hello_world_c.html hello_world_c.nmf -LDFLAGS:=-lppapi - - -# -# Get pepper directory for toolchain and includes. -# -# If PEPPER_ROOT is not set, then assume it can be found a two directories up, -# from the default example directory location. -# -THIS_MAKEFILE:=$(abspath $(lastword $(MAKEFILE_LIST))) -PEPPER_ROOT?=$(abspath $(dir $(THIS_MAKEFILE))../..) - -# Project Build flags -DEFINES:= -INCLUDES:= -WARNINGS:=-Wno-long-long -Wall -Wswitch-enum -pedantic -Werror -CFLAGS:=-pthread $(WARNINGS) $(DEFINES) $(INCLUDES) - -# -# Compute tool paths -# -# -OSNAME:=$(shell python $(PEPPER_ROOT)/tools/getos.py) -TC_PATH:=$(abspath $(PEPPER_ROOT)/toolchain/$(OSNAME)_x86_newlib) -CC:=$(TC_PATH)/bin/i686-nacl-gcc -CXX:=$(TC_PATH)/bin/i686-nacl-g++ -STRIP:=$(TC_PATH)/bin/i686-nacl-strip - -# -# Create shell aliases -# -# Create Python based aliases for common shell commands like copy or move. -# -COPY = python $(PEPPER_ROOT)/tools/oshelpers.py cp -MKDIR = python $(PEPPER_ROOT)/tools/oshelpers.py mkdir -RM = python $(PEPPER_ROOT)/tools/oshelpers.py rm -MV = python $(PEPPER_ROOT)/tools/oshelpers.py mv - -# -# Disable DOS PATH warning when using Cygwin based tools Windows -# -CYGWIN ?= nodosfilewarning -export CYGWIN - -# -# Define a macro for copying files to the configuration directory -# -# Copys a source file to the destination directory, removing the base path -# from the source. Adds a dependency to the destination directory in case it -# needs to be created. -# -# $(1) = Source file -# $(2) = Destination directory -define FILE_COPY -$(2)/$(notdir $(1)) : $(1) | $(2) - $(COPY) $(1) $(2) -$(2)_COPIES+=$(2)/$(notdir $(1)) -endef - - -# Declare the ALL target first, to make the 'all' target the default build -all: DEBUG RELEASE - - -# -# Debug Build rules. -# -DEBUG_x86_32_FLAGS:=-m32 -O0 -g -DEBUG_x86_64_FLAGS:=-m64 -O0 -g -DEBUG_x86_32_OBJS:=$(patsubst %.c,DBG/x86_32/%.o,$(C_SOURCES)) -DEBUG_x86_64_OBJS:=$(patsubst %.c,DBG/x86_64/%.o,$(C_SOURCES)) - -# Create DBG configuration directories -DBG: - $(MKDIR) -p $@ - -DBG/x86_32: - $(MKDIR) -p $@ - -DBG/x86_64: - $(MKDIR) -p $@ - -# Copy all files to that config -$(foreach src,$(COPY_FILES),$(eval $(call FILE_COPY,$(src),DBG))) - -# Include generated dependencies --include DBG/x86_32/*.d --include DBG/x86_64/*.d - -# Define compile rule for all 32 bit debug objects -DBG/x86_32/%.o : %.c $(THIS_MAKE) | DBG/x86_32 - $(CC) -o $@ -c $< $(DEBUG_x86_32_FLAGS) $(CFLAGS) -MMD -MF $@.d - -# Define compile rule for all 64 bit debug objects -DBG/x86_64/%.o : %.c $(THIS_MAKE) | DBG/x86_64 - $(CC) -o $@ -c $< $(DEBUG_x86_64_FLAGS) $(CFLAGS) - -# Define Link rule for 32 bit debug NEXE -DBG/$(PROJECT)_x86_32.nexe : $(DEBUG_x86_32_OBJS) - $(CC) -o $@ $^ $(DEBUG_x86_32_FLAGS) $(LDFLAGS) - -# Define Link rule for 64 bit debug NEXE -DBG/$(PROJECT)_x86_64.nexe : $(DEBUG_x86_64_OBJS) - $(CC) -o $@ $^ $(DEBUG_x86_64_FLAGS) $(LDFLAGS) - -# Define a DEBUG alias to build the debug version -.PHONY : DEBUG RUN_DEBUG -DEBUG : DBG/$(PROJECT)_x86_32.nexe DBG/$(PROJECT)_x86_64.nexe $(DBG_COPIES) - -# Define a RUN_DEBUG alias to build and server the DEBUG version -RUN_DEBUG: DEBUG - cd DBG && python ../../httpd.py - - -# -# Release build rules. -# -RELEASE_x86_32_FLAGS:=-m32 -O2 -g -RELEASE_x86_64_FLAGS:=-m64 -O2 -g -RELEASE_x86_32_OBJS:=$(patsubst %.c,REL/x86_32/%.o,$(C_SOURCES)) -RELEASE_x86_64_OBJS:=$(patsubst %.c,REL/x86_64/%.o,$(C_SOURCES)) - -REL: - $(MKDIR) -pv $@ - -REL/x86_32: - $(MKDIR) -pv $@ - -REL/x86_64: - $(MKDIR) -pv $@ - -# Copy all files to that config -$(foreach src,$(COPY_FILES),$(eval $(call FILE_COPY,$(src),REL))) - -# Include generated dependencies --include REL/x86_32/*.d --include REL/x86_64/*.d - -# Define compile rule for all 32 bit debug objects -REL/x86_32/%.o : %.c $(THIS_MAKE) | REL/x86_32 - $(CC) -o $@ -c $< $(RELEASE_x86_32_FLAGS) $(CFLAGS) -MMD -MF $@.d - -# Define compile rule for all 64 bit debug objects -REL/x86_64/%.o : %.c $(THIS_MAKE) | REL/x86_64 - $(CC) -o $@ -c $< $(RELEASE_x86_64_FLAGS) $(CFLAGS) - -# Define Link rule for 32 bit optimized and stripped NEXE -REL/$(PROJECT)_x86_32.nexe : $(RELEASE_x86_32_OBJS) - $(CC) -o $@.unstripped $^ $(RELEASE_x86_32_FLAGS) $(LDFLAGS) - $(STRIP) $< -o $@ - -# Define Link rule for 64 bit optimized and stripped NEXE -REL/$(PROJECT)_x86_64.nexe : $(RELEASE_x86_64_OBJS) - $(CC) -o $@.unstripped $^ $(RELEASE_x86_64_FLAGS) $(LDFLAGS) - $(STRIP) $@.unstripped -o $@ - -# Define a RELEASE alias to build the debug version -.PHONY : RELEASE RUN_RELEASE -RELEASE : REL/$(PROJECT)_x86_32.nexe REL/$(PROJECT)_x86_64.nexe $(REL_COPIES) - -# Define a RUN_RELEASE alias to build and server the RELEASE version -RUN_RELEASE: RELEASE - cd REL && python ../../httpd.py diff --git a/native_client_sdk/src/examples/hello_world_glibc/Makefile b/native_client_sdk/src/examples/hello_world_glibc/Makefile index cf14374..a52123d 100644 --- a/native_client_sdk/src/examples/hello_world_glibc/Makefile +++ b/native_client_sdk/src/examples/hello_world_glibc/Makefile @@ -7,194 +7,71 @@ # http://www.gnu.org/software/make/manual/make.html # -# -# Project information -# -# These variables store project specific settings for the project name -# build flags, files to copy or install. In the examples it is typically -# only the list of sources and project name that will actually change and -# the rest of the makefile is boilerplate for defining build rules. -# -PROJECT:=hello_world -CXX_SOURCES:=hello_world.cc helper_functions.cc -COPY_FILES:=hello_world.html -LDFLAGS:=-lppapi_cpp -lppapi - # # Get pepper directory for toolchain and includes. # -# If PEPPER_ROOT is not set, then assume it can be found a two directories up, +# If NACL_SDK_ROOT is not set, then assume it can be found a two directories up, # from the default example directory location. # THIS_MAKEFILE:=$(abspath $(lastword $(MAKEFILE_LIST))) -PEPPER_ROOT?=$(abspath $(dir $(THIS_MAKEFILE))../..) - -# Project Build flags -DEFINES:= -INCLUDES:= -WARNINGS:=-Wno-long-long -Wall -Wswitch-enum -pedantic -Werror -CXXFLAGS:= -shared -pthread -std=gnu++98 $(WARNINGS) $(DEFINES) $(INCLUDES) +NACL_SDK_ROOT?=$(abspath $(dir $(THIS_MAKEFILE))../..) -# -# Compute tool paths -# -# -OSNAME:=$(shell python $(PEPPER_ROOT)/tools/getos.py) -TC_PATH:=$(abspath $(PEPPER_ROOT)/toolchain/$(OSNAME)_x86_glibc) -CC:=$(TC_PATH)/bin/i686-nacl-gcc -CXX:=$(TC_PATH)/bin/i686-nacl-g++ -STRIP:=$(TC_PATH)/bin/i686-nacl-strip - -# -# Create shell aliases -# -# Create Python based aliases for common shell commands like copy or move. -# -COPY:= python $(PEPPER_ROOT)/tools/oshelpers.py cp -MKDIR:= python $(PEPPER_ROOT)/tools/oshelpers.py mkdir -RM:= python $(PEPPER_ROOT)/tools/oshelpers.py rm -MV:= python $(PEPPER_ROOT)/tools/oshelpers.py mv # -# NMF Manifiest generation +# Project Build flags # -NMF:=python $(PEPPER_ROOT)/tools/create_nmf.py -NMF+=-D $(TC_PATH)/x86_64-nacl/bin/objdump -NMF_PATHS:=-L $(TC_PATH)/x86_64-nacl/lib32 -L $(TC_PATH)/x86_64-nacl/lib +# Turns on warnings (-Wxxx), builds with zero optimization (-O0) and adds debug +# information (-g) for correctness and ease of debugging. +WARNINGS:=-Wno-long-long -Wall -Wswitch-enum -Werror -pedantic +CFLAGS:=-pthread -O0 -g $(WARNINGS) -# -# Disable DOS PATH warning when using Cygwin based tools Windows -# -CYGWIN ?= nodosfilewarning -export CYGWIN # -# Define a macro for copying files to the configuration directory -# -# Copys a source file to the destination directory, removing the base path -# from the source. Adds a dependency to the destination directory in case it -# needs to be created. +# Compute path to compiler # -# $(1) = Source file -# $(2) = Destination directory -define FILE_COPY -$(2)/$(notdir $(1)) : $(1) | $(2) - $(COPY) $(1) $(2) -$(2)_COPIES+=$(2)/$(notdir $(1)) -endef +OSNAME:=$(shell python $(NACL_SDK_ROOT)/tools/getos.py) +TC_PATH:=$(abspath $(NACL_SDK_ROOT)/toolchain/$(OSNAME)_x86_glibc) -# Declare the ALL target first, to make the 'all' target the default build -all: DEBUG RELEASE +# Alias for C++ compiler +CC:=$(TC_PATH)/bin/i686-nacl-gcc # -# Debug Build rules. +# Disable DOS PATH warning when using Cygwin based tools Windows # -DEBUG_x86_32_FLAGS:=-m32 -O0 -g -DEBUG_x86_64_FLAGS:=-m64 -O0 -g -DEBUG_x86_32_OBJS:=$(patsubst %.cc,DBG/x86_32/%.o,$(CXX_SOURCES)) -DEBUG_x86_64_OBJS:=$(patsubst %.cc,DBG/x86_64/%.o,$(CXX_SOURCES)) - -# Create DBG configuration directories -DBG: - $(MKDIR) -p $@ - -DBG/x86_32: - $(MKDIR) -p $@ - -DBG/x86_64: - $(MKDIR) -p $@ - -# Copy all files to that config -$(foreach src,$(COPY_FILES),$(eval $(call FILE_COPY,$(src),DBG))) - -# Include generated dependencies --include DBG/x86_32/*.d --include DBG/x86_64/*.d - -# Define compile rule for all 32 bit debug objects -DBG/x86_32/%.o : %.cc $(THIS_MAKE) | DBG/x86_32 - $(CXX) -o $@ -c $< $(DEBUG_x86_32_FLAGS) $(CXXFLAGS) -MMD -MF $@.d - -# Define compile rule for all 64 bit debug objects -DBG/x86_64/%.o : %.cc $(THIS_MAKE) | DBG/x86_64 - $(CXX) -o $@ -c $< $(DEBUG_x86_64_FLAGS) $(CXXFLAGS) -MMD -MF $@.d - -# Define Link rule for 32 bit debug NEXE -DBG/$(PROJECT)_x86_32.nexe : $(DEBUG_x86_32_OBJS) - $(CXX) -o $@ $^ $(DEBUG_x86_32_FLAGS) $(LDFLAGS) - -# Define Link rule for 64 bit debug NEXE -DBG/$(PROJECT)_x86_64.nexe : $(DEBUG_x86_64_OBJS) - $(CXX) -o $@ $^ $(DEBUG_x86_64_FLAGS) $(LDFLAGS) +CYGWIN ?= nodosfilewarning +export CYGWIN -# Define rule for building NMF file and copying dependencies -DBG/$(PROJECT).nmf : DBG/$(PROJECT)_x86_64.nexe DBG/$(PROJECT)_x86_32.nexe - $(NMF) -o $@ -s DBG $(NMF_PATHS) $^ -# Define a DEBUG alias to build the debug version -DBG_NEXES:= DBG/$(PROJECT)_x86_32.nexe DBG/$(PROJECT)_x86_64.nexe -.PHONY : DEBUG RUN_DEBUG -DEBUG : $(DBG_NEXES) DBG/$(PROJECT).nmf $(DBG_COPIES) +# Default target is everything +all : hello_world_x86_32.nexe hello_world_x86_64.nexe hello_world.nmf -# Define a RUN_DEBUG alias to build and server the DEBUG version -RUN_DEBUG: DEBUG - cd DBG && python ../../httpd.py +# Define compile and link rule for 32 bit (-m32) nexe +hello_world_x86_32.nexe : hello_world.c $(THIS_MAKE) + $(CC) -o $@ $< -m32 -O0 -g $(CFLAGS) -lppapi +# Define compile and link rule for 64 bit (-m64) nexe +hello_world_x86_64.nexe : hello_world.c $(THIS_MAKE) + $(CC) -o $@ $< -m64 -O0 -g $(CFLAGS) -lppapi # -# Release build rules. +# NMF Manifiest generation # -RELEASE_x86_32_FLAGS:=-m32 -O2 -g -RELEASE_x86_64_FLAGS:=-m64 -O2 -g -RELEASE_x86_32_OBJS:=$(patsubst %.cc,REL/x86_32/%.o,$(CXX_SOURCES)) -RELEASE_x86_64_OBJS:=$(patsubst %.cc,REL/x86_64/%.o,$(CXX_SOURCES)) - -REL: - $(MKDIR) -p $@ - -REL/x86_32: - $(MKDIR) -p $@ - -REL/x86_64: - $(MKDIR) -p $@ - -# Copy all files to that config -$(foreach src,$(COPY_FILES),$(eval $(call FILE_COPY,$(src),REL))) - -# Include generated dependencies --include REL/x86_32/*.d --include REL/x86_64/*.d - -# Define compile rule for all 32 bit debug objects -REL/x86_32/%.o : %.cc $(THIS_MAKE) | REL/x86_32 - $(CXX) -o $@ -c $< $(RELEASE_x86_32_FLAGS) $(CXXFLAGS) -MMD -MF $@.d - -# Define compile rule for all 64 bit debug objects -REL/x86_64/%.o : %.cc $(THIS_MAKE) | REL/x86_64 - $(CXX) -o $@ -c $< $(RELEASE_x86_64_FLAGS) $(CXXFLAGS) -MMD -MF $@.d - -# Define Link rule for 32 bit optimized and stripped NEXE -REL/$(PROJECT)_x86_32.nexe : $(RELEASE_x86_32_OBJS) - $(CXX) -o $@.unstripped $^ $(RELEASE_x86_32_FLAGS) $(LDFLAGS) - $(STRIP) $< -o $@ - -# Define Link rule for 64 bit optimized and stripped NEXE -REL/$(PROJECT)_x86_64.nexe : $(RELEASE_x86_64_OBJS) - $(CXX) -o $@.unstripped $^ $(RELEASE_x86_64_FLAGS) $(LDFLAGS) - $(STRIP) $@.unstripped -o $@ - -# Define rule for building NMF file and copying dependencies -REL/$(PROJECT).nmf : REL/$(PROJECT)_x86_64.nexe REL/$(PROJECT)_x86_32.nexe - $(NMF) -o $@ -s REL $(NMF_PATHS) $^ +# Use the python script create_nmf to scan the binaries for dependencies using +# objdump. Pass in the (-L) paths to the default library toolchains so that we +# can find those libraries and have it automatically copy the files (-s) to +# the target directory for us. +NMF:=python $(NACL_SDK_ROOT)/tools/create_nmf.py +NMF_ARGS:=-D $(TC_PATH)/x86_64-nacl/bin/objdump +NMF_PATHS:=-L $(TC_PATH)/x86_64-nacl/lib32 -L $(TC_PATH)/x86_64-nacl/lib -# Define a RELEASE alias to build the debug version -.PHONY : RELEASE RUN_RELEASE -REL_NEXES:=REL/$(PROJECT)_x86_32.nexe REL/$(PROJECT)_x86_64.nexe -RELEASE : $(REL_NEXES) REL/$(PROJECT).nmf $(REL_COPIES) +hello_world.nmf : hello_world_x86_64.nexe hello_world_x86_32.nexe + echo $(NMF) $(NMF_ARGS) -s . -o $@ $(NMF_PATHS) $^ + $(NMF) $(NMF_ARGS) -s . -o $@ $(NMF_PATHS) $^ -# Define a RUN_RELEASE alias to build and server the RELEASE version -RUN_RELEASE: RELEASE - cd REL && python ../../httpd.py +# Define a phony rule so it always runs, to build nexe and start up server. +.PHONY: RUN +RUN: all + python ../httpd.py diff --git a/native_client_sdk/src/examples/hello_world_glibc/hello_world.c b/native_client_sdk/src/examples/hello_world_glibc/hello_world.c new file mode 100644 index 0000000..ab13e83 --- /dev/null +++ b/native_client_sdk/src/examples/hello_world_glibc/hello_world.c @@ -0,0 +1,182 @@ +/* Copyright (c) 2012 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/** @file hello_world.c + * This example demonstrates loading, running and scripting a very simple + * NaCl module. + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "ppapi/c/pp_errors.h" +#include "ppapi/c/pp_module.h" +#include "ppapi/c/pp_var.h" +#include "ppapi/c/ppb.h" +#include "ppapi/c/ppb_instance.h" +#include "ppapi/c/ppb_messaging.h" +#include "ppapi/c/ppb_var.h" +#include "ppapi/c/ppp.h" +#include "ppapi/c/ppp_instance.h" +#include "ppapi/c/ppp_messaging.h" + +static PPB_Messaging* ppb_messaging_interface = NULL; +static PPB_Var* ppb_var_interface = NULL; + + +/** + * Creates new string PP_Var from C string. The resulting object will be a + * refcounted string object. It will be AddRef()ed for the caller. When the + * caller is done with it, it should be Release()d. + * @param[in] str C string to be converted to PP_Var + * @return PP_Var containing string. + */ +static struct PP_Var CStrToVar(const char* str) { + if (ppb_var_interface != NULL) { + return ppb_var_interface->VarFromUtf8(str, strlen(str)); + } + return PP_MakeUndefined(); +} + + +/** + * Called when the NaCl module is instantiated on the web page. The identifier + * of the new instance will be passed in as the first argument (this value is + * generated by the browser and is an opaque handle). This is called for each + * instantiation of the NaCl module, which is each time the <embed> tag for + * this module is encountered. + * + * If this function reports a failure (by returning @a PP_FALSE), the NaCl + * module will be deleted and DidDestroy will be called. + * @param[in] instance The identifier of the new instance representing this + * NaCl module. + * @param[in] argc The number of arguments contained in @a argn and @a argv. + * @param[in] argn An array of argument names. These argument names are + * supplied in the <embed> tag, for example: + * <embed id="nacl_module" dimensions="2"> + * will produce two arguments, one named "id" and one named "dimensions". + * @param[in] argv An array of argument values. These are the values of the + * arguments listed in the <embed> tag. In the above example, there will + * be two elements in this array, "nacl_module" and "2". The indices of + * these values match the indices of the corresponding names in @a argn. + * @return @a PP_TRUE on success. + */ +static PP_Bool Instance_DidCreate(PP_Instance instance, + uint32_t argc, + const char* argn[], + const char* argv[]) { + ppb_messaging_interface->PostMessage(instance, + CStrToVar("Hello a World (GLIBC)")); + return PP_TRUE; +} + + +/** + * Called when the NaCl module is destroyed. This will always be called, + * even if DidCreate returned failure. This routine should deallocate any data + * associated with the instance. + * @param[in] instance The identifier of the instance representing this NaCl + * module. + */ +static void Instance_DidDestroy(PP_Instance instance) { +} + +/** + * Called when the position, the size, or the clip rect of the element in the + * browser that corresponds to this NaCl module has changed. + * @param[in] instance The identifier of the instance representing this NaCl + * module. + * @param[in] position The location on the page of this NaCl module. This is + * relative to the top left corner of the viewport, which changes as the + * page is scrolled. + * @param[in] clip The visible region of the NaCl module. This is relative to + * the top left of the plugin's coordinate system (not the page). If the + * plugin is invisible, @a clip will be (0, 0, 0, 0). + */ +static void Instance_DidChangeView(PP_Instance instance, + PP_Resource view_resource) { +} + +/** + * Notification that the given NaCl module has gained or lost focus. + * Having focus means that keyboard events will be sent to the NaCl module + * represented by @a instance. A NaCl module's default condition is that it + * will not have focus. + * + * Note: clicks on NaCl modules will give focus only if you handle the + * click event. You signal if you handled it by returning @a true from + * HandleInputEvent. Otherwise the browser will bubble the event and give + * focus to the element on the page that actually did end up consuming it. + * If you're not getting focus, check to make sure you're returning true from + * the mouse click in HandleInputEvent. + * @param[in] instance The identifier of the instance representing this NaCl + * module. + * @param[in] has_focus Indicates whether this NaCl module gained or lost + * event focus. + */ +static void Instance_DidChangeFocus(PP_Instance instance, + PP_Bool has_focus) { +} + +/** + * Handler that gets called after a full-frame module is instantiated based on + * registered MIME types. This function is not called on NaCl modules. This + * function is essentially a place-holder for the required function pointer in + * the PPP_Instance structure. + * @param[in] instance The identifier of the instance representing this NaCl + * module. + * @param[in] url_loader A PP_Resource an open PPB_URLLoader instance. + * @return PP_FALSE. + */ +static PP_Bool Instance_HandleDocumentLoad(PP_Instance instance, + PP_Resource url_loader) { + /* NaCl modules do not need to handle the document load function. */ + return PP_FALSE; +} + + + +/** + * Entry points for the module. + * Initialize needed interfaces: PPB_Core, PPB_Messaging and PPB_Var. + * @param[in] a_module_id module ID + * @param[in] get_browser pointer to PPB_GetInterface + * @return PP_OK on success, any other value on failure. + */ +PP_EXPORT int32_t PPP_InitializeModule(PP_Module a_module_id, + PPB_GetInterface get_browser) { + ppb_messaging_interface = + (PPB_Messaging*)(get_browser(PPB_MESSAGING_INTERFACE)); + ppb_var_interface = (PPB_Var*)(get_browser(PPB_VAR_INTERFACE)); + return PP_OK; +} + + +/** + * Returns an interface pointer for the interface of the given name, or NULL + * if the interface is not supported. + * @param[in] interface_name name of the interface + * @return pointer to the interface + */ +PP_EXPORT const void* PPP_GetInterface(const char* interface_name) { + if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) { + static PPP_Instance instance_interface = { + &Instance_DidCreate, + &Instance_DidDestroy, + &Instance_DidChangeView, + &Instance_DidChangeFocus, + &Instance_HandleDocumentLoad, + }; + return &instance_interface; + } + return NULL; +} + + +/** + * Called before the plugin module is unloaded. + */ +PP_EXPORT void PPP_ShutdownModule() { +} diff --git a/native_client_sdk/src/examples/hello_world_glibc/hello_world.cc b/native_client_sdk/src/examples/hello_world_glibc/hello_world.cc deleted file mode 100644 index 438b7bf..0000000 --- a/native_client_sdk/src/examples/hello_world_glibc/hello_world.cc +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/// @file -/// This example demonstrates loading, running and scripting a very simple NaCl -/// module. To load the NaCl module, the browser first looks for the -/// CreateModule() factory method (at the end of this file). It calls -/// CreateModule() once to load the module code from your .nexe. After the -/// .nexe code is loaded, CreateModule() is not called again. -/// -/// Once the .nexe code is loaded, the browser then calls the -/// HelloWorldModule::CreateInstance() -/// method on the object returned by CreateModule(). It calls CreateInstance() -/// each time it encounters an <embed> tag that references your NaCl module. - -#include <cstdio> -#include <cstring> -#include <string> -#include "ppapi/cpp/instance.h" -#include "ppapi/cpp/module.h" -#include "ppapi/cpp/var.h" - -#include "helper_functions.h" - -namespace hello_world { -/// Method name for ReverseText, as seen by JavaScript code. -const char* const kReverseTextMethodId = "reverseText"; - -/// Method name for FortyTwo, as seen by Javascript code. @see FortyTwo() -const char* const kFortyTwoMethodId = "fortyTwo"; - -/// Separator character for the reverseText method. -static const char kMessageArgumentSeparator = ':'; - -/// This is the module's function that invokes FortyTwo and converts the return -/// value from an int32_t to a pp::Var for return. -pp::Var MarshallFortyTwo() { - return pp::Var(FortyTwo()); -} - -/// This function is passed the arg list from the JavaScript call to -/// @a reverseText. -/// It makes sure that there is one argument and that it is a string, returning -/// an error message if it is not. -/// On good input, it calls ReverseText and returns the result. The result is -/// then sent back via a call to PostMessage. -pp::Var MarshallReverseText(const std::string& text) { - return pp::Var(ReverseText(text)); -} - -/// The Instance class. One of these exists for each instance of your NaCl -/// module on the web page. The browser will ask the Module object to create -/// a new Instance for each occurrence of the <embed> tag that has these -/// attributes: -/// <pre> -/// type="application/x-nacl" -/// nacl="hello_world.nmf" -/// </pre> -class HelloWorldInstance : public pp::Instance { - public: - explicit HelloWorldInstance(PP_Instance instance) : pp::Instance(instance) { - printf("HelloWorldInstance.\n"); - } - virtual ~HelloWorldInstance() {} - - /// Called by the browser to handle the postMessage() call in Javascript. - /// Detects which method is being called from the message contents, and - /// calls the appropriate function. Posts the result back to the browser - /// asynchronously. - /// @param[in] var_message The message posted by the browser. The possible - /// messages are 'fortyTwo' and 'reverseText:Hello World'. Note that - /// the 'reverseText' form contains the string to reverse following a ':' - /// separator. - virtual void HandleMessage(const pp::Var& var_message); -}; - -void HelloWorldInstance::HandleMessage(const pp::Var& var_message) { - if (!var_message.is_string()) { - return; - } - std::string message = var_message.AsString(); - pp::Var return_var; - if (message == kFortyTwoMethodId) { - // Note that no arguments are passed in to FortyTwo. - return_var = MarshallFortyTwo(); - } else if (message.find(kReverseTextMethodId) == 0) { - // The argument to reverseText is everything after the first ':'. - size_t sep_pos = message.find_first_of(kMessageArgumentSeparator); - if (sep_pos != std::string::npos) { - std::string string_arg = message.substr(sep_pos + 1); - return_var = MarshallReverseText(string_arg); - } - } - // Post the return result back to the browser. Note that HandleMessage() is - // always called on the main thread, so it's OK to post the return message - // directly from here. The return post is asynhronous: PostMessage returns - // immediately. - PostMessage(return_var); -} - -/// The Module class. The browser calls the CreateInstance() method to create -/// an instance of your NaCl module on the web page. The browser creates a new -/// instance for each <embed> tag with -/// <code>type="application/x-nacl"</code>. -class HelloWorldModule : public pp::Module { - public: - HelloWorldModule() : pp::Module() { - printf("Got here.\n"); - } - virtual ~HelloWorldModule() {} - - /// Create and return a HelloWorldInstance object. - /// @param[in] instance a handle to a plug-in instance. - /// @return a newly created HelloWorldInstance. - /// @note The browser is responsible for calling @a delete when done. - virtual pp::Instance* CreateInstance(PP_Instance instance) { - return new HelloWorldInstance(instance); - } -}; -} // namespace hello_world - - -namespace pp { -/// Factory function called by the browser when the module is first loaded. -/// The browser keeps a singleton of this module. It calls the -/// CreateInstance() method on the object you return to make instances. There -/// is one instance per <embed> tag on the page. This is the main binding -/// point for your NaCl module with the browser. -/// @return new HelloWorldModule. -/// @note The browser is responsible for deleting returned @a Module. -Module* CreateModule() { - return new hello_world::HelloWorldModule(); -} -} // namespace pp diff --git a/native_client_sdk/src/examples/hello_world_glibc/hello_world.html b/native_client_sdk/src/examples/hello_world_glibc/hello_world.html index ec1b4e7..60f3722 100644 --- a/native_client_sdk/src/examples/hello_world_glibc/hello_world.html +++ b/native_client_sdk/src/examples/hello_world_glibc/hello_world.html @@ -1,13 +1,12 @@ <!DOCTYPE html> <html> <!-- - Copyright (c) 2011 The Chromium Authors. All rights reserved. + Copyright (c) 2012 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> <head> <title>Hello, World!</title> - <script type="text/javascript"> helloWorldModule = null; // Global application object. statusText = 'NO-STATUS'; @@ -27,10 +26,6 @@ // status message indicating that the module is still loading. Otherwise, // do not change the status message. function pageDidLoad() { - // Set the focus on the text input box. Doing this means you can press - // return as soon as the page loads, and it will fire the reversetText() - // function. - document.forms.helloForm.inputBox.focus(); if (helloWorldModule == null) { updateStatus('LOADING...'); } else { @@ -42,19 +37,6 @@ } } - function fortyTwo() { - helloWorldModule.postMessage('fortyTwo'); - } - - function reverseText() { - // Grab the text from the text box, pass it into reverseText() - var inputBox = document.forms.helloForm.inputBox; - helloWorldModule.postMessage('reverseText:' + inputBox.value); - // Note: a |false| return tells the <form> tag to cancel the GET action - // when submitting the form. - return false; - } - // Set the global status message. If the element with id 'statusField' // exists, then set its HTML to the status message as well. // opt_message The message test. If this is null or undefined, then @@ -73,29 +55,20 @@ <body onload="pageDidLoad()"> <h1>Native Client Simple Module</h1> -<p> - <form name="helloForm" - action="" - method="get" - onsubmit="return reverseText()"> - <input type="text" id="inputBox" name="inputBox" value="Hello world" /><p/> - <input type="button" value="Call fortyTwo()" onclick="fortyTwo()" /> - <input type="submit" value="Call reverseText()" /> - </form> - <!-- Load the published .nexe. This includes the 'src' attribute which - shows how to load multi-architecture modules. Each entry in the "nexes" - object in the .nmf manifest file is a key-value pair: the key is the runtime - ('x86-32', 'x86-64', etc.); the value is a URL for the desired NaCl module. - To load the debug versions of your .nexes, set the 'src' attribute to the - _dbg.nmf version of the manifest file. - - Note: The <EMBED> element is wrapped inside a <DIV>, which has both a 'load' +<h2>Status: <code id="statusField">NO-STATUS</code></h2> + <!-- The <EMBED> element is wrapped inside a <DIV>, which has both a 'load' and a 'message' event listener attached. This wrapping method is used instead of attaching the event listeners directly to the <EMBED> element to ensure that the listeners are active before the NaCl module 'load' event fires. This also allows you to use PPB_Messaging.PostMessage() (in C) or pp::Instance.PostMessage() (in C++) from within the initialization code in - your NaCl module. + your NaCl module. + + The src points to a manifest file, which provides the Native Client plug-in + a mapping between architecture and NaCl Executable (NEXE). + + We use a non-zero sized embed to give Chrome space to place the bad plug-in + graphic, if there is a problem. --> <div id="listener"> <script type="text/javascript"> @@ -106,21 +79,9 @@ <embed name="nacl_module" id="hello_world" - width=0 height=0 + width=200 height=200 src="hello_world.nmf" type="application/x-nacl" /> </div> - -</p> - -<p>If the module is working correctly, a click on the "Call fortyTwo()" button - should open a popup dialog containing <b>42</b> as its value.</p> - -<p> Clicking on the "Call reverseText()" button - should open a popup dialog containing the textbox contents and its reverse - as its value.</p> - -<h2>Status</h2> -<div id="statusField">NO-STATUS</div> </body> </html> diff --git a/native_client_sdk/src/examples/hello_world_glibc/helper_functions.cc b/native_client_sdk/src/examples/hello_world_glibc/helper_functions.cc deleted file mode 100644 index 2b43c605..0000000 --- a/native_client_sdk/src/examples/hello_world_glibc/helper_functions.cc +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <algorithm> - -#include "helper_functions.h" - -namespace hello_world { - -int32_t FortyTwo() { - return 42; -} - -std::string ReverseText(const std::string& text) { - std::string reversed_string(text); - // Use reverse to reverse |reversed_string| in place. - std::reverse(reversed_string.begin(), reversed_string.end()); - return reversed_string; -} -} // namespace hello_world - diff --git a/native_client_sdk/src/examples/hello_world_glibc/helper_functions.h b/native_client_sdk/src/examples/hello_world_glibc/helper_functions.h deleted file mode 100644 index 5076300..0000000 --- a/native_client_sdk/src/examples/hello_world_glibc/helper_functions.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef EXAMPLES_HELLO_WORLD_HELPER_FUNCTIONS_H_ -#define EXAMPLES_HELLO_WORLD_HELPER_FUNCTIONS_H_ - -/// @file -/// These functions are stand-ins for your complicated computations which you -/// want to run in native code. We do two very simple things: return 42, and -/// reverse a string. But you can imagine putting more complicated things here -/// which might be difficult or slow to achieve in JavaScript, such as -/// cryptography, artificial intelligence, signal processing, physics modeling, -/// etc. See hello_world.cc for the code which is required for loading a NaCl -/// application and exposing methods to JavaScript. - -#include <ppapi/c/pp_stdint.h> -#include <string> - -namespace hello_world { - -/// This is the module's function that does the work to compute the value 42. -int32_t FortyTwo(); - -/// This function is passed a string and returns a copy of the string with the -/// characters in reverse order. -/// @param[in] text The string to reverse. -/// @return A copy of @a text with the characters in reverse order. -std::string ReverseText(const std::string& text); - -} // namespace hello_world - -#endif // EXAMPLES_HELLO_WORLD_HELPER_FUNCTIONS_H_ - diff --git a/native_client_sdk/src/examples/hello_world_interactive/Makefile b/native_client_sdk/src/examples/hello_world_interactive/Makefile new file mode 100644 index 0000000..62e9f95 --- /dev/null +++ b/native_client_sdk/src/examples/hello_world_interactive/Makefile @@ -0,0 +1,70 @@ +# Copyright (c) 2011 The Native Client Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# +# GNU Make based build file. For details on GNU Make see: +# http://www.gnu.org/software/make/manual/make.html +# + + +# +# Get pepper directory for toolchain and includes. +# +# If NACL_SDK_ROOT is not set, then assume it can be found a two directories up, +# from the default example directory location. +# +THIS_MAKEFILE:=$(abspath $(lastword $(MAKEFILE_LIST))) +NACL_SDK_ROOT?=$(abspath $(dir $(THIS_MAKEFILE))../..) + + +# +# Project Build flags +# +# Turns on warnings (-Wxxx), builds with zero optimization (-O0) and adds debug +# information (-g) for correctness and ease of debugging. +WARNINGS:=-Wno-long-long -Wall -Wswitch-enum -Werror -pedantic +CXXFLAGS:=-pthread -O0 $(WARNINGS) + + +# +# Compute path to compiler +# +OSNAME:=$(shell python $(NACL_SDK_ROOT)/tools/getos.py) +TC_PATH:=$(abspath $(NACL_SDK_ROOT)/toolchain/$(OSNAME)_x86_newlib) + + +# Alias for C compiler +CXX:=$(TC_PATH)/bin/i686-nacl-g++ + + +# +# Disable DOS PATH warning when using Cygwin based tools Windows +# +CYGWIN ?= nodosfilewarning +export CYGWIN + +# Default target is everything +all : hello_world_x86_32.nexe hello_world_x86_64.nexe + +# Define 32 bit compile rule for C++ sources +hello_world_32.o helper_functions_32.o : %_32.o : %.cc + $(CXX) -o $@ -c $< -m32 -O0 -g $(CXXFLAGS) + +# Define 64 bit compile rule for C++ sources +hello_world_64.o helper_functions_64.o : %_64.o : %.cc + $(CXX) -o $@ -c $< -m64 -O0 -g $(CXXFLAGS) + +# Define link rule for 32 bit (-m32) nexe +hello_world_x86_32.nexe : hello_world_32.o helper_functions_32.o + $(CXX) -o $@ $^ -m32 -O0 -g -lppapi_cpp -lppapi + +# Define link rule for 64 bit (-m64) nexe +hello_world_x86_64.nexe : hello_world_64.o helper_functions_64.o + $(CXX) -o $@ $^ -m64 -O0 -g -lppapi_cpp -lppapi + +# Define a phony rule so it always runs, to build nexe and start up server. +.PHONY: RUN +RUN: all + python ../httpd.py + diff --git a/native_client_sdk/src/examples/hello_world/hello_world.cc b/native_client_sdk/src/examples/hello_world_interactive/hello_world.cc index 438b7bf..438b7bf 100644 --- a/native_client_sdk/src/examples/hello_world/hello_world.cc +++ b/native_client_sdk/src/examples/hello_world_interactive/hello_world.cc diff --git a/native_client_sdk/src/examples/hello_world/hello_world.html b/native_client_sdk/src/examples/hello_world_interactive/hello_world.html index ec1b4e7..516a995 100644 --- a/native_client_sdk/src/examples/hello_world/hello_world.html +++ b/native_client_sdk/src/examples/hello_world_interactive/hello_world.html @@ -106,7 +106,7 @@ <embed name="nacl_module" id="hello_world" - width=0 height=0 + width=200 height=200 src="hello_world.nmf" type="application/x-nacl" /> </div> diff --git a/native_client_sdk/src/examples/hello_world/hello_world.nmf b/native_client_sdk/src/examples/hello_world_interactive/hello_world.nmf index 78df8e1..78df8e1 100644 --- a/native_client_sdk/src/examples/hello_world/hello_world.nmf +++ b/native_client_sdk/src/examples/hello_world_interactive/hello_world.nmf diff --git a/native_client_sdk/src/examples/hello_world/helper_functions.cc b/native_client_sdk/src/examples/hello_world_interactive/helper_functions.cc index 2b43c605..2b43c605 100644 --- a/native_client_sdk/src/examples/hello_world/helper_functions.cc +++ b/native_client_sdk/src/examples/hello_world_interactive/helper_functions.cc diff --git a/native_client_sdk/src/examples/hello_world/helper_functions.h b/native_client_sdk/src/examples/hello_world_interactive/helper_functions.h index 5076300..5076300 100644 --- a/native_client_sdk/src/examples/hello_world/helper_functions.h +++ b/native_client_sdk/src/examples/hello_world_interactive/helper_functions.h diff --git a/native_client_sdk/src/examples/hello_world/test_helper_functions.cc b/native_client_sdk/src/examples/hello_world_interactive/test_helper_functions.cc index 30d3f27..30d3f27 100644 --- a/native_client_sdk/src/examples/hello_world/test_helper_functions.cc +++ b/native_client_sdk/src/examples/hello_world_interactive/test_helper_functions.cc diff --git a/native_client_sdk/src/examples/hello_world_newlib/Makefile b/native_client_sdk/src/examples/hello_world_newlib/Makefile new file mode 100644 index 0000000..71f29cb --- /dev/null +++ b/native_client_sdk/src/examples/hello_world_newlib/Makefile @@ -0,0 +1,61 @@ +# Copyright (c) 2012 The Native Client Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# +# GNU Make based build file. For details on GNU Make see: +# http://www.gnu.org/software/make/manual/make.html +# + + +# +# Get pepper directory for toolchain and includes. +# +# If NACL_SDK_ROOT is not set, then assume it can be found a two directories up, +# from the default example directory location. +# +THIS_MAKEFILE:=$(abspath $(lastword $(MAKEFILE_LIST))) +NACL_SDK_ROOT?=$(abspath $(dir $(THIS_MAKEFILE))../..) + + +# +# Project Build flags +# +# Turns on warnings (-Wxxx), builds with zero optimization (-O0) and adds debug +# information (-g) for correctness and ease of debugging. +WARNINGS:=-Wno-long-long -Wall -Wswitch-enum -Werror -pedantic +CFLAGS:=-pthread -O0 -g $(WARNINGS) + + +# +# Compute path to compiler +# +OSNAME:=$(shell python $(NACL_SDK_ROOT)/tools/getos.py) +TC_PATH:=$(abspath $(NACL_SDK_ROOT)/toolchain/$(OSNAME)_x86_newlib) + + +# Alias for C compiler +CC:=$(TC_PATH)/bin/i686-nacl-gcc + + +# +# Disable DOS PATH warning when using Cygwin based tools Windows +# +CYGWIN ?= nodosfilewarning +export CYGWIN + +# Default target is everything +all : hello_world_x86_32.nexe hello_world_x86_64.nexe + +# Define compile and link rule for 32 bit (-m32) nexe +hello_world_x86_32.nexe : hello_world.c $(THIS_MAKE) + $(CC) -o $@ $< -m32 -O0 -g $(CFLAGS) -lppapi + +# Define compile and link rule for 64 bit (-m64) nexe +hello_world_x86_64.nexe : hello_world.c $(THIS_MAKE) + $(CC) -o $@ $< -m64 -O0 -g $(CFLAGS) -lppapi + +# Define a phony rule so it always runs, to build nexe and start up server. +.PHONY: RUN +RUN: all + python ../httpd.py diff --git a/native_client_sdk/src/examples/hello_world_newlib/hello_world.c b/native_client_sdk/src/examples/hello_world_newlib/hello_world.c new file mode 100644 index 0000000..72c7a4a --- /dev/null +++ b/native_client_sdk/src/examples/hello_world_newlib/hello_world.c @@ -0,0 +1,182 @@ +/* Copyright (c) 2012 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/** @file hello_world.c + * This example demonstrates loading, running and scripting a very simple + * NaCl module. + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "ppapi/c/pp_errors.h" +#include "ppapi/c/pp_module.h" +#include "ppapi/c/pp_var.h" +#include "ppapi/c/ppb.h" +#include "ppapi/c/ppb_instance.h" +#include "ppapi/c/ppb_messaging.h" +#include "ppapi/c/ppb_var.h" +#include "ppapi/c/ppp.h" +#include "ppapi/c/ppp_instance.h" +#include "ppapi/c/ppp_messaging.h" + +static PPB_Messaging* ppb_messaging_interface = NULL; +static PPB_Var* ppb_var_interface = NULL; + + +/** + * Creates new string PP_Var from C string. The resulting object will be a + * refcounted string object. It will be AddRef()ed for the caller. When the + * caller is done with it, it should be Release()d. + * @param[in] str C string to be converted to PP_Var + * @return PP_Var containing string. + */ +static struct PP_Var CStrToVar(const char* str) { + if (ppb_var_interface != NULL) { + return ppb_var_interface->VarFromUtf8(str, strlen(str)); + } + return PP_MakeUndefined(); +} + + +/** + * Called when the NaCl module is instantiated on the web page. The identifier + * of the new instance will be passed in as the first argument (this value is + * generated by the browser and is an opaque handle). This is called for each + * instantiation of the NaCl module, which is each time the <embed> tag for + * this module is encountered. + * + * If this function reports a failure (by returning @a PP_FALSE), the NaCl + * module will be deleted and DidDestroy will be called. + * @param[in] instance The identifier of the new instance representing this + * NaCl module. + * @param[in] argc The number of arguments contained in @a argn and @a argv. + * @param[in] argn An array of argument names. These argument names are + * supplied in the <embed> tag, for example: + * <embed id="nacl_module" dimensions="2"> + * will produce two arguments, one named "id" and one named "dimensions". + * @param[in] argv An array of argument values. These are the values of the + * arguments listed in the <embed> tag. In the above example, there will + * be two elements in this array, "nacl_module" and "2". The indices of + * these values match the indices of the corresponding names in @a argn. + * @return @a PP_TRUE on success. + */ +static PP_Bool Instance_DidCreate(PP_Instance instance, + uint32_t argc, + const char* argn[], + const char* argv[]) { + ppb_messaging_interface->PostMessage(instance, + CStrToVar("Hello a World (NEWLIB)")); + return PP_TRUE; +} + + +/** + * Called when the NaCl module is destroyed. This will always be called, + * even if DidCreate returned failure. This routine should deallocate any data + * associated with the instance. + * @param[in] instance The identifier of the instance representing this NaCl + * module. + */ +static void Instance_DidDestroy(PP_Instance instance) { +} + +/** + * Called when the position, the size, or the clip rect of the element in the + * browser that corresponds to this NaCl module has changed. + * @param[in] instance The identifier of the instance representing this NaCl + * module. + * @param[in] position The location on the page of this NaCl module. This is + * relative to the top left corner of the viewport, which changes as the + * page is scrolled. + * @param[in] clip The visible region of the NaCl module. This is relative to + * the top left of the plugin's coordinate system (not the page). If the + * plugin is invisible, @a clip will be (0, 0, 0, 0). + */ +static void Instance_DidChangeView(PP_Instance instance, + PP_Resource view_resource) { +} + +/** + * Notification that the given NaCl module has gained or lost focus. + * Having focus means that keyboard events will be sent to the NaCl module + * represented by @a instance. A NaCl module's default condition is that it + * will not have focus. + * + * Note: clicks on NaCl modules will give focus only if you handle the + * click event. You signal if you handled it by returning @a true from + * HandleInputEvent. Otherwise the browser will bubble the event and give + * focus to the element on the page that actually did end up consuming it. + * If you're not getting focus, check to make sure you're returning true from + * the mouse click in HandleInputEvent. + * @param[in] instance The identifier of the instance representing this NaCl + * module. + * @param[in] has_focus Indicates whether this NaCl module gained or lost + * event focus. + */ +static void Instance_DidChangeFocus(PP_Instance instance, + PP_Bool has_focus) { +} + +/** + * Handler that gets called after a full-frame module is instantiated based on + * registered MIME types. This function is not called on NaCl modules. This + * function is essentially a place-holder for the required function pointer in + * the PPP_Instance structure. + * @param[in] instance The identifier of the instance representing this NaCl + * module. + * @param[in] url_loader A PP_Resource an open PPB_URLLoader instance. + * @return PP_FALSE. + */ +static PP_Bool Instance_HandleDocumentLoad(PP_Instance instance, + PP_Resource url_loader) { + /* NaCl modules do not need to handle the document load function. */ + return PP_FALSE; +} + + + +/** + * Entry points for the module. + * Initialize needed interfaces: PPB_Core, PPB_Messaging and PPB_Var. + * @param[in] a_module_id module ID + * @param[in] get_browser pointer to PPB_GetInterface + * @return PP_OK on success, any other value on failure. + */ +PP_EXPORT int32_t PPP_InitializeModule(PP_Module a_module_id, + PPB_GetInterface get_browser) { + ppb_messaging_interface = + (PPB_Messaging*)(get_browser(PPB_MESSAGING_INTERFACE)); + ppb_var_interface = (PPB_Var*)(get_browser(PPB_VAR_INTERFACE)); + return PP_OK; +} + + +/** + * Returns an interface pointer for the interface of the given name, or NULL + * if the interface is not supported. + * @param[in] interface_name name of the interface + * @return pointer to the interface + */ +PP_EXPORT const void* PPP_GetInterface(const char* interface_name) { + if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) { + static PPP_Instance instance_interface = { + &Instance_DidCreate, + &Instance_DidDestroy, + &Instance_DidChangeView, + &Instance_DidChangeFocus, + &Instance_HandleDocumentLoad, + }; + return &instance_interface; + } + return NULL; +} + + +/** + * Called before the plugin module is unloaded. + */ +PP_EXPORT void PPP_ShutdownModule() { +} diff --git a/native_client_sdk/src/examples/hello_world_newlib/hello_world.html b/native_client_sdk/src/examples/hello_world_newlib/hello_world.html new file mode 100644 index 0000000..60f3722 --- /dev/null +++ b/native_client_sdk/src/examples/hello_world_newlib/hello_world.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<html> + <!-- + Copyright (c) 2012 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. + --> +<head> + <title>Hello, World!</title> + <script type="text/javascript"> + helloWorldModule = null; // Global application object. + statusText = 'NO-STATUS'; + + // Indicate success when the NaCl module has loaded. + function moduleDidLoad() { + helloWorldModule = document.getElementById('hello_world'); + updateStatus('SUCCESS'); + } + + // Handle a message coming from the NaCl module. + function handleMessage(message_event) { + alert(message_event.data); + } + + // If the page loads before the Native Client module loads, then set the + // status message indicating that the module is still loading. Otherwise, + // do not change the status message. + function pageDidLoad() { + if (helloWorldModule == null) { + updateStatus('LOADING...'); + } else { + // It's possible that the Native Client module onload event fired + // before the page's onload event. In this case, the status message + // will reflect 'SUCCESS', but won't be displayed. This call will + // display the current message. + updateStatus(); + } + } + + // Set the global status message. If the element with id 'statusField' + // exists, then set its HTML to the status message as well. + // opt_message The message test. If this is null or undefined, then + // attempt to set the element with id 'statusField' to the value of + // |statusText|. + function updateStatus(opt_message) { + if (opt_message) + statusText = opt_message; + var statusField = document.getElementById('statusField'); + if (statusField) { + statusField.innerHTML = statusText; + } + } + </script> +</head> +<body onload="pageDidLoad()"> + +<h1>Native Client Simple Module</h1> +<h2>Status: <code id="statusField">NO-STATUS</code></h2> + <!-- The <EMBED> element is wrapped inside a <DIV>, which has both a 'load' + and a 'message' event listener attached. This wrapping method is used + instead of attaching the event listeners directly to the <EMBED> element to + ensure that the listeners are active before the NaCl module 'load' event + fires. This also allows you to use PPB_Messaging.PostMessage() (in C) or + pp::Instance.PostMessage() (in C++) from within the initialization code in + your NaCl module. + + The src points to a manifest file, which provides the Native Client plug-in + a mapping between architecture and NaCl Executable (NEXE). + + We use a non-zero sized embed to give Chrome space to place the bad plug-in + graphic, if there is a problem. + --> + <div id="listener"> + <script type="text/javascript"> + var listener = document.getElementById('listener') + listener.addEventListener('load', moduleDidLoad, true); + listener.addEventListener('message', handleMessage, true); + </script> + + <embed name="nacl_module" + id="hello_world" + width=200 height=200 + src="hello_world.nmf" + type="application/x-nacl" /> + </div> +</body> +</html> diff --git a/native_client_sdk/src/examples/hello_world_newlib/hello_world.nmf b/native_client_sdk/src/examples/hello_world_newlib/hello_world.nmf new file mode 100644 index 0000000..78df8e1 --- /dev/null +++ b/native_client_sdk/src/examples/hello_world_newlib/hello_world.nmf @@ -0,0 +1,6 @@ +{ + "program": { + "x86-64": {"url": "hello_world_x86_64.nexe"}, + "x86-32": {"url": "hello_world_x86_32.nexe"} + } +} diff --git a/native_client_sdk/src/examples/hello_world_c/hello_world_c.c b/native_client_sdk/src/examples/hello_world_newlib/hello_world_c.c index 5169514..5169514 100644 --- a/native_client_sdk/src/examples/hello_world_c/hello_world_c.c +++ b/native_client_sdk/src/examples/hello_world_newlib/hello_world_c.c diff --git a/native_client_sdk/src/examples/hello_world_c/hello_world_c.html b/native_client_sdk/src/examples/hello_world_newlib/hello_world_c.html index ff43841..ff43841 100644 --- a/native_client_sdk/src/examples/hello_world_c/hello_world_c.html +++ b/native_client_sdk/src/examples/hello_world_newlib/hello_world_c.html diff --git a/native_client_sdk/src/examples/hello_world_c/hello_world_c.nmf b/native_client_sdk/src/examples/hello_world_newlib/hello_world_c.nmf index 377d01e..377d01e 100644 --- a/native_client_sdk/src/examples/hello_world_c/hello_world_c.nmf +++ b/native_client_sdk/src/examples/hello_world_newlib/hello_world_c.nmf diff --git a/native_client_sdk/src/examples/index_staging.html b/native_client_sdk/src/examples/index_staging.html index e7b95c7..a3d2a88 100644 --- a/native_client_sdk/src/examples/index_staging.html +++ b/native_client_sdk/src/examples/index_staging.html @@ -16,7 +16,7 @@ dt { } dd { margin-bottom: 12pt; - width: 600px; + width: 800px; } </style> <link href="http://code.google.com/css/codesite.css" rel="stylesheet" @@ -24,25 +24,71 @@ dd { <title>Native Client Examples</title> </head> <body> -<h2>Native Client Examples</h2> -<p>This page lists all of the examples available in the most recent Native Client SDK bundle. Each example is designed to teach a few specific Native Client programming concepts.</p> +<h1>Native Client Examples</h1> +<dd><p>This page lists all of the examples available in the most recent Native + Client SDK bundle. Each example is designed to teach a few specific Native + Client programming concepts. You will need to setup the build environment + including a path to 'make' which can be found in the 'tools' directory for + Windows, and the variable NACL_SDK_ROOT which points to one of the pepper + bundles found under the SDK install location. Calling make from the examples + directory will build all the projects, while calling make from and individual + example directory will build only that example. + </p> +</dd> +<h3>Using the Tools</h3> +<dd><p>The following "hello_world" examples, show the basic outline of a Native +Client application. The make files in each of the examples bellow show a +simple way to build a NaCl application using +<a href="http://www.gnu.org/software/make/manual/make.html">GNU Make</a>. +See the link for further information. +</p></dd> <dl> - <dt><a href="hello_world_c/hello_world_c.html">Hello World in C</a></dt> - <dd>The Hello World In C example demonstrates the basic structure of all Native Client applications. This example loads a Native Client module and responds to button click events by showing alert panels. - - <p>Teaching focus: Basic HTML, JavaScript, and module architecture; Messaging API.</p> + <dt><a href="hello_world_newlib/hello_world.html"> + Hello World (NEWLIB)</a></dt> + <dd>The Hello World In C example demonstrates the basic structure of all + Native Client applications. This example loads a Native Client module. The + page tracks the status of the module as it load. On a successful load, the + module will post a message containing the string "Hello World" back to + JavaScript which will display it as an alert. + <p>Teaching focus: Basic HTML, JavaScript, and module architecture.</p> + </dd> + <dt><a href="hello_world_glibc/hello_world.html"> + Hello World (GLIBC)</a></dt> + <dd>The Hello World (GLIBC) example is identical to the one above, with the + exception that it used the GLIBC toolchain which uses Shared Objects. The use + of Shared Objects means a more complicated manifest file (NMF) which is needed + to allow the application to find the libraries. The NMF is automatically + generated as part of the build process, by scanning the application for + dependencies. + <p>Teaching focus: Basic HTML, JavaScript, Shared Objects, and module + architecture.</p> + </dd> + <dt><a href="hello_world_interactive/hello_world.html"> + Interactive Hello World in C++</a></dt> + <dd>The Interactive Hello World C++ example demonstrates the basic structure + of all Native Client applications. This example loads a Native Client module + which uses two way interaction with JavaScript whenever a button is clicked. + The NaCl module will respond with the number 42 or the reversed version of the + string in the text box when the appropriate button is clicked. + <p>Teaching focus: Basic HTML, JavaScript, C++ PPAPI, and module + architecture; Messaging API.</p> </dd> - <dt><a href="hello_world/hello_world.html">Hello World in C++</a></dt> - <dd>The Hello World C++ example demonstrates the basic structure of all Native Client applications. This example loads a Native Client module and responds to button click events by showing alert panels. - <p>Teaching focus: Basic HTML, JavaScript, and module architecture; Messaging API.</p> +<h3>Common APIs</h3> +<dd><p>The following set of examples illustrate various Pepper APIs including +audio, 2D, 3D, input and urls.</p></dd> +<dt><a href="sine_synth/sine_synth.html">Sine Wave Synthesizer</a></dt> + <dd> The Sine Wave Synthesizer example demonstrates playing sound (a sine + wave). Enter the desired frequency and hit play to start, stop to end. The + frequency box will display "Loading, please wait." while the module loads. + <p>Teaching focus: Audio.</p> </dd> -<dt><a href="load_progress/load_progress.html">Load Progress</a></dt> - <dd> The Load Progress example demonstrates how to listen for and handle events that occur while a - NaCl module loads. This example listens for different load event types and dispatches different events to their respective handler. This example also checks for valid browser - version and shows how to calculate and display loading progress. +<dt><a href="input_events/input_events.html">Input Events</a></dt> + <dd> The Input Events example demonstrates how to handle events triggered by the user. This example allows a user + to interact with a square representing a module instance. Events are displayed on the screen as the user clicks, scrolls, types, inside or outside + of the square. - <p>Teaching focus: Progress event handling.</p> + <p>Teaching focus: Keyboard and mouse input, view change, and focus events.</p> </dd> <dt><a href="pi_generator/pi_generator.html">Pi Generator</a></dt> <dd> The Pi Generator example demonstrates creating a helper thread that estimate pi using the Monte Carlo @@ -51,17 +97,39 @@ dd { <p>Teaching focus: Thread creation, 2D graphics, view change events.</p> </dd> -<dt><a href="input_events/input_events.html">Input Events</a></dt> - <dd> The Input Events example demonstrates how to handle events triggered by the user. This example allows a user - to interact with a square representing a module instance. Events are displayed on the screen as the user clicks, scrolls, types, inside or outside - of the square. + <dt><a href="tumbler/tumbler.html">Tumbler</a></dt> + <dd> The Tumbler example demonstrates how to create a 3D cube that you can rotate with your mouse while pressing the + left mouse button. This example creates a 3D context and draws to it using + OpenGL ES. The JavaScript implements a virtual trackball interface to + map mouse movements into 3D rotations using simple 3D vector math and + quaternions. - <p>Teaching focus: Keyboard and mouse input, view change, and focus events.</p> + <p>Teaching focus: 3D graphics</p> </dd> -<dt><a href="sine_synth/sine_synth.html">Sine Wave Synthesizer</a></dt> - <dd> The Sine Wave Synthesizer example demonstrates playing sound (a sine wave). + <dt><a href="geturl/geturl.html">Get URL</a></dt> + <dd> The Get URL example demonstrates fetching an URL and then displaying its contents. + + <p>Teaching focus: URL loading.</p> + </dd> + +<h3>Common Concepts</h3> +<dd><p>The following set of examples illustrate various common concepts such as +showing load progress, using Shared Objects (dynamic libraries), +mulithreading...</p></dd> +<dt><a href="dlopen/dlopen.html">Shared Object Loading (GLIBC)</a></dt> + <dd> The Load Progress example demonstrates how to listen for and handle + events that occur while a NaCl module loads. This example listens for + different load event types and dispatches different events to their + respective handler. This example also checks for valid browser version and + shows how to calculate and display loading progress. + <p>Teaching focus: Using shared objects.</p> + </dd> +<dt><a href="load_progress/load_progress.html">Load Progress</a></dt> + <dd> The Load Progress example demonstrates how to listen for and handle events that occur while a + NaCl module loads. This example listens for different load event types and dispatches different events to their respective handler. This example also checks for valid browser + version and shows how to calculate and display loading progress. - <p>Teaching focus: Audio.</p> + <p>Teaching focus: Progress event handling.</p> </dd> <dt><a href="pong/pong.html">Pong</a></dt> <dd> The Pong example demonstrates how to create a basic 2D video game and how to store application @@ -70,11 +138,6 @@ dd { <p>Teaching focus: File I/O, 2D graphics, input events.</p> </dd> - <dt><a href="geturl/geturl.html">Get URL</a></dt> - <dd> The Get URL example demonstrates fetching an URL and then displaying its contents. - - <p>Teaching focus: URL loading.</p> - </dd> <dt><a href="multithreaded_input_events/mt_input_events.html">Multi-threaded Input Events</a></dt> <dd>The Multithreaded Input Events example combines HTML, Javascript, and C++ (the C++ is compiled to create a .nexe file). @@ -83,22 +146,13 @@ dd { a queue. The worker thread pulls them off of the queue, converts them to a string, and then uses CallOnMainThread so that PostMessage can be send the result of the worker thread to the browser. - </dd> - <dt><a href="tumbler/tumbler.html">Tumbler</a></dt> - <dd> The Tumbler example demonstrates how to create a 3D cube that you can rotate with your mouse while pressing the - left mouse button. This example creates a 3D context and draws to it using - OpenGL ES. The JavaScript implements a virtual trackball interface to - map mouse movements into 3D rotations using simple 3D vector math and - quaternions. - - <p>Teaching focus: 3D graphics</p> + <p>Teaching focus: Multithreaded event handling.</p> </dd> <dt><a href="fullscreen_tumbler/fullscreen_tumbler.html">Full-screen Tumbler</a></dt> - <dd> This is a modified version of the Tumbler example above that supports - full-screen display. It is in every way identical to Tumbler in - functionality, except that it adds the ability to switch to/from - full-screen display by pressing the Enter key. - + <dd>This is a modified version of the Tumbler example above that supports + full-screen display. It is in every way identical to Tumbler in + functionality, except that it adds the ability to switch to/from + full-screen display by pressing the Enter key. <p>Teaching focus: Full-screen</p> </dd> <dt><a href="mouselock/mouselock.html">Mouse Locker</a></dt> |