mirror of
https://github.com/nasa/trick.git
synced 2024-12-18 20:57:55 +00:00
Merge branch 'master' into VERBOSE-synonym
This commit is contained in:
commit
49e243b54a
@ -18,7 +18,11 @@ my @ext_lib_paths ;
|
||||
my @files_to_process ;
|
||||
my @ext_lib_files ;
|
||||
my %md5s ;
|
||||
|
||||
my $verbose_build = (exists($ENV{'TRICK_VERBOSE_BUILD'}) or exists($ENV{'VERBOSE'})) ;
|
||||
my %trick_headers ;
|
||||
my %python_modules ;
|
||||
my %python_module_dirs ;
|
||||
|
||||
sub get_paths {
|
||||
my @paths = split /:/ , $ENV{$_[0]} ;
|
||||
@ -140,9 +144,21 @@ sub write_makefile_swig_deps() {
|
||||
close DEPENDENCIES_FILE ;
|
||||
}
|
||||
|
||||
sub get_trick_headers() {
|
||||
foreach my $f ( @files_to_process, @ext_lib_files) {
|
||||
my %trick_header = extract_trick_header( $f, do { local( @ARGV, $/ ) = $f ; <> }, 0, 0 ) ;
|
||||
if ( exists $trick_header{python_module} ) {
|
||||
$trick_headers{$f}{python_module} = $trick_header{python_module};
|
||||
($trick_headers{$f}{python_module_dir} = $trick_header{python_module}) =~ s/\./\//g;
|
||||
$python_modules{$trick_headers{$f}{python_module}} = 1;
|
||||
$python_module_dirs{$trick_headers{$f}{python_module_dir}} = 1;
|
||||
}
|
||||
$trick_headers{$f}{swig} = $trick_header{swig} if ( exists $trick_header{swig} );
|
||||
}
|
||||
}
|
||||
|
||||
sub has_swig_no($) {
|
||||
my %trick_header = extract_trick_header( $_[0], do { local( @ARGV, $/ ) = $_[0] ; <> }, 0, 0 ) ;
|
||||
my $result = $trick_header{swig} =~ /^NO$/i ;
|
||||
my $result = $trick_headers{$_[0]}{swig} =~ /^NO$/i ;
|
||||
print "[95mSWIG Skip[39m SWIG: (NO): $_[0]\n" if $verbose_build and $result ;
|
||||
return $result ;
|
||||
}
|
||||
@ -208,11 +224,26 @@ all: \$(TRICK_FIXED_PYTHON)
|
||||
SWIG_I =" ;
|
||||
|
||||
foreach my $file ( @files_to_process ) {
|
||||
if ( !exists $trick_headers{$file}{python_module_dir} ) {
|
||||
(my $swig_file = $file) =~ s/\.[^.]*$/_py.i/ ;
|
||||
print MAKEFILE " \\\n build$swig_file" ;
|
||||
$swig_file =~ s/i$/o/ ;
|
||||
print PY_LINK_LIST "build$swig_file\n" ;
|
||||
}
|
||||
}
|
||||
|
||||
print MAKEFILE "
|
||||
|
||||
SWIG_I_CUSTOM_OUTDIR =" ;
|
||||
|
||||
foreach my $file ( @files_to_process ) {
|
||||
if ( exists $trick_headers{$file}{python_module_dir} ) {
|
||||
(my $swig_file = $file) =~ s/\.[^.]*$/_py.i/ ;
|
||||
print MAKEFILE " \\\n build$swig_file" ;
|
||||
$swig_file =~ s/i$/o/ ;
|
||||
print PY_LINK_LIST "build$swig_file\n" ;
|
||||
}
|
||||
}
|
||||
|
||||
print MAKEFILE "
|
||||
|
||||
@ -238,9 +269,24 @@ SWIG_SRC = \$(subst .i,.cpp,\$(SWIG_I)) $swig_src_dir/top.cpp
|
||||
\t\@echo \$(SWIG) \$(TRICK_INCLUDE) \$(TRICK_DEFINES) \$(TRICK_VERSIONS) \$(TRICK_SWIG_FLAGS) -c++ -python -includeall -ignoremissing -w201,303,325,362,389,401,451 -outdir trick -o \$@ \$< >> \$(MAKE_OUT)
|
||||
\t\$(ECHO_CMD)\$(SWIG) \$(TRICK_INCLUDE) \$(TRICK_DEFINES) \$(TRICK_VERSIONS) \$(TRICK_SWIG_FLAGS) -c++ -python -includeall -ignoremissing -w201,303,325,362,389,401,451 -outdir trick -o \$@ \$< 2>&1 | \$(TEE) -a \$(MAKE_OUT) ; exit \$\${PIPESTATUS[0]}
|
||||
|
||||
SWIG_SRC_CUSTOM_OUTDIR = \$(subst .i,.cpp,\$(SWIG_I_CUSTOM_OUTDIR))\n" ;
|
||||
|
||||
foreach my $file ( @files_to_process ) {
|
||||
if ( exists $trick_headers{$file}{python_module_dir} ) {
|
||||
(my $swig_file = $file) =~ s/\.[^.]*$/_py.i/ ;
|
||||
(my $cpp_file = $file) =~ s/\.[^.]*$/_py.cpp/ ;
|
||||
print MAKEFILE "
|
||||
build$cpp_file : build$swig_file | trick/$trick_headers{$file}{python_module_dir}
|
||||
\t\$(PRINT_SWIG)
|
||||
\t\@echo \$(SWIG) \$(TRICK_INCLUDE) \$(TRICK_DEFINES) \$(TRICK_VERSIONS) \$(TRICK_SWIG_FLAGS) -c++ -python -includeall -ignoremissing -w201,303,325,362,389,401,451 -outdir trick/$trick_headers{$file}{python_module_dir} -o \$@ \$< >> \$(MAKE_OUT)
|
||||
\t\$(ECHO_CMD)\$(SWIG) \$(TRICK_INCLUDE) \$(TRICK_DEFINES) \$(TRICK_VERSIONS) \$(TRICK_SWIG_FLAGS) -c++ -python -includeall -ignoremissing -w201,303,325,362,389,401,451 -outdir trick/$trick_headers{$file}{python_module_dir} -o \$@ \$< 2>&1 | \$(TEE) -a \$(MAKE_OUT) ; exit \$\${PIPESTATUS[0]}\n";
|
||||
}
|
||||
}
|
||||
|
||||
print MAKEFILE "
|
||||
# SWIG_OBJECTS =================================================================
|
||||
|
||||
SWIG_OBJECTS = \$(subst .cpp,.o,\$(SWIG_SRC)) $swig_src_dir/init_swig_modules.o
|
||||
SWIG_OBJECTS = \$(subst .cpp,.o,\$(SWIG_SRC)) \$(subst .cpp,.o,\$(SWIG_SRC_CUSTOM_OUTDIR)) $swig_src_dir/init_swig_modules.o
|
||||
|
||||
\$(SWIG_OBJECTS): %.o: %.cpp
|
||||
\t\$(PRINT_COMPILE_SWIG)
|
||||
@ -327,6 +373,9 @@ LINK_LISTS += \$(LD_FILELIST)build/py_link_list
|
||||
print INITFILE "import sys\n" ;
|
||||
print INITFILE "import os\n" ;
|
||||
print INITFILE "sys.path.append(os.getcwd() + \"/trick\")\n" ;
|
||||
foreach my $dir ( keys %python_module_dirs ) {
|
||||
print INITFILE "sys.path.append(os.getcwd() + \"/trick/$dir\")\n" ;
|
||||
}
|
||||
|
||||
print INITFILE "\n" ;
|
||||
print INITFILE "import _sim_services\n" ;
|
||||
@ -339,12 +388,16 @@ LINK_LISTS += \$(LD_FILELIST)build/py_link_list
|
||||
|
||||
foreach $f ( @files_to_process, @ext_lib_files ) {
|
||||
print INITFILE "# $f\n" ;
|
||||
print INITFILE "import _m$md5s{$f}\n" ;
|
||||
print INITFILE "from m$md5s{$f} import *\n" ;
|
||||
print INITFILE "combine_cvars(all_cvars, cvar)\n" ;
|
||||
print INITFILE "cvar = None\n\n" ;
|
||||
}
|
||||
|
||||
foreach my $mod ( keys %python_modules ) {
|
||||
print INITFILE "import trick.$mod\n" ;
|
||||
}
|
||||
|
||||
print INITFILE "\n" ;
|
||||
print INITFILE "# S_source.hh\n" ;
|
||||
print INITFILE "import _m${s_source_md5}\n" ;
|
||||
print INITFILE "from m${s_source_md5} import *\n\n" ;
|
||||
@ -361,6 +414,17 @@ LINK_LISTS += \$(LD_FILELIST)build/py_link_list
|
||||
print INITFILE "cvar = all_cvars\n\n" ;
|
||||
close INITFILE ;
|
||||
|
||||
foreach my $dir ( keys %python_module_dirs ) {
|
||||
system("mkdir -p trick/$dir");
|
||||
open MODULE_INITFILE, ">trick/$dir/__init__.py";
|
||||
foreach my $file ( @files_to_process ) {
|
||||
if ( exists $trick_headers{$file}{python_module_dir} and $trick_headers{$file}{python_module_dir} eq $dir ) {
|
||||
print MODULE_INITFILE "from m$md5s{$file} import *\n" ;
|
||||
}
|
||||
}
|
||||
close MODULE_INITFILE;
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
@ -370,6 +434,7 @@ LINK_LISTS += \$(LD_FILELIST)build/py_link_list
|
||||
read_files_to_process() ;
|
||||
write_makefile_swig_deps() ;
|
||||
|
||||
get_trick_headers() ;
|
||||
# Remove SWIG: (NO) files, but not before they're written to the dependency file.
|
||||
# If SWIG: (NO) is removed, Makefile_swig needs to be regenerated.
|
||||
purge_swig_no_files() ;
|
||||
|
@ -31,7 +31,7 @@ sub extract_trick_header($$$$) {
|
||||
$header{icg_ignore} = $2 if $trick_header =~ /ICG[ _]IGNORE[ _]TYPE(S)?:[^(]*(.*?)\)([A-Z _\t\n\r]+:|[ \t\n\r]*$)/si ;
|
||||
$header{swig} = $1 if $trick_header =~ /SWIG:[^(]*\((.*?)\)([A-Z _\t\n\r]+:|[ \t\n\r]*$)/si ;
|
||||
$header{default_data} = $1 if $trick_header =~ /DEFAULT[ _]DATA:[^(]*(.*?)\)([A-Z _\t\n\r]+:|[ \t\n\r]*$)/si ;
|
||||
$header{python_module} = $1 if $trick_header =~ /PYTHON[ _]MODULE:[^(]*(.*?)\)([A-Z _\t\n\r]+:|[ \t\n\r]*$)/si ;
|
||||
$header{python_module} = $1 if $trick_header =~ /PYTHON[ _]MODULE:[^(]*\((.*?)\)([A-Z _\t\n\r]+:|[ \t\n\r]*$)/si ;
|
||||
$header{programmers} = $1 if $trick_header =~ /PROGRAMMERS:[^(]*(.*?)\)([A-Z _\t\n\r]+:|[ \t\n\r]*$)/si ;
|
||||
$header{language} = $1 if $trick_header =~ /LANGUAGE:[^(]*(.*?)\)([A-Z _\t\n\r]+:|[ \t\n\r]*$)/si ;
|
||||
|
||||
@ -55,6 +55,9 @@ sub extract_trick_header($$$$) {
|
||||
# save doxygen style trick_lib_dependency fields in field = liblist.
|
||||
$header{liblist} = [@lib_list] ;
|
||||
}
|
||||
if ( $contents =~ /(?:@|\\)python_module\s*{\s*(.*?)\s*}/) {
|
||||
$header{python_module} = $1;
|
||||
}
|
||||
|
||||
$header{language} = "CPP" if ( $header{language} =~ /c[p\+]+/i ) ;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
# This file can be used to create an object file containing the io_* and py_*
|
||||
# code that Trick would normally generate during the simulation build process.
|
||||
# Sims can then link against this object file, reducing compilation time.
|
||||
# This file can be used to create an object file or library containing the io_*
|
||||
# and py_* code that Trick would normally generate during the simulation build
|
||||
# process. Sims can then link against that, reducing compilation time.
|
||||
#
|
||||
# To use it, create a directory that includes a file named S_source.hh that
|
||||
# includes all header files for which you want io_* and py_* code generated.
|
||||
@ -25,9 +25,26 @@
|
||||
# paths to the header files included by your S_source.hh. For instance:
|
||||
# -I$(HOME)/myproject/foo/include -I$(HOME)/myproject/bar/include
|
||||
#
|
||||
# TRICKIFY_BUILD_TYPE (optional)
|
||||
# Valid options are:
|
||||
# 1. STATIC (.a)
|
||||
# Create a static library. This will require the use of --whole-archive (on
|
||||
# Linux) or -all_load/-force_load (on Mac) when linking the sim executeable.
|
||||
# Trick uses dlsym to dynamically load symbols at run time, but the linker,
|
||||
# by default, will not include symbols from static libraries that are not
|
||||
# known to be needed at compile time.
|
||||
# 2. SHARED (.so)
|
||||
# Create a shared object (dynamically linked library). This may require the
|
||||
# use of -rpath to ensure the linker can find the shared object at runtime
|
||||
# unless you explicitly link against it (as opposed to using -L and -l)
|
||||
# during compilation.
|
||||
# 3. PLO (.o) [default]
|
||||
# Create a partially-linked object. No special linker options are required.
|
||||
#
|
||||
# TRICKIFY_OBJECT_NAME (optional)
|
||||
# The name of the generated object file. The default value is trickified.o.
|
||||
# You should choose something more meaningful, like trickified_myproject.o.
|
||||
# The name of the generated object file or library. The default value is
|
||||
# trickified.o. You should choose something more meaningful, especially if
|
||||
# you're using another build type.
|
||||
#
|
||||
# TRICKIFY_PTYON_DIR (optional)
|
||||
# The directory into which generated Python modules are placed. The default
|
||||
@ -74,9 +91,11 @@ ifndef TRICKIFY_CXX_FLAGS
|
||||
$(error TRICKIFY_CXX_FLAGS must be set)
|
||||
endif
|
||||
|
||||
TRICKIFY_BUILD_TYPE ?= PLO
|
||||
TRICKIFY_OBJECT_NAME ?= trickified.o
|
||||
TRICKIFY_PYTHON_DIR ?= python
|
||||
TRICK_HOME := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/../../..)
|
||||
MAKE_OUT ?= build/MAKE_out
|
||||
|
||||
ifneq ($(wildcard build),)
|
||||
SWIG_OBJECTS := $(shell cat build/S_library_swig)
|
||||
@ -92,30 +111,26 @@ TRICK_CXXFLAGS += $(TRICKIFY_CXX_FLAGS)
|
||||
# Ensure we can process all headers
|
||||
TRICK_EXT_LIB_DIRS :=
|
||||
|
||||
# When given a library, the linker will only link in objects that are known to
|
||||
# be needed at link time. However, Trick uses dlsym to dynamically load the
|
||||
# objects we'll be creating here. It cannot be known which objects will be
|
||||
# needed at link time, so the sim has to link them all. In that case, we might
|
||||
# as well create an object (which will be fully linked in by the sim) instead
|
||||
# of a library (which would require the use of the -whole-archive option).
|
||||
#
|
||||
# One disadvantage of this approach is that we have to link all of the objects
|
||||
# in this rule no matter how many have changed, whereas ar would allow us to
|
||||
# replace only the changed objects. However, Trickified projects are
|
||||
# necessarily used as third-party libraries, and so would be expected to
|
||||
# change infrequently. Moreover, the methods for force-linking a library differ
|
||||
# between Linux and Mac, so obviating the need for it simplifies a Trickified
|
||||
# project's user-facing makefile.
|
||||
$(TRICKIFY_OBJECT_NAME): $(SWIG_OBJECTS) $(IO_OBJECTS) | $(dir $(TRICKIFY_OBJECT_NAME))
|
||||
$(info $(call COLOR,Linking) $@)
|
||||
@ld -r -o $@ $^
|
||||
ifeq ($(TRICKIFY_BUILD_TYPE),PLO)
|
||||
@echo $(LD) $(LD_PARTIAL) -o $@ $^ >> $(MAKE_OUT)
|
||||
$(ECHO_CMD)ld -r -o $@ $^ 2>&1 | $(TEE) -a $(MAKE_OUT); exit $${PIPESTATUS[0]}
|
||||
else ifeq ($(TRICKIFY_BUILD_TYPE),SHARED)
|
||||
@echo $(TRICK_CPPC) -shared -o $@ $^ >> $(MAKE_OUT)
|
||||
$(ECHO_CMD)c++ -shared -o $@ $^ 2>&1 | $(TEE) -a $(MAKE_OUT); exit $${PIPESTATUS[0]}
|
||||
else ifeq ($(TRICKIFY_BUILD_TYPE),STATIC)
|
||||
@echo ar rcs $@ $^ >> $(MAKE_OUT)
|
||||
$(ECHO_CMD)ar rcs $@ $^ 2>&1 | $(TEE) -a $(MAKE_OUT); exit $${PIPESTATUS[0]}
|
||||
endif
|
||||
|
||||
$(dir $(TRICKIFY_OBJECT_NAME)) $(TRICKIFY_PYTHON_DIR) build:
|
||||
@mkdir -p $@
|
||||
|
||||
$(IO_OBJECTS): %.o: %.cpp
|
||||
$(info $(call COLOR,Compiling) $<)
|
||||
@$(TRICK_CPPC) $(TRICK_CXXFLAGS) $(TRICK_SYSTEM_CXXFLAGS) -std=c++11 -Wno-invalid-offsetof -MMD -MP -c -o $@ $<
|
||||
@echo $(TRICK_CPPC) $(TRICK_CXXFLAGS) $(TRICK_SYSTEM_CXXFLAGS) -std=c++11 -Wno-invalid-offsetof -MMD -MP -c -o $@ $< >> $(MAKE_OUT)
|
||||
$(ECHO_CMD)$(TRICK_CPPC) $(TRICK_CXXFLAGS) $(TRICK_SYSTEM_CXXFLAGS) -std=c++11 -Wno-invalid-offsetof -MMD -MP -c -o $@ $< 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
|
||||
|
||||
$(IO_OBJECTS:.o=.d): %.d: ;
|
||||
|
||||
@ -123,16 +138,19 @@ $(IO_OBJECTS:.o=.d): %.d: ;
|
||||
|
||||
$(SWIG_OBJECTS): %.o: %.cpp
|
||||
$(info $(call COLOR,Compiling) $<)
|
||||
@$(TRICK_CPPC) $(TRICK_CXXFLAGS) $(TRICK_SYSTEM_CXXFLAGS) $(PYTHON_INCLUDES) -Wno-unused-parameter -Wno-shadow -c -o $@ $<
|
||||
@echo $(TRICK_CPPC) $(TRICK_CXXFLAGS) $(TRICK_SYSTEM_CXXFLAGS) $(PYTHON_INCLUDES) -Wno-unused-parameter -Wno-shadow -c -o $@ $< >> $(MAKE_OUT)
|
||||
$(ECHO_CMD)$(TRICK_CPPC) $(TRICK_CXXFLAGS) $(TRICK_SYSTEM_CXXFLAGS) $(PYTHON_INCLUDES) -Wno-unused-parameter -Wno-shadow -c -o $@ $< 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
|
||||
|
||||
$(SWIG_OBJECTS:.o=.cpp): %.cpp: %.i | $(TRICKIFY_PYTHON_DIR) $(SWIG_OBJECTS:.o=.i)
|
||||
$(info $(call COLOR,SWIGing) $<)
|
||||
@$(SWIG) $(TRICK_INCLUDE) $(TRICK_DEFINES) $(TRICK_VERSIONS) $(TRICK_SWIG_FLAGS) -c++ -python -includeall -ignoremissing -w201,303,325,362,389,401,451 -outdir $(TRICKIFY_PYTHON_DIR) -o $@ $<
|
||||
@echo $(SWIG) $(TRICK_INCLUDE) $(TRICK_DEFINES) $(TRICK_VERSIONS) $(TRICK_SWIG_FLAGS) -c++ -python -includeall -ignoremissing -w201,303,325,362,389,401,451 -outdir $(TRICKIFY_PYTHON_DIR) -o $@ $< >> $(MAKE_OUT)
|
||||
$(ECHO_CMD)$(SWIG) $(TRICK_INCLUDE) $(TRICK_DEFINES) $(TRICK_VERSIONS) $(TRICK_SWIG_FLAGS) -c++ -python -includeall -ignoremissing -w201,303,325,362,389,401,451 -outdir $(TRICKIFY_PYTHON_DIR) -o $@ $< 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
|
||||
|
||||
define create_convert_swig_rule
|
||||
build/%_py.i: /%.$1
|
||||
$$(info $$(call COLOR,Converting) $$<)
|
||||
${TRICK_HOME}/$(LIBEXEC)/trick/convert_swig ${TRICK_CONVERT_SWIG_FLAGS} $$<
|
||||
@echo ${TRICK_HOME}/$(LIBEXEC)/trick/convert_swig ${TRICK_CONVERT_SWIG_FLAGS} $$< >> $(MAKE_OUT)
|
||||
$(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/convert_swig ${TRICK_CONVERT_SWIG_FLAGS} $$< 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $$${PIPESTATUS[0]}
|
||||
endef
|
||||
|
||||
EXTENSIONS := H h hh hxx h++ hpp
|
||||
@ -170,8 +188,9 @@ $(foreach EXTENSION,$(EXTENSIONS),$(eval $(call create_convert_swig_rule,$(EXTEN
|
||||
# http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/
|
||||
|
||||
build/S_source.d: | $(dir $@)
|
||||
@$(TRICK_HOME)/bin/trick-ICG $(TRICK_CXXFLAGS) $(TRICK_SYSTEM_CXXFLAGS) $(TRICK_ICGFLAGS) S_source.hh
|
||||
@$(TRICK_HOME)/$(LIBEXEC)/trick/make_makefile_swig
|
||||
@$(TRICK_CC) -MM -MP -MT $@ -MF $@ $(TRICKIFY_CXX_FLAGS) S_source.hh
|
||||
$(ECHO_CMD)$(TRICK_HOME)/bin/trick-ICG $(TRICK_CXXFLAGS) $(TRICK_SYSTEM_CXXFLAGS) $(TRICK_ICGFLAGS) S_source.hh
|
||||
$(ECHO_CMD)$(TRICK_HOME)/$(LIBEXEC)/trick/make_makefile_swig 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
|
||||
@echo $(TRICK_CC) -MM -MP -MT $@ -MF $@ $(TRICKIFY_CXX_FLAGS) S_source.hh >> $(MAKE_OUT)
|
||||
$(ECHO_CMD) $(TRICK_CC) -MM -MP -MT $@ -MF $@ $(TRICKIFY_CXX_FLAGS) S_source.hh 2>&1 | $(TEE) -a $(MAKE_OUT) ; exit $${PIPESTATUS[0]}
|
||||
|
||||
-include build/S_source.d
|
||||
|
@ -18,6 +18,10 @@ if hasattr(top.cvar, 'trick_sys'):
|
||||
# from monte carlo
|
||||
mc_add_range = top.cvar.trick_sys.sched.add_range
|
||||
|
||||
# from Monte Carlo
|
||||
if hasattr(top.cvar, 'trick_mc'):
|
||||
mc_add_variable = top.cvar.trick_mc.mc.add_variable
|
||||
|
||||
# from the memory manager wrapper
|
||||
if hasattr(top.cvar, 'trick_mm'):
|
||||
read_checkpoint_from_string = top.cvar.trick_mm.mm.read_checkpoint_from_string
|
||||
|
49
test/SIM_python_namespace/RUN_test/unit_test.py
Normal file
49
test/SIM_python_namespace/RUN_test/unit_test.py
Normal file
@ -0,0 +1,49 @@
|
||||
|
||||
from trick.unit_test import *
|
||||
|
||||
def main():
|
||||
trick.stop(1.0)
|
||||
trick_utest.unit_tests.enable()
|
||||
trick_utest.unit_tests.set_file_name( os.getenv("TRICK_HOME") + "/trick_test/SIM_python_namespace.xml" )
|
||||
trick_utest.unit_tests.set_test_name( "PythonNamespace" )
|
||||
test_suite = "python_namespace"
|
||||
|
||||
# normal class methods from S_define
|
||||
ball.foo_food.print_me()
|
||||
ball.foo_inner_food.print_me()
|
||||
ball.bar_food.print_me()
|
||||
ball.foo_yummyfood.print_me()
|
||||
print
|
||||
|
||||
# new class from Foo.Food
|
||||
food = trick.Foo.Food()
|
||||
food.print_me()
|
||||
TRICK_EXPECT_EQ( food.fast , 0, test_suite , "first level python namespace" )
|
||||
food.fast = trick.Foo.Burger
|
||||
TRICK_EXPECT_EQ( food.fast , 2, test_suite , "first level python namespace" )
|
||||
|
||||
# new class from Foo.Food.Inner
|
||||
foodinner = trick.Foo.Inner.Food()
|
||||
foodinner.print_me()
|
||||
TRICK_EXPECT_EQ( foodinner.fast , 1, test_suite , "second level python namespace" )
|
||||
foodinner.fast = trick.Foo.Inner.Burger
|
||||
TRICK_EXPECT_EQ( foodinner.fast , 0, test_suite , "second level python namespace" )
|
||||
|
||||
# new class from Foo.Food.Inner
|
||||
bar = trick.Bar.Food()
|
||||
bar.print_me()
|
||||
TRICK_EXPECT_EQ( bar.fast , 2, test_suite , "another first level python namespace" )
|
||||
bar.fast = trick.Bar.Burger
|
||||
TRICK_EXPECT_EQ( bar.fast , 1, test_suite , "another first level python namespace" )
|
||||
|
||||
# new class from Foo.Food.Inner
|
||||
yummy = trick.Foo.YummyFood()
|
||||
yummy.print_me()
|
||||
TRICK_EXPECT_EQ( yummy.yummy , 1, test_suite , "additional file in same namespace" )
|
||||
yummy.yummy = trick.Foo.Doughnuts
|
||||
TRICK_EXPECT_EQ( yummy.yummy , 2, test_suite , "additional file in same namespace" )
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
28
test/SIM_python_namespace/S_define
Normal file
28
test/SIM_python_namespace/S_define
Normal file
@ -0,0 +1,28 @@
|
||||
/************************TRICK HEADER*************************
|
||||
PURPOSE:
|
||||
(blah blah blah)
|
||||
*************************************************************/
|
||||
|
||||
#include "sim_objects/default_trick_sys.sm"
|
||||
|
||||
##include "FooFood.hh"
|
||||
##include "FooInnerFood.hh"
|
||||
##include "BarFood.hh"
|
||||
##include "FooYummyFood.hh"
|
||||
|
||||
class SimObj : public Trick::SimObject {
|
||||
|
||||
public:
|
||||
Foo::Food foo_food ;
|
||||
Foo::Inner::Food foo_inner_food ;
|
||||
Bar::Food bar_food ;
|
||||
Foo::YummyFood foo_yummyfood ;
|
||||
|
||||
/** Constructor to add the jobs */
|
||||
SimObj() {
|
||||
}
|
||||
} ;
|
||||
|
||||
// Instantiations
|
||||
SimObj ball ;
|
||||
|
4
test/SIM_python_namespace/S_overrides.mk
Normal file
4
test/SIM_python_namespace/S_overrides.mk
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
TRICK_CFLAGS += -I./models
|
||||
TRICK_CXXFLAGS += -I./models
|
||||
|
33
test/SIM_python_namespace/models/BarFood.hh
Normal file
33
test/SIM_python_namespace/models/BarFood.hh
Normal file
@ -0,0 +1,33 @@
|
||||
/**
|
||||
@file
|
||||
|
||||
@verbatim
|
||||
PURPOSE: (Namespace Test)
|
||||
PYTHON_MODULE: (Bar)
|
||||
@endverbatim
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef BARFOOD_HH
|
||||
#define BARFOOD_HH
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace Bar {
|
||||
|
||||
enum Fast {
|
||||
Pizza,
|
||||
Burger,
|
||||
Taco
|
||||
};
|
||||
|
||||
class Food {
|
||||
public:
|
||||
Food() : fast(Taco) {}
|
||||
void print_me() { std::cout << "Bar::Food::print_me!" << std::endl; }
|
||||
Fast fast;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* _BALL_HH_ */
|
||||
|
33
test/SIM_python_namespace/models/FooFood.hh
Normal file
33
test/SIM_python_namespace/models/FooFood.hh
Normal file
@ -0,0 +1,33 @@
|
||||
/**
|
||||
@file
|
||||
|
||||
@verbatim
|
||||
PURPOSE: (Namespace Test)
|
||||
PYTHON_MODULE: (Foo)
|
||||
@endverbatim
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef FOOFOOD_HH
|
||||
#define FOOFOOD_HH
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace Foo {
|
||||
|
||||
enum Fast {
|
||||
Taco,
|
||||
Pizza,
|
||||
Burger
|
||||
};
|
||||
|
||||
class Food {
|
||||
public:
|
||||
Food() : fast(Taco) {}
|
||||
void print_me() { std::cout << "Foo::Food::print_me!" << std::endl; }
|
||||
Fast fast;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* _BALL_HH_ */
|
||||
|
31
test/SIM_python_namespace/models/FooInnerFood.hh
Normal file
31
test/SIM_python_namespace/models/FooInnerFood.hh
Normal file
@ -0,0 +1,31 @@
|
||||
/**
|
||||
@file
|
||||
|
||||
@verbatim
|
||||
PURPOSE: (Namespace Test)
|
||||
PYTHON_MODULE: (Foo.Inner)
|
||||
@endverbatim
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef FOOINNERFOOD_HH
|
||||
#define FOOINNERFOOD_HH
|
||||
|
||||
namespace Foo {
|
||||
namespace Inner {
|
||||
enum Fast {
|
||||
Burger,
|
||||
Taco,
|
||||
Pizza
|
||||
};
|
||||
|
||||
class Food {
|
||||
public:
|
||||
Food() : fast(Taco) {}
|
||||
void print_me() { std::cout << "Foo::Inner::Food::print_me!" << std::endl; }
|
||||
Fast fast;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _BALL_HH_ */
|
||||
|
33
test/SIM_python_namespace/models/FooYummyFood.hh
Normal file
33
test/SIM_python_namespace/models/FooYummyFood.hh
Normal file
@ -0,0 +1,33 @@
|
||||
/**
|
||||
@file
|
||||
|
||||
@verbatim
|
||||
PURPOSE: (Namespace Test)
|
||||
PYTHON_MODULE: (Foo)
|
||||
@endverbatim
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef FOOYUMMYFOOD_HH
|
||||
#define FOOYUMMYFOOD_HH
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace Foo {
|
||||
|
||||
enum Yummy {
|
||||
Butter,
|
||||
Bacon,
|
||||
Doughnuts
|
||||
};
|
||||
|
||||
class YummyFood {
|
||||
public:
|
||||
YummyFood() : yummy(Bacon) {}
|
||||
void print_me() { std::cout << "Foo::YummyFood::print_me!" << std::endl; }
|
||||
Yummy yummy;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* _BALL_HH_ */
|
||||
|
@ -5,6 +5,7 @@ export TRICK_HOST_CPU := $(shell $(TRICK_HOME)/bin/trick-gte TRICK_HOST_CPU)
|
||||
COMPILE_DIRS = \
|
||||
SIM_demo_sdefine \
|
||||
SIM_events \
|
||||
SIM_python_namespace \
|
||||
SIM_rti \
|
||||
SIM_stls \
|
||||
SIM_test_dp \
|
||||
|
@ -7,4 +7,10 @@
|
||||
#define RBRACELOC getRBraceLoc
|
||||
#endif
|
||||
|
||||
#if (LIBCLANG_MAJOR >=8)
|
||||
#define GETLOCEND getEndLoc
|
||||
#else
|
||||
#define GETLOCEND getLocEnd
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -63,7 +63,7 @@ bool TranslationUnitVisitor::TraverseDecl(clang::Decl *d) {
|
||||
if (is_forward_declaration) {
|
||||
// These are forward declarations. Insert this into the set of fwd declares keyed by the current file.
|
||||
if ( ! crd->getNameAsString().empty() ) {
|
||||
fwd_declared_classes[getFileName(ci , d->getLocEnd(), hsd)].insert(crd->getNameAsString()) ;
|
||||
fwd_declared_classes[getFileName(ci , d->GETLOCEND(), hsd)].insert(crd->getNameAsString()) ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -84,7 +84,7 @@ bool TranslationUnitVisitor::TraverseDecl(clang::Decl *d) {
|
||||
typedef struct Astruct {} Bstruct ;
|
||||
*/
|
||||
std::set< std::string >::iterator it ;
|
||||
std::string file_name = getFileName(ci , d->getLocEnd(), hsd) ;
|
||||
std::string file_name = getFileName(ci , d->GETLOCEND(), hsd) ;
|
||||
std::string source_type = cvis.get_class_data()->getName() ;
|
||||
it = fwd_declared_classes[file_name].find(source_type) ;
|
||||
if ( it != fwd_declared_classes[file_name].end() ) {
|
||||
@ -126,14 +126,14 @@ bool TranslationUnitVisitor::TraverseDecl(clang::Decl *d) {
|
||||
case clang::Decl::Typedef : {
|
||||
clang::TypedefDecl * td = static_cast<clang::TypedefDecl *>(d) ;
|
||||
if ( isInUserCode(ci, td->getSourceRange().getBegin(), hsd) ) {
|
||||
TypedefVisitor tv(ci , cs, hsd, pa, fwd_declared_classes[getFileName(ci , d->getLocEnd(), hsd)]) ;
|
||||
TypedefVisitor tv(ci , cs, hsd, pa, fwd_declared_classes[getFileName(ci , d->GETLOCEND(), hsd)]) ;
|
||||
tv.TraverseDecl(d) ;
|
||||
}
|
||||
}
|
||||
break ;
|
||||
case clang::Decl::Var : {
|
||||
if ( isInUserCode(ci, d->getSourceRange().getBegin(), hsd) ) {
|
||||
VariableVisitor tv(ci , cs, hsd, pa, fwd_declared_classes[getFileName(ci , d->getLocEnd(), hsd)]) ;
|
||||
VariableVisitor tv(ci , cs, hsd, pa, fwd_declared_classes[getFileName(ci , d->GETLOCEND(), hsd)]) ;
|
||||
tv.TraverseDecl(d) ;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user