mirror of
https://github.com/nasa/trick.git
synced 2024-12-20 13:43:10 +00:00
Move search for library dependencies to make_makefile
Moved the search for all library dependencies into make_makefile. Made a couple of minor clean up edits as well. refs #92
This commit is contained in:
parent
fc9c604056
commit
a5929dbe6c
@ -13,8 +13,8 @@ use get_lib_deps ;
|
|||||||
my %processed_files ;
|
my %processed_files ;
|
||||||
my %non_lib_processed_files ;
|
my %non_lib_processed_files ;
|
||||||
|
|
||||||
sub read_lib_deps(@) {
|
sub read_lib_deps($@) {
|
||||||
my (@files_to_process) = @_ ;
|
my ($indent , @files_to_process) = @_ ;
|
||||||
foreach my $l ( @files_to_process ) {
|
foreach my $l ( @files_to_process ) {
|
||||||
next if ( $l eq "" ) ;
|
next if ( $l eq "" ) ;
|
||||||
if ( ! exists $processed_files{$l} ) {
|
if ( ! exists $processed_files{$l} ) {
|
||||||
@ -28,20 +28,21 @@ sub read_lib_deps(@) {
|
|||||||
my (@all_lines) = <FH> ;
|
my (@all_lines) = <FH> ;
|
||||||
close FH ;
|
close FH ;
|
||||||
chomp @all_lines ;
|
chomp @all_lines ;
|
||||||
read_lib_deps(@all_lines) ;
|
read_lib_deps($indent + 1 , @all_lines) ;
|
||||||
} else {
|
} else {
|
||||||
print "Getting Dependencies for $l\n" ;
|
print "Getting Dependencies for " , " " x $indent, "$l\n" ;
|
||||||
if ( -e $l ) {
|
if ( -e $l ) {
|
||||||
my $contents ;
|
my $contents ;
|
||||||
my @resolved_files ;
|
my @resolved_files ;
|
||||||
@resolved_files = write_lib_deps($l) ;
|
@resolved_files = write_lib_deps($l) ;
|
||||||
read_lib_deps(@resolved_files) ;
|
read_lib_deps($indent + 1 , @resolved_files) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Update out of date lib_dep files
|
||||||
for my $f ( @ARGV ) {
|
for my $f ( @ARGV ) {
|
||||||
# Makefile_io_src is listed as a dependency of make_makefile_src and comes in as
|
# Makefile_io_src is listed as a dependency of make_makefile_src and comes in as
|
||||||
# an argument from make. Ignore it.
|
# an argument from make. Ignore it.
|
||||||
@ -51,21 +52,19 @@ for my $f ( @ARGV ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open FILE, "build/ICG_lib_deps" or die 'cannot open build/header_lib_deps' ;
|
# Start the top level files which are all of the header files and S_define
|
||||||
my (@top_lib_dep_file_names) = <FILE> ;
|
open FILE, "build/ICG_processed" or die 'cannot open build/ICG_processed' ;
|
||||||
|
my (@top_file_names) = <FILE> ;
|
||||||
close FILE ;
|
close FILE ;
|
||||||
chomp @top_lib_dep_file_names ;
|
open FILE, "build/S_define.lib_deps" or die 'cannot open build/S_define.lib_deps' ;
|
||||||
push @top_lib_dep_file_names, "build/S_define.lib_deps" ;
|
my (@s_define_lib_deps) = <FILE> ;
|
||||||
|
close FILE ;
|
||||||
|
push @top_file_names , @s_define_lib_deps ;
|
||||||
|
chomp @top_file_names ;
|
||||||
|
|
||||||
foreach my $f ( @top_lib_dep_file_names ) {
|
# Read in all of the lib_dep files.
|
||||||
my @all_lines ;
|
# read_lib_deps wil create lib_dep files that don't exist and read them in too.
|
||||||
next if ( $f eq "" ) ;
|
read_lib_deps(0, @top_file_names) ;
|
||||||
open FH, "$f" or die "cannot open $f" ;
|
|
||||||
@all_lines = <FH> ;
|
|
||||||
close FH ;
|
|
||||||
chomp @all_lines ;
|
|
||||||
read_lib_deps(@all_lines) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#print map {"$_\n"} (sort keys %processed_files) ;
|
#print map {"$_\n"} (sort keys %processed_files) ;
|
||||||
|
|
||||||
@ -364,19 +363,17 @@ foreach ( @all_read_only_libs ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
print MAKEFILE "\n\n
|
print MAKEFILE "\n\n
|
||||||
test: TRICK_SYSTEM_CXXFLAGS += -DTRICK_UNIT_TEST
|
|
||||||
test: TRICK_SYSTEM_CFLAGS += -DTRICK_UNIT_TEST
|
|
||||||
|
|
||||||
all: S_main
|
all: S_main
|
||||||
|
|
||||||
test: all
|
test: all
|
||||||
|
test: TRICK_SYSTEM_CXXFLAGS += -DTRICK_UNIT_TEST
|
||||||
|
test: TRICK_SYSTEM_CFLAGS += -DTRICK_UNIT_TEST
|
||||||
|
|
||||||
S_main : \$(S_MAIN) build/S_define.deps S_sie.resource
|
S_main : \$(S_MAIN) build/S_define.deps S_sie.resource
|
||||||
\t@ echo \"\"
|
\t@ echo \"\"
|
||||||
\t@ echo \"[32m=== Simulation make complete ===[00m\"
|
\t@ echo \"[32m=== Simulation make complete ===[00m\"
|
||||||
|
|
||||||
#\t\t\$(S_OBJECT_FILES) build/lib/*.o
|
|
||||||
|
|
||||||
\$(S_MAIN): \${TRICK_STATIC_LIB} \$(OBJECTS) \$(S_OBJECT_FILES)
|
\$(S_MAIN): \${TRICK_STATIC_LIB} \$(OBJECTS) \$(S_OBJECT_FILES)
|
||||||
\t\$(PRINT_EXE_LINK)
|
\t\$(PRINT_EXE_LINK)
|
||||||
\t\$(ECHO_CMD)\$(TRICK_LD) \$(TRICK_LDFLAGS) -o \$@ \\
|
\t\$(ECHO_CMD)\$(TRICK_LD) \$(TRICK_LDFLAGS) -o \$@ \\
|
||||||
@ -398,19 +395,13 @@ S_main : \$(S_MAIN) build/S_define.deps S_sie.resource
|
|||||||
|
|
||||||
build/S_define.deps:
|
build/S_define.deps:
|
||||||
\t\$(PRINT_S_DEF_DEPS)
|
\t\$(PRINT_S_DEF_DEPS)
|
||||||
\t\$(ECHO_CMD)\$(TRICK_CPPC) \$(TRICK_SFLAGS) \$(TRICK_SYSTEM_SFLAGS) -M -MT Makefile_sim -MF build/S_define.deps -x c++ S_define
|
\t\$(ECHO_CMD)\$(TRICK_CPPC) \$(TRICK_SFLAGS) \$(TRICK_SYSTEM_SFLAGS) -M -MT S_source.hh -MF build/S_define.deps -x c++ S_define
|
||||||
|
|
||||||
\$(CURDIR)/build/S_source.cpp S_default.dat: S_define
|
|
||||||
\t\$(PERL) \${TRICK_HOME}/bin/trick-CP -s -d
|
|
||||||
|
|
||||||
sie: S_sie.resource
|
sie: S_sie.resource
|
||||||
|
|
||||||
S_sie.resource: \$(S_MAIN)
|
S_sie.resource: \$(S_MAIN)
|
||||||
\t@ echo \"[34mGenerating S_sie.resource...[0m\"
|
\t@ echo \"[34mGenerating S_sie.resource...[0m\"
|
||||||
\t\$(ECHO_CMD)\$(S_MAIN) sie
|
\t\$(ECHO_CMD)\$(S_MAIN) sie\n\n" ;
|
||||||
|
|
||||||
S_define_exp:
|
|
||||||
\t\$(TRICK_CC) -E -C -xc++ \${TRICK_SFLAGS} \$(TRICK_SYSTEM_SFLAGS) S_define > \$@\n\n" ;
|
|
||||||
|
|
||||||
# write out the override files we have read in
|
# write out the override files we have read in
|
||||||
foreach $k ( sort keys %files_by_dir ) {
|
foreach $k ( sort keys %files_by_dir ) {
|
||||||
@ -425,6 +416,7 @@ print MAKEFILE "include build/Makefile_swig\n" ;
|
|||||||
print MAKEFILE "-include S_overrides.mk\n" ;
|
print MAKEFILE "-include S_overrides.mk\n" ;
|
||||||
close MAKEFILE ;
|
close MAKEFILE ;
|
||||||
|
|
||||||
|
# write out all of partial linked objects to link_objs that is read in during final linking
|
||||||
open LINKOBJS, ">build/link_objs" or die "Could not open build/link_objs" ;
|
open LINKOBJS, ">build/link_objs" or die "Could not open build/link_objs" ;
|
||||||
foreach $k ( sort keys %files_by_dir ) {
|
foreach $k ( sort keys %files_by_dir ) {
|
||||||
foreach my $ext ( qw{ c C cc cxx cpp c++ l y} ) {
|
foreach my $ext ( qw{ c C cc cxx cpp c++ l y} ) {
|
||||||
|
@ -89,7 +89,7 @@ sub get_lib_deps ($$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( $found == 0 ) {
|
if ( $found == 0 ) {
|
||||||
print STDERR "[33m$source_file_name: Warning: Could not find dependency $l[0m\n" ;
|
print STDERR "[33mWarning: Could not find dependency $l[0m\n" ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (sort keys %resolved_files) ;
|
return (sort keys %resolved_files) ;
|
||||||
|
@ -210,7 +210,7 @@ sub parse_s_define ($) {
|
|||||||
my $cmd;
|
my $cmd;
|
||||||
|
|
||||||
$cmd = "$CC -C -E -xc $ENV{TRICK_SFLAGS} $ENV{TRICK_SYSTEM_SFLAGS} $s_define_file";
|
$cmd = "$CC -C -E -xc $ENV{TRICK_SFLAGS} $ENV{TRICK_SYSTEM_SFLAGS} $s_define_file";
|
||||||
print "$cmd\n" ;
|
#print "$cmd\n" ;
|
||||||
|
|
||||||
@preprocess_output = `$cmd`;
|
@preprocess_output = `$cmd`;
|
||||||
|
|
||||||
|
@ -84,15 +84,17 @@ convert_swig:
|
|||||||
$(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/convert_swig ${TRICK_CONVERT_SWIG_FLAGS}
|
$(ECHO_CMD)${TRICK_HOME}/$(LIBEXEC)/trick/convert_swig ${TRICK_CONVERT_SWIG_FLAGS}
|
||||||
@ touch $(CURDIR)/build/convert_swig_last_run
|
@ touch $(CURDIR)/build/convert_swig_last_run
|
||||||
|
|
||||||
|
S_define_exp:
|
||||||
|
$(TRICK_CC) -E -C -xc++ ${TRICK_SFLAGS} $(TRICK_SYSTEM_SFLAGS) S_define > $@
|
||||||
|
|
||||||
# Pass these options
|
# Pass these options
|
||||||
sie S_define_exp:
|
sie:
|
||||||
@if [ -f build/Makefile_src ] ; then $(MAKE) --no-print-directory -f build/Makefile_src $@ ; else echo "No build/Makefile_src found" ; fi
|
@if [ -f build/Makefile_src ] ; then $(MAKE) --no-print-directory -f build/Makefile_src $@ ; else echo "No build/Makefile_src found" ; fi
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@ echo -e "\
|
@ echo -e "\
|
||||||
Simulation make options:\n\
|
Simulation make options:\n\
|
||||||
make [debug] [TRICK_VERBOSE_BUILD=1] - Makes everything: S_main and S_sie.resource\n\
|
make [debug] [TRICK_VERBOSE_BUILD=1] - Makes everything: S_main and S_sie.resource\n\
|
||||||
make model_dirs - Lists model directories use to build simulation\n\
|
|
||||||
make sie - Builds the S_sie.resource file.\n\
|
make sie - Builds the S_sie.resource file.\n\
|
||||||
make clean - Removes all object files in simulation directory\n\
|
make clean - Removes all object files in simulation directory\n\
|
||||||
make spotless - Performs a clean\n\
|
make spotless - Performs a clean\n\
|
||||||
|
@ -32,7 +32,7 @@ class ballSimObject : public Trick::SimObject {
|
|||||||
("integration") trick_ret = obj.state_integ() ;
|
("integration") trick_ret = obj.state_integ() ;
|
||||||
|
|
||||||
{BLUE} (10.0, "scheduled") trick_ret = obj.state_print() ;
|
{BLUE} (10.0, "scheduled") trick_ret = obj.state_print() ;
|
||||||
{BLUE} (1.0, "freeze_scheduled") trick_ret = obj.state_print() ;
|
{BLUE} (10.0, "freeze_scheduled") trick_ret = obj.state_print() ;
|
||||||
|
|
||||||
("shutdown") obj.shutdown() ;
|
("shutdown") obj.shutdown() ;
|
||||||
}
|
}
|
||||||
|
@ -196,68 +196,3 @@ std::set< std::string > CommentSaver::getIgnoreTypes( std::string file_name ) {
|
|||||||
return ignore_types ;
|
return ignore_types ;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
As of right now I call a perl script to parse the header comment and return
|
|
||||||
the library dependencies because perl is awesome!
|
|
||||||
TODO: Someday when C++11 is working on all the platforms we support we should
|
|
||||||
rewrite this using the language built in regular expressions.
|
|
||||||
TODO: Only fork and exec a single instance of the script.
|
|
||||||
*/
|
|
||||||
|
|
||||||
std::vector< std::string > CommentSaver::getLibraryDependencies( std::string file_name ) {
|
|
||||||
|
|
||||||
pid_t pid ;
|
|
||||||
int pipes[4] ;
|
|
||||||
|
|
||||||
// Open two pipes to allow us to write to and read from child process.
|
|
||||||
pipe(&pipes[0]) ;
|
|
||||||
pipe(&pipes[2]) ;
|
|
||||||
if (( pid = fork()) == 0 ) {
|
|
||||||
// child pipes: read = pipe[2], write = pipe[1]
|
|
||||||
close(pipes[0]) ;
|
|
||||||
close(pipes[3]) ;
|
|
||||||
dup2(pipes[2], STDIN_FILENO) ;
|
|
||||||
dup2(pipes[1], STDOUT_FILENO) ;
|
|
||||||
|
|
||||||
// exec the perl script that parses header comments.
|
|
||||||
std::string parse_lib_deps_path = std::string(getenv("TRICK_HOME")) + "/libexec/trick/ICG_lib_deps_helper" ;
|
|
||||||
execl(parse_lib_deps_path.c_str(), parse_lib_deps_path.c_str(), file_name.c_str(), (char *)NULL) ;
|
|
||||||
exit(1) ;
|
|
||||||
}
|
|
||||||
// parent pipes: read = pipe[0], write = pipe[3]
|
|
||||||
close(pipes[1]) ;
|
|
||||||
close(pipes[2]) ;
|
|
||||||
|
|
||||||
// get the header comment and send it with a end delimiter to the perl script
|
|
||||||
std::string header = getTrickHeaderComment(file_name) + "\nEND ICG PROCESSING\n" ;
|
|
||||||
write(pipes[3], header.c_str() , header.size()) ;
|
|
||||||
|
|
||||||
// wait for the child process to end
|
|
||||||
int status ;
|
|
||||||
waitpid(pid, &status, 0) ;
|
|
||||||
|
|
||||||
// read the result from the perl script
|
|
||||||
int num_read ;
|
|
||||||
char buf[4096] ;
|
|
||||||
std::string response ;
|
|
||||||
while (( num_read = read(pipes[0], buf, sizeof(buf) - 1) ) > 0 ) {
|
|
||||||
buf[num_read] = 0 ;
|
|
||||||
response += buf ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse the single string result into a vector of strings.
|
|
||||||
std::vector< std::string > lib_deps ;
|
|
||||||
std::string::size_type pos = 0;
|
|
||||||
std::string::size_type prev = 0;
|
|
||||||
while ((pos = response.find("\n", prev)) != std::string::npos)
|
|
||||||
{
|
|
||||||
lib_deps.push_back(response.substr(prev, pos - prev));
|
|
||||||
prev = pos + 1;
|
|
||||||
}
|
|
||||||
lib_deps.push_back(response.substr(prev));
|
|
||||||
|
|
||||||
return lib_deps ;
|
|
||||||
}
|
|
||||||
|
@ -77,12 +77,6 @@ class CommentSaver : public clang::CommentHandler {
|
|||||||
*/
|
*/
|
||||||
std::set< std::string > getIgnoreTypes( std::string file_name ) ;
|
std::set< std::string > getIgnoreTypes( std::string file_name ) ;
|
||||||
|
|
||||||
/** Returns a vector of library dependencies from the Trick comment
|
|
||||||
@param file_name = File name to search
|
|
||||||
@return vector of library dependency strings
|
|
||||||
*/
|
|
||||||
std::vector< std::string > getLibraryDependencies( std::string file_name ) ;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** The compiler's source manager. Holds file/line info for everything. */
|
/** The compiler's source manager. Holds file/line info for everything. */
|
||||||
clang::CompilerInstance & ci ;
|
clang::CompilerInstance & ci ;
|
||||||
|
@ -512,56 +512,6 @@ void PrintAttributes::printIOMakefile() {
|
|||||||
ext_lib.close() ;
|
ext_lib.close() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintAttributes::printHeaderLibraryDependencies() {
|
|
||||||
std::ofstream header_lib_deps ;
|
|
||||||
|
|
||||||
std::cout << "[34mSearching header files for Library Dependencies[0m" << std::endl ;
|
|
||||||
header_lib_deps.open("build/ICG_lib_deps") ;
|
|
||||||
std::map< std::string , std::string >::iterator mit ;
|
|
||||||
for ( mit = all_io_files.begin() ; mit != all_io_files.end() ; mit++ ) {
|
|
||||||
size_t found ;
|
|
||||||
found = (*mit).first.find_last_of(".") ;
|
|
||||||
std::string lib_dep_file = std::string("build") + (*mit).first.substr(0,found) + ".lib_deps" ;
|
|
||||||
header_lib_deps << lib_dep_file << std::endl ;
|
|
||||||
if ( out_of_date_io_files.find((*mit).first) != out_of_date_io_files.end()) {
|
|
||||||
std::ofstream file_list ;
|
|
||||||
file_list.open(lib_dep_file) ;
|
|
||||||
std::vector< std::string > lib_deps = cs.getLibraryDependencies((*mit).first) ;
|
|
||||||
std::vector< std::string >::iterator vit ;
|
|
||||||
for ( vit = lib_deps.begin() ; vit != lib_deps.end() ; vit++ ) {
|
|
||||||
file_list << *vit << std::endl ;
|
|
||||||
}
|
|
||||||
file_list.close() ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::set< std::string >::iterator sit ;
|
|
||||||
for ( sit = empty_header_files.begin() ; sit != empty_header_files.end() ; sit++ ) {
|
|
||||||
size_t found ;
|
|
||||||
found = (*sit).find_last_of(".") ;
|
|
||||||
std::string lib_dep_file = std::string("build") + (*sit).substr(0,found) + ".lib_deps" ;
|
|
||||||
|
|
||||||
char * tmp_str = strdup(lib_dep_file.c_str()) ;
|
|
||||||
char * dir_name = dirname(tmp_str) ;
|
|
||||||
_mkdir(dir_name) ;
|
|
||||||
free(tmp_str) ;
|
|
||||||
|
|
||||||
std::vector< std::string > lib_deps = cs.getLibraryDependencies((*sit)) ;
|
|
||||||
std::vector< std::string >::iterator vit ;
|
|
||||||
if ( lib_deps.size() > 0 ) {
|
|
||||||
header_lib_deps << lib_dep_file << std::endl ;
|
|
||||||
std::ofstream file_list ;
|
|
||||||
file_list.open(lib_dep_file) ;
|
|
||||||
for ( vit = lib_deps.begin() ; vit != lib_deps.end() ; vit++ ) {
|
|
||||||
file_list << *vit << std::endl ;
|
|
||||||
}
|
|
||||||
file_list.close() ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
header_lib_deps.close() ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PrintAttributes::printICGNoFiles() {
|
void PrintAttributes::printICGNoFiles() {
|
||||||
if ( ! sim_services_flag ) {
|
if ( ! sim_services_flag ) {
|
||||||
std::vector< std::string >::iterator it ;
|
std::vector< std::string >::iterator it ;
|
||||||
|
@ -45,9 +45,6 @@ class PrintAttributes {
|
|||||||
/** Create makefile for IO files */
|
/** Create makefile for IO files */
|
||||||
virtual void printIOMakefile() ;
|
virtual void printIOMakefile() ;
|
||||||
|
|
||||||
/** Print header library dependencies */
|
|
||||||
virtual void printHeaderLibraryDependencies() ;
|
|
||||||
|
|
||||||
/** Prints list of files that contain ICG:(No) in the Trick header */
|
/** Prints list of files that contain ICG:(No) in the Trick header */
|
||||||
virtual void printICGNoFiles() ;
|
virtual void printICGNoFiles() ;
|
||||||
|
|
||||||
|
@ -191,7 +191,6 @@ int main( int argc , char * argv[] ) {
|
|||||||
|
|
||||||
if ( ! sim_services_flag ) {
|
if ( ! sim_services_flag ) {
|
||||||
pa.printIOMakefile() ;
|
pa.printIOMakefile() ;
|
||||||
pa.printHeaderLibraryDependencies() ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close the map files
|
// Close the map files
|
||||||
|
Loading…
Reference in New Issue
Block a user