# Author: Dan Bhanderi, 2005 # # File : lnx_unix.tmf $Revision: 1.10 $ # # Abstract: # Real-Time Workshop template makefile for building a Linux # Soft Real-Time version of Simulink model using generated C code. # # This makefile attempts to conform to the guidelines specified in the # IEEE Std 1003.2-1992 (POSIX) standard. It is designed to be used # with GNU Make which is located in matlabroot/rtw/bin. # # Note that this template is automatically customized by the Real-Time # Workshop build procedure to create ".mk" # # The following defines can be used to modify the behavior of the # build: # OPT_OPTS - Optimization options. Default is -O. To enable # debugging specify as OPT_OPTS=-g. # Because of optimization problems in IBM_RS, # default is no-optimization. # CPP_OPTS - C++ compiler options. # OPTS - User specific compile options. # USER_SRCS - Additional user sources, such as files needed by # S-functions. # USER_INCLUDES - Additional include paths # (i.e. USER_INCLUDES="-Iwhere-ever -Iwhere-ever2") # # This template makefile is designed to be used with a system target # file that contains 'rtwgensettings.BuildDirSuffix' see lnx.tlc #------------------------ Macros read by make_rtw ------------------------------ # # The following macros are read by the Real-Time Workshop build procedure: # # MAKECMD - This is the command used to invoke the make utility # HOST - What platform this template makefile is targeted for # (i.e. PC or UNIX) # BUILD - Invoke make from the Real-Time Workshop build procedure # (yes/no)? # SYS_TARGET_FILE - Name of system target file. MAKECMD = make HOST = UNIX BUILD = yes SYS_TARGET_FILE = aloe.tlc MAKEFILE_FILESEP = / USER_INCLUDES = -I/usr/local/include/ #---------------------- Tokens expanded by make_rtw ---------------------------- # # The following tokens, when wrapped with "|>" and "<|" are expanded by the # Real-Time Workshop build procedure. # # MODEL_NAME - Name of the Simulink block diagram # MODEL_MODULES - Any additional generated source modules # MAKEFILE_NAME - Name of makefile created from template makefile .mk # MATLAB_ROOT - Path to were MATLAB is installed. # S_FUNCTIONS - List of S-functions. # S_FUNCTIONS_LIB - List of S-functions libraries to link. # SOLVER - Solver source file name # NUMST - Number of sample times # TID01EQ - yes (1) or no (0): Are sampling rates of continuous task # (tid=0) and 1st discrete task equal. # NCSTATES - Number of continuous states # COMPUTER - Computer type. See the MATLAB computer command. # BUILDARGS - Options passed in at the command line. # MULTITASKING - yes (1) or no (0): Is solver mode multitasking # EXT_MODE - yes (1) or no (0): Build for external mode # TMW_EXTMODE_TESTING - yes (1) or no (0): Build ext_test.c for external mode # testing. # EXTMODE_TRANSPORT - Index of transport mechanism (e.g. tcpip, serial) for extmode # EXTMODE_STATIC - yes (1) or no (0): Use static instead of dynamic mem alloc. # EXTMODE_STATIC_SIZE - Size of static memory allocation buffer. # GEN_MDLREF_SFCN - (1/0): are we generating model reference wrapper s-function # TGT_FCN_LIB - Target Funtion library to use # MODELREFS - List of referenced models # LD_OPTS - Linker options # PC_CMD - Post compile command # CUSTOM_PATH - yes (1) or no (0): Matlab root specified. # MATLAB_PATH - Custom Matlab path. # TARGET_PATH - Path to target files. COMPUTER = GLNX86 MODEL = |>MODEL_NAME<| MODULES = |>MODEL_MODULES<| MAKEFILE = |>MAKEFILE_NAME<| MATLAB_ROOT = |>MATLAB_ROOT<| TARGET_PATH = |>TARGET_PATH<| ALT_MATLAB_ROOT = |>ALT_MATLAB_ROOT<| S_FUNCTIONS = |>S_FUNCTIONS<| S_FUNCTIONS_LIB = |>S_FUNCTIONS_LIB<| SOLVER = |>SOLVER<| NUMST = |>NUMST<| TID01EQ = |>TID01EQ<| NCSTATES = |>NCSTATES<| COMPUTER = |>TARGET_ARCH<| BUILDARGS = |>BUILDARGS<| MULTITASKING = |>MULTITASKING<| EXT_MODE = |>EXT_MODE<| TMW_EXTMODE_TESTING = |>TMW_EXTMODE_TESTING<| EXTMODE_TRANSPORT = |>EXTMODE_TRANSPORT<| EXTMODE_STATIC = |>EXTMODE_STATIC_ALLOC<| EXTMODE_STATIC_SIZE = |>EXTMODE_STATIC_ALLOC_SIZE<| MEXEXT = |>MEXEXT<| TGT_FCN_LIB = |>TGT_FCN_LIB<| MODELREFS = |>MODELREFS<| SHARED_SRC = |>SHARED_SRC<| SHARED_SRC_DIR = |>SHARED_SRC_DIR<| SHARED_BIN_DIR = |>SHARED_BIN_DIR<| SHARED_LIB = |>SHARED_LIB<| TARGET_LANG_EXT = |>TARGET_LANG_EXT<| LD_OPTS = |>LD_OPTS<| PC_CMD = |>PC_CMD<| CUSTOM_PATH = |>CUSTOM_PATH<| #--------------------------- Model and reference models ----------------------- MODELLIB = |>MODELLIB<| MODELREF_LINK_LIBS = |>MODELREF_LINK_LIBS<| MODELREF_INC_PATH = |>START_MDLREFINC_EXPAND_INCLUDES<|-I|>MODELREF_INC_PATH<| |>END_MDLREFINC_EXPAND_INCLUDES<| RELATIVE_PATH_TO_ANCHOR = |>RELATIVE_PATH_TO_ANCHOR<| # NONE: standalone, SIM: modelref sim, RTW: modelref rtw MODELREF_TARGET_TYPE = |>MODELREF_TARGET_TYPE<| #-- In the case when directory name contains space --- ifneq ($(MATLAB_ROOT),$(ALT_MATLAB_ROOT)) MATLAB_ROOT := $(ALT_MATLAB_ROOT) endif #--------------------------- Custom paths ------------------------------------- ifeq ($(CUSTOM_PATH),1) MY_MATLAB_PATH = |>MATLAB_PATH<| MY_TARGET_PATH = |>TARGET_PATH<| MATLAB_ROOT = $(shell echo $(MY_MATLAB_PATH)) TARGET_PATH = $(shell echo $(MY_TARGET_PATH)) endif #--------------------------- Tool Specifications ------------------------------- include $(MATLAB_ROOT)/rtw/c/tools/unixtools.mk #------------------------------ Include Path ----------------------------------- MATLAB_INCLUDES = \ -I$(MATLAB_ROOT)/simulink/include \ -I$(MATLAB_ROOT)/extern/include \ -I$(MATLAB_ROOT)/rtw/c/src \ -I$(MATLAB_ROOT)/rtw/c/src/ext_mode/common \ -I$(MATLAB_ROOT)/rtw/c/libsrc # Additional file include paths ADD_INCLUDES = \ |>START_EXPAND_INCLUDES<|-I|>EXPAND_DIR_NAME<| \ |>END_EXPAND_INCLUDES<| SHARED_INCLUDES = ifneq ($(SHARED_SRC_DIR),) SHARED_INCLUDES = -I$(SHARED_SRC_DIR) endif INCLUDES = -I. -I$(RELATIVE_PATH_TO_ANCHOR) $(MATLAB_INCLUDES) $(ADD_INCLUDES) $(USER_INCLUDES) \ $(INSTRUMENT_INCLUDES) $(MODELREF_INC_PATH) $(SHARED_INCLUDES) #----------------------------- External mode ----------------------------------- # Uncomment -DVERBOSE to have information printed to stdout # To add a new transport layer, see the comments in # /toolbox/simulink/simulink/extmode_transports.m ifeq ($(EXT_MODE),1) EXT_CC_OPTS = -DEXT_MODE -D$(COMPUTER) #-DVERBOSE EXT_LIB = EXT_SRC = LINT_EXT_COMMON_SRC = LINT_EXT_TCPIP_SRC = ifeq ($(EXTMODE_TRANSPORT),0) #tcpip EXT_SRC = ext_svr.c updown.c ext_work.c ext_svr_tcpip_transport.c LINT_EXT_COMMON_SRC = ext_svr.c updown.c ext_work.c LINT_EXT_TCPIP_SRC = ext_svr_tcpip_transport.c endif ifeq ($(EXTMODE_TRANSPORT),1) #serial_win32 err: @echo @echo "### ERROR: External mode serial transport only available on win32" @echo endif ifeq ($(TMW_EXTMODE_TESTING),1) EXT_SRC += ext_test.c EXT_CC_OPTS += -DTMW_EXTMODE_TESTING endif ifeq ($(EXTMODE_STATIC),1) EXT_SRC += mem_mgr.c LINT_EXT_COMMON_SRC += mem_mgr.c EXT_CC_OPTS += -DEXTMODE_STATIC -DEXTMODE_STATIC_SIZE=$(EXTMODE_STATIC_SIZE) endif ifeq ($(COMPUTER),SOL2) EXT_LIB = -lsocket -lnsl endif endif #----------------------------- Real-Time Model --------------------------------- RTM_CC_OPTS = -DUSE_RTMODEL #-------------------------------- C Flags -------------------------------------- # Optimization Options ifndef OPT_OPTS OPT_OPTS = $(DEFAULT_OPT_OPTS) endif # General User Options OPTS = # Compiler options, etc: CC_OPTS = $(OPT_OPTS) $(OPTS) $(EXT_CC_OPTS) $(RTM_CC_OPTS) CPP_REQ_DEFINES = -DMODEL=$(MODEL) -DRT -DNUMST=$(NUMST) \ -DTID01EQ=$(TID01EQ) -DNCSTATES=$(NCSTATES) -DUNIX \ -DMT=$(MULTITASKING) -DHAVESTDIO CFLAGS = $(CC_OPTS) $(ANSI_OPTS) $(CPP_REQ_DEFINES) $(INCLUDES) CPPFLAGS = $(CPP_OPTS) $(CC_OPTS) $(CPP_ANSI_OPTS) $(CPP_REQ_DEFINES) $(INCLUDES) #-------------------------- Additional Libraries ------------------------------ SYSLIBS = $(EXT_LIB) $(LD_OPTS) LIBS = /usr/local/lib/libsw_api.a /usr/local/lib/libhw_api.a |>START_PRECOMP_LIBRARIES<| LIBS += |>EXPAND_LIBRARY_NAME<|.a |>END_PRECOMP_LIBRARIES<| |>START_EXPAND_LIBRARIES<| LIBS += |>EXPAND_LIBRARY_NAME<|.a |>END_EXPAND_LIBRARIES<| LIBS += $(S_FUNCTIONS_LIB) $(INSTRUMENT_LIBS) #----------------------------- Source Files ------------------------------------ USER_SRCS = USER_OBJS = $(addsuffix .o, $(basename $(USER_SRCS))) LOCAL_USER_OBJS = $(notdir $(USER_OBJS)) SRCS = $(MODULES) $(S_FUNCTIONS) ifeq ($(MODELREF_TARGET_TYPE), NONE) PRODUCT = $(RELATIVE_PATH_TO_ANCHOR)/$(MODEL) BIN_SETTING = $(LD) $(LDFLAGS) -o $(PRODUCT) $(SYSLIBS) BUILD_PRODUCT_TYPE = "executable" SRCS += $(MODEL).$(TARGET_LANG_EXT) lnx_main.c rt_sim.c $(EXT_SRC) $(SOLVER) else # Model reference rtw target PRODUCT = $(MODELLIB) BUILD_PRODUCT_TYPE = "library" endif ifneq ($(findstring .cpp,$(suffix $(SRCS), $(USER_SRCS))),) LD = $(CPP) SYSLIBS += $(CPP_SYS_LIBS) endif OBJS = $(addsuffix .o, $(basename $(SRCS))) $(USER_OBJS) LINK_OBJS = $(addsuffix .o, $(basename $(SRCS))) $(LOCAL_USER_OBJS) SHARED_SRC := $(wildcard $(SHARED_SRC)) SHARED_OBJS = $(addsuffix .o, $(basename $(SHARED_SRC))) #------------- Test Compile using gcc -Wall to look for warnings --------------- # # DO_GCC_TEST=1 runs gcc with compiler warning flags on all the source files # used in this build. This includes the generated code, and any user source # files needed for the build and placed in this directory. # # WARN_ON_GLNX=1 runs the linux compiler with warnings flags. On hand-written # code we use the max amount of flags availabe while on the generated code, a # few less. # # See rtw/c/tools/unixtools.mk for the definition of GCC_WARN_OPTS GCC_TEST_CMD := echo GCC_TEST_OUT := > /dev/null ifeq ($(DO_GCC_TEST), 1) GCC_TEST := gcc -c -o /dev/null $(GCC_WARN_OPTS_MAX) $(CPP_REQ_DEFINES) \ $(INCLUDES) GCC_TEST_CMD := echo; echo "\#\#\# GCC_TEST $(GCC_TEST) $<"; $(GCC_TEST) GCC_TEST_OUT := ; echo endif GCC_WALL_FLAG := GCC_WALL_FLAG_MAX := ifeq ($(COMPUTER), GLNX86) ifeq ($(WARN_ON_GLNX), 1) GCC_WALL_FLAG := $(GCC_WARN_OPTS) GCC_WALL_FLAG_MAX := $(GCC_WARN_OPTS_MAX) endif endif #----------------------------- Lint (sol2 only) -------------------------------- LINT_SRCS = $(TARGET_PATH)/lnx_main.c \ $(MATLAB_ROOT)/rtw/c/src/rt_sim.c ifneq ($(SOLVER), ) LINT_SRCS += $(MATLAB_ROOT)/rtw/c/src/$(SOLVER) endif ifneq ($(LINT_EXT_COMMON_SRC), ) LINT_SRCS += $(MATLAB_ROOT)/rtw/c/src/ext_mode/common/$(LINT_EXT_COMMON_SRC) endif ifneq ($(LINT_EXT_TCPIP_SRC), ) LINT_SRCS += $(MATLAB_ROOT)/rtw/c/src/ext_mode/tcpip/$(LINT_EXT_TCPIP_SRC) endif LINT_SRCS += $(MODEL).$(TARGET_LANG_EXT) $(MODULES) $(USER_SRCS) $(S_FUNCTIONS) LINTOPTSFILE = $(MODEL).lintopts LINT_ERROFF1 = E_NAME_DEF_NOT_USED2,E_NAME_DECL_NOT_USED_DEF2 LINT_ERROFF2 = $(LINT_ERROFF1),E_FUNC_ARG_UNUSED LINT_ERROFF = $(LINT_ERROFF2),E_INDISTING_FROM_TRUNC2,E_NAME_USED_NOT_DEF2 #--------------------------------- Rules --------------------------------------- ifeq ($(MODELREF_TARGET_TYPE),NONE) $(PRODUCT) : $(OBJS) $(SHARED_LIB) $(LIBS) $(MODELREF_LINK_LIBS) $(BIN_SETTING) $(LINK_OBJS) $(MODELREF_LINK_LIBS) $(SHARED_LIB) $(LIBS) @echo "### Created $(BUILD_PRODUCT_TYPE): $@" $(PC_CMD) else $(PRODUCT) : $(OBJS) $(SHARED_LIB) $(LIBS) @rm -f $(MODELLIB) ar ruvs $(MODELLIB) $(LINK_OBJS) @echo "### Created $(MODELLIB)" @echo "### Created $(BUILD_PRODUCT_TYPE): $@" $(PC_CMD) endif %.o : %.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG) $< %.o : %.cpp @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CPP) -c $(CPPFLAGS) $(GCC_WALL_FLAG) $< %.o : $(RELATIVE_PATH_TO_ANCHOR)/%.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG) $< %.o : $(RELATIVE_PATH_TO_ANCHOR)/%.cpp @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CPP) -c $(CPPFLAGS) $< %.o : $(TARGET_PATH)/%.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) $< %.o : $(MATLAB_ROOT)/rtw/c/src/ext_mode/common/%.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) $< %.o : $(MATLAB_ROOT)/rtw/c/src/ext_mode/tcpip/%.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) $< %.o : $(MATLAB_ROOT)/rtw/c/src/ext_mode/custom/%.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) $< |>START_EXPAND_RULES<|%.o : |>EXPAND_DIR_NAME<|/%.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) $< |>END_EXPAND_RULES<| |>START_EXPAND_RULES<|%.o : |>EXPAND_DIR_NAME<|/%.cpp @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CPP) -c $(CPPFLAGS) $< |>END_EXPAND_RULES<| %.o : $(MATLAB_ROOT)/rtw/c/libsrc/%.cpp @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CPP) -c $(CPPFLAGS) $< %.o : $(MATLAB_ROOT)/simulink/src/%.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) $< %.o : $(MATLAB_ROOT)/simulink/src/%.cpp @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CPP) -c $(CPPFLAGS) $< %.o : $(MATLAB_ROOT)/rtw/c/src/%.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG) $< %.o : $(MATLAB_ROOT)/rtw/c/libsrc/%.c @$(GCC_TEST_CMD) $< $(GCC_TEST_OUT) $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG) $< #------------------------------- Libraries ------------------------------------- |>START_EXPAND_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \ |>START_EXPAND_MODULES<| |>EXPAND_MODULE_NAME<|.o \ |>END_EXPAND_MODULES<| |>EXPAND_LIBRARY_NAME<|.a : $(MAKEFILE) rtw_proj.tmw $(MODULES_|>EXPAND_LIBRARY_NAME<|) @echo "### Creating $@ " ar rs $@ $(MODULES_|>EXPAND_LIBRARY_NAME<|) @echo "### $@ Created " |>END_EXPAND_LIBRARIES<| |>START_PRECOMP_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \ |>START_EXPAND_MODULES<| |>EXPAND_MODULE_NAME<|.o \ |>END_EXPAND_MODULES<| |>EXPAND_LIBRARY_NAME<|.a : $(MAKEFILE) rtw_proj.tmw $(MODULES_|>EXPAND_LIBRARY_NAME<|) @echo "### Creating $@ " ar rs $@ $(MODULES_|>EXPAND_LIBRARY_NAME<|) @echo "### $@ Created " |>END_PRECOMP_LIBRARIES<| #----------------------------- Dependencies ------------------------------------ $(OBJS) : $(MAKEFILE) rtw_proj.tmw $(SHARED_LIB) : $(SHARED_SRC) @echo "### Creating $@ " cd $(SHARED_BIN_DIR); $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) $(notdir $?) ar ruvs $@ $(SHARED_OBJS) @echo "### $@ Created " #--------- Miscellaneous rules to purge, clean and lint (sol2 only) ------------ purge : clean @echo "### Deleting the generated source code for $(MODEL)" @\rm -f $(MODEL).c $(MODEL).h $(MODEL)_types.h $(MODEL)_data.c \ $(MODEL)_private.h $(MODEL).rtw $(MODULES) rtw_proj.tmw $(MAKEFILE) clean : @echo "### Deleting the objects and $(PRODUCT)" @\rm -f $(LINK_OBJS) $(PRODUCT) lint : rtwlib.ln @lint -errchk -errhdr=%user -errtags=yes -F -L. -lrtwlib -x -Xc \ -erroff=$(LINT_ERROFF) \ -D_POSIX_C_SOURCE $(CFLAGS) $(LINT_SRCS) @\rm -f $(LINTOPTSFILE) @echo @echo "### Created lint output only, no executable" @echo rtwlib.ln : $(MAKEFILE) rtw_proj.tmw @echo @echo "### Linting ..." @echo @\rm -f llib-lrtwlib.ln $(LINTOPTSFILE) @echo "-dirout=. -errchk -errhdr=%user " >> $(LINTOPTSFILE) @echo "-errtags -F -ortwlib -x -Xc " >> $(LINTOPTSFILE) @echo "-erroff=$(LINT_ERROFF) " >> $(LINTOPTSFILE) @echo "-D_POSIX_C_SOURCE $(CFLAGS) " >> $(LINTOPTSFILE) @for file in $(MATLAB_ROOT)/rtw/c/libsrc/*.c; do \ echo "$$file " >> $(LINTOPTSFILE); \ done lint -flagsrc=$(LINTOPTSFILE) # EOF: lnx_unix.tmf