#! /usr/bin/perl ################################################################################ # Program: make_build # # This program constructs Makefiles for model directories in # /. # # Command Syntax: make_build # #******************************************************************* use lib $ENV{"TRICK_HOME"} . "/bin/pm" ; use Cwd ; use File::Basename ; use trick_version ; ############################################################################### # Process command line options ############################################################################### $lib_file = ""; # Check calling args. if ( @ARGV[0] ne "") { if ( @ARGV[0] eq "lib" and @ARGV[1] ne "" ) { $lib_file = @ARGV[1]; if ( $lib_file !~ /\.a$/ ) { print "USAGE: make_build lib lib_file_name.a\n"; exit; } $lib_file =~ s/lib.*?\/// ; $lib_file = "lib_\${TRICK_HOST_CPU}/$lib_file"; } elsif ( @ARGV[0] eq "sharedlib" and @ARGV[1] ne "" ) { $sharedlib_file = @ARGV[1]; if ( $sharedlib_file !~ /\.so$/ ) { print "USAGE: make_build sharedlib lib_file_name.so\n"; exit; } $sharedlib_file =~ s/lib.*?\/// ; $sharedlib_file = "lib_\${TRICK_HOST_CPU}/$sharedlib_file"; $lib_file = $sharedlib_file ; $lib_file =~ s/\.so/\.a/ ; } else { print "USAGE: make_build [lib ]\n"; exit; } } # Get the full path of the current working directory $wd = cwd(); if ($ENV{TRICK_HOME} eq "") { print "TRICK_HOME is not set... cannot continue\n" ; exit (1) } # If this is a /src, /include, /xml, /io_src, /catalog, or /object_* # directory, then start make_build in the ../ directory. if ( $wd =~ /\/include/ and $wd !~ /\/sim_services\// ) { $wd = dirname($wd); } elsif ( $wd =~ /\/src/ or $wd =~ /\/xml/ or $wd =~ /\/io_src/ or $wd =~ /\/catalog/ or $wd =~ /\/object_/ ) { $wd = dirname($wd); } # Let user know what's going on. print "Processing $wd\n"; print "Building Makefile...\n"; # Open the file "Makefile" my ($all_lines) = do { local $/; }; open MAKEFILE , ">Makefile"; $date = `date` ; chomp $date ; my ($trick_ver, $trick_thread) = get_trick_version() ; my ($trick_major , $trick_minor ) ; ($trick_major , $trick_minor ) = $trick_ver =~ /(\d+)\.([^\.]+)/ ; #$trick_ver = `trick_version -f` ; #chomp $trick_ver ; $all_lines =~ s/DATE/$date/ ; $all_lines =~ s/REPLACE_TRICK_MAJOR/$trick_major/g ; $all_lines =~ s/REPLACE_TRICK_MINOR/$trick_minor/g ; $all_lines =~ s/REPLACE_TRICK_THREAD/$trick_thread/g ; $all_lines =~ s/LIB_FILE/$lib_file/ ; $all_lines =~ s/SHARED_LIB_FILE/$sharedlib_file/ ; print MAKEFILE $all_lines ; close MAKEFILE ; # If this directory has a '/src' directory, create a Makefile for # /src as well. if ( -e "$wd/src" ) { # Open the file "src/Makefile" open MAKEFILE , ">src/Makefile"; print MAKEFILE "# Go up to parent directory and run make from there\ default:\ \tcd .. ; make\ ICG:\ \tcd .. ; make ICG\ depend:\ \tcd .. ; make depend\ io_clean:\ \tcd .. ; make io_clean\ catalog_clean:\ \tcd .. ; make catalog_clean\ clean:\ \tcd .. ; make clean\ real_clean:\ \tcd .. ; make real_clean" ; close MAKEFILE ; } print "Adding file dependencies in Makefile...\n" ; system "make depend"; print "make_build complete\n" ; __END__ ############################################################################# # # This make file was automatically generated by: # # /user2/lin/trick_dev/03/bin/make_build # # Trick ver: REPLACE_TRICK_MAJOR.REPLACE_TRICK_MINOR-REPLACE_TRICK_THREAD # # Date: DATE # ############################################################################# # # To get a desription of the arguments accepted by this makefile, # type 'make help' # ############################################################################# ############################################################################# ## DIRECTORY DEFINITIONS ## ############################################################################# ifeq ($(wildcard src),src) SRC_DIR := src/ CD_CMD := cd src ; UP_DIR := ../ else SRC_DIR := CD_CMD := UP_DIR := endif PWD = $(shell pwd) IO_SRC_DIR = io_src/ OBJ_DIR = lib_${TRICK_HOST_CPU} LIB = LIB_FILE SHARED_LIB = SHARED_LIB_FILE ifndef TRICK_CC TRICK_CC = cc endif ifndef TRICK_CPPC TRICK_CPPC = c++ endif ifndef TRICK_FC TRICK_FC = f90 endif TRICK_CFLAGS += -I${TRICK_HOME}/trick_source -I../include -fPIC ifdef TRICK_CXXFLAGS TRICK_CXXFLAGS += -DTRICK_VER=REPLACE_TRICK_MAJOR -DTRICK_MINOR=REPLACE_TRICK_MINOR -I${TRICK_HOME}/trick_source -I../include -fPIC else TRICK_CXXFLAGS = ${TRICK_CFLAGS} -DTRICK_VER=REPLACE_TRICK_MAJOR -DTRICK_MINOR=REPLACE_TRICK_MINOR -I${TRICK_HOME}/trick_source -I../include -fPIC endif TRICK_FTNFLAGS += -I${TRICK_HOME}/trick_source -I../include ifeq ($(TRICK_HOST_TYPE), Linux) MAKEDEP_CPP_INC = -Iinclude -I/usr/include/g++-3 TRICK_CFLAGS += -I/usr/X11R6/include endif ifeq ($(TRICK_HOST_TYPE), QNX) MAKEDEP_CPP_INC = -Iinclude TRICK_EXEC_LINK_LIBS += -lm -lsocket endif ifeq ($(TRICK_HOST_TYPE), LynxOS) TRICK_CFLAGS += -mthreads TRICK_CXXFLAGS += -mthreads endif ifeq ($(TRICK_HOST_TYPE), Darwin) MAKEDEP_CPP_INC = -Iinclude -I/usr/include/gcc/darwin/3.1/g++-v3 \ -I/usr/include/gcc/darwin/3.1/g++-v3/ppc-darwin \ -I/usr/include/gcc/darwin/default/g++-v3/backward \ -I/usr/include/gcc/darwin/3.1 TRICK_RANLIB = /usr/bin/ranlib TRICK_CFLAGS += -I/usr/X11R6/include -I/usr/local/include endif ifeq ($(TRICK_HOST_TYPE), SunOS_5.6_plus) # These are specific to our gcc 2.95 installation in /opt/sfw MAKEDEP_CPP_INC = -Iinclude -I/opt/sfw/include/g++-3 \ -I/opt/sfw/sparc-sun-solaris2.8/include \ -I/opt/sfw/lib/gcc-lib/sparc-sun-solaris2.8/2.95.3/include endif ifeq ($(TRICK_HOST_TYPE), IRIX_6.x) MAKEDEP_CPP_INC = -Iinclude -I/usr/include/CC endif ifeq ($(TRICK_HOST_TYPE), Interix) TRICK_CFLAGS += -D_ALL_SOURCE TRICK_CXXFLAGS += -D_ALL_SOURCE TRICK_EXEC_LINK_LIBS += -lm endif ############################################################################# ## UTILITY DEFINITIONS ## ############################################################################# SHELL = /bin/sh AWK = awk SED = sed LEX = /usr/bin/flex YACC = /usr/bin/bison PERL = /usr/bin/perl CD = cd MV = mv RM = rm # # Make information # MAKEFILE = $(PWD)/Makefile DEPFILE = $(PWD)/Makefile_deps DEPTEMPFILE = Makefile_temp_depends ############################################################################# ## FILE NAME DEFINITIONS ## ############################################################################# L_SRC = $(wildcard $(SRC_DIR)*.l) L_OUT = $(subst .l,.clex,$(L_SRC)) Y_SRC = $(wildcard $(SRC_DIR)*.y) Y_OUT = $(subst .y,.c,$(Y_SRC)) Y_OBJS = $(addprefix $(OBJ_DIR)/,$(notdir $(subst .y,.o,$(Y_SRC)))) C_SRC = $(wildcard $(SRC_DIR)*.c) C_OBJS = $(filter-out $(Y_OBJS), $(addprefix $(OBJ_DIR)/,$(notdir $(subst .c,.o,$(C_SRC))))) CPP_C_SRC = $(wildcard $(SRC_DIR)*.C) CPP_CC_SRC = $(wildcard $(SRC_DIR)*.cc) CPP_CPP_SRC = $(wildcard $(SRC_DIR)*.cpp) CPP_CXX_SRC = $(wildcard $(SRC_DIR)*.cxx) CPP_CPLUS_SRC = $(wildcard $(SRC_DIR)*.c++) CPP_SRC = $(CPP_C_SRC) $(CPP_CC_SRC) $(CPP_CPP_SRC) $(CPP_CXX_SRC) $(CPP_CPLUS_SRC) CPP_C_OBJS = $(addprefix $(OBJ_DIR)/,$(notdir $(subst .C,.o,$(CPP_C_SRC)))) CPP_CC_OBJS = $(addprefix $(OBJ_DIR)/,$(notdir $(subst .cc,.o,$(CPP_CC_SRC)))) CPP_CPP_OBJS = $(addprefix $(OBJ_DIR)/,$(notdir $(subst .cpp,.o,$(CPP_CPP_SRC)))) CPP_CXX_OBJS = $(addprefix $(OBJ_DIR)/,$(notdir $(subst .cxx,.o,$(CPP_CXX_SRC)))) CPP_CPLUS_OBJS = $(addprefix $(OBJ_DIR)/,$(notdir $(subst .c++,.o,$(CPP_CPLUS_SRC)))) CPP_OBJS = $(CPP_C_OBJS) $(CPP_CC_OBJS) $(CPP_CPP_OBJS) $(CPP_CXX_OBJS) $(CPP_CPLUS_OBJS) F_SRC = $(wildcard $(SRC_DIR)*.f) F_OBJS = $(addprefix $(OBJ_DIR)/,$(notdir $(subst .f,.o,$(F_SRC)))) IO_C_SRC = $(wildcard $(IO_SRC_DIR)*.c) IO_C_OBJS =$(subst io_src,$(OBJ_DIR),$(subst .c,.o,$(IO_C_SRC))) IO_CPP_SRC = $(wildcard $(IO_SRC_DIR)*.cpp) IO_CPP_OBJS =$(subst io_src,$(OBJ_DIR),$(subst .cpp,.o,$(IO_CPP_SRC))) IO_SRC = $(IO_C_SRC) $(IO_CPP_SRC) IO_OBJS = $(IO_C_OBJS) $(IO_CPP_OBJS) OBJECT_FILES = $(IO_OBJS) $(Y_OBJS) $(C_OBJS) $(CPP_OBJS) $(F_OBJS) ############################################################################# ## MODEL TARGETS ## ############################################################################# ifneq ($(LIB),"") default: objects $(LIB) $(SHARED_LIB) else default: objects endif trick: objects object_dir: $(OBJ_DIR) objects: y_objects c_objects cpp_objects f_objects h_objects @ echo "$(CURDIR) object files up to date" c_objects: $(OBJ_DIR) $(C_OBJS) cpp_objects: $(OBJ_DIR) $(CPP_OBJS) f_objects: $(OBJ_DIR) $(F_OBJS) h_objects: $(OBJ_DIR) $(IO_OBJS) y_objects: $(OBJ_DIR) $(L_OUT) $(Y_OUT) $(Y_OBJS) $(LIB) : $(OBJECT_FILES) ar cr $(LIB) $? @ if [ "${TRICK_RANLIB}" != "" ] ; then \ echo ${TRICK_RANLIB} $(LIB) ; \ ${TRICK_RANLIB} $(LIB) ; \ fi $(SHARED_LIB) : $(OBJECT_FILES) gcc -shared -o $(SHARED_LIB) $(OBJECT_FILES) $(OBJ_DIR): @ mkdir -p $(OBJ_DIR) @ echo "Created $(OBJ_DIR)" # # IO_OBJS # $(IO_C_OBJS): $(OBJ_DIR)/%.o : $(IO_SRC_DIR)%.c $(TRICK_CC) $(TRICK_CFLAGS) -c $< -o $@ $(IO_CPP_OBJS): $(OBJ_DIR)/%.o : $(IO_SRC_DIR)%.cpp $(TRICK_CPPC) $(TRICK_CXXFLAGS) -c $< -o $@ # # # C_OBJS # $(C_OBJS): $(OBJ_DIR)/%.o : $(SRC_DIR)%.c $(CD_CMD) $(TRICK_CC) $(TRICK_CFLAGS) -c ${> $(DEPTEMPFILE) @ $(PERL) ${TRICK_HOME}/bin/depend_cp $(DEPTEMPFILE) > $(DEPFILE) @ $(RM) $(DEPTEMPFILE) @ echo "Created dependency file $(DEPFILE)" io_clean: $(RM) -rf io_src real_clean: clean io_clean catalog_clean $(RM) -rf xml *~ *.bak core @ echo "Directory is really clean!" clean: ifeq ($(notdir $(LIB)),libtrick.a) $(RM) -rf $(OBJ_DIR) $(L_OUT) $(Y_OUT) else $(RM) -rf $(LIB) $(OBJ_DIR) $(L_OUT) $(Y_OUT) endif @ echo "Object files successfully removed" catalog_clean : @ echo y | catalog -dp $(CURDIR) @ echo "Catalog purged" catalog : catalog_clean $(IO_SRC) MIS @ echo "$(CURDIR) Catalog rebuilt" help : @ echo -e "\n\ Source Directory Make Options:\n\ make - Compiles are source files\n\ \n\ make ICG - Deletes the io_src directory and runs ICG\n\ on all pertinent *.h files\n\ \n\ make catalog - Deletes the local catalog and builds a new one\n\ \n\ make depend - Adds file dependencies to Makefile\n\ \n\ make io_clean - Deletes the local io_src directory\n\ \n\ make catalog_clean - Deletes the local catalog directory\n\ \n\ make clean - Deletes the object code directory\n\ \n\ make real_clean - Deletes xml/, io_src/,\n\ and lib_${TRICK_HOST_CPU}/ directories\n" ifeq ($(wildcard makefile_overrides),makefile_overrides) include makefile_overrides endif -include Makefile_deps