184 lines
4.7 KiB
Makefile
184 lines
4.7 KiB
Makefile
##############################################################################
|
|
# Copyright: Copyright CODESYS Development GmbH
|
|
# Program: Extension API for the Linux SL products
|
|
##############################################################################
|
|
|
|
ifeq ($(dir $(lastword $(MAKEFILE_LIST))), ./)
|
|
#
|
|
# MAKEFILE is used wrong! Never call it from this folder directly
|
|
#
|
|
.PHONY:help
|
|
help:
|
|
@echo "**********************"
|
|
@echo "Dont work inside this folder! Please go to your library folder and call this makefile e.g.:"
|
|
@echo "make -f ../sdk/makefile newproject"
|
|
@echo
|
|
@echo "**********************"
|
|
|
|
.PHONY:all
|
|
all: help
|
|
|
|
.PHONY:newproject
|
|
newproject: help
|
|
|
|
.PHONY:makefile
|
|
makefile: help
|
|
|
|
else
|
|
#
|
|
# NORMAL RULES
|
|
#
|
|
|
|
# get some info from generated files
|
|
ITFM4 = $(wildcard *Itf.m4)
|
|
CSRC = $(wildcard *.c)
|
|
CMPBASENAME=$(CSRC:.c=)
|
|
|
|
# set some variables
|
|
OUTDIR=./out
|
|
ITF = $(basename ${ITFM4})
|
|
TEMPLATEDEP = $(SDKDIR)/m4/TemplateDep.m4
|
|
DEP = ${CMPBASENAME}Dep
|
|
|
|
|
|
# set name of shared object
|
|
SONAME= lib${CMPBASENAME}.so
|
|
|
|
# set sources of component
|
|
SRC += ${CSRC} CmpFrame.c
|
|
|
|
# objects: all sources
|
|
OBJS = $(addprefix ${OUTDIR}/,$(SRC:.c=.o))
|
|
|
|
# set default includes
|
|
INCLUDES += -I${SDKDIR}/include/ -I${OUTDIR}/ -I.
|
|
CFLAGS += -fPIC -g -O0 -Wall -Wextra -Wno-unused
|
|
CFLAGS += -DDEP_H=\"${DEP}.h\"
|
|
|
|
# set a vendorID
|
|
CMPVENDORID=0xFFFF
|
|
|
|
vpath %.m4 ${SDKDIR}/cmpstub/
|
|
vpath %.c ${SDKDIR}/src/
|
|
|
|
.PHONY:help
|
|
help:
|
|
@echo "**********************"
|
|
@echo "help / usage / available make targets:"
|
|
@echo "-all : just do everything needed"
|
|
@echo "-clean : cleanup all generated files"
|
|
@echo "-newproject : create a new project"
|
|
@echo "-showenv : show intern variables (for debugging)"
|
|
@echo "**********************"
|
|
|
|
|
|
.PHONY:newproject
|
|
newproject: makefile
|
|
|
|
.PHONY:all
|
|
all: ${OUTDIR}/$(SONAME)
|
|
|
|
SDK_BASE=$(dir $(lastword $(MAKEFILE_LIST)))
|
|
|
|
.PHONY:showenv
|
|
showenv:
|
|
@echo "**********************"
|
|
@echo "ITFM4: ${ITFM4}"
|
|
@echo "CSRC: ${CSRC}"
|
|
@echo "SONAME: ${SONAME}"
|
|
@echo "ITF: ${ITF}"
|
|
@echo "DEP: ${DEP}"
|
|
@echo "OBJS: ${OBJS}"
|
|
@echo "CC: $(CC)"
|
|
@echo "CFLAGS: ${CFLAGS}"
|
|
@echo "SDKDIR: ${SDKDIR}"
|
|
@echo "CMPBASENAME: ${CMPBASENAME}"
|
|
@echo "MAKEFILE_LIST: $(MAKEFILE_LIST)"
|
|
@echo "**********************"
|
|
@echo ""
|
|
|
|
# check if there are whitespaces in the SDK BASE DIR
|
|
# this causes horrible things in make, so we detect/avoid it directly at creating a new project
|
|
ifeq (1,$(words $(MAKEFILE_LIST)))
|
|
makefile:
|
|
@echo "**********************"
|
|
@echo "creating makefile for your project "
|
|
cp ${SDK_BASE}/makefile_template $@
|
|
@echo "# include of the SDK makefiles" >> $@
|
|
@echo "SDKDIR="$(abspath ${SDK_BASE}) >> $@
|
|
@echo 'include $${SDKDIR}/makefile' >> $@
|
|
@echo "" >> $@
|
|
@echo "now check your makefile here"
|
|
@echo "**********************"
|
|
@echo ""
|
|
|
|
else
|
|
makefile:
|
|
@echo "**********************"
|
|
@echo "creating makefile for your project FAILED:"
|
|
@echo "there are whitespaces in the SDK path"
|
|
@echo "this does not work with 'make'!"
|
|
@echo "Please put your SDK to a path without whitespaces"
|
|
@echo "**********************"
|
|
@echo ""
|
|
|
|
endif
|
|
|
|
${OUTDIR}/%.o: %.c
|
|
@echo "**********************"
|
|
@echo "compile: $@ from $<"
|
|
@mkdir -p ${OUTDIR}
|
|
$(CC) -c $(CFLAGS) $(INCLUDES) -o $@ $<
|
|
@echo "**********************"
|
|
@echo ""
|
|
|
|
${OUTDIR}/${SONAME}: ${OUTDIR}/$(DEP).h ${OUTDIR}/$(ITF).h $(OBJS)
|
|
@echo "**********************"
|
|
@echo "link: $@"
|
|
@mkdir -p ${OUTDIR}
|
|
$(CC) $(LDFLAGS) -shared $(OBJS) -Wl,-soname,$(SONAME) -o $@ $(LDLIBS)
|
|
@echo "**********************"
|
|
@echo ""
|
|
|
|
${OUTDIR}/$(DEP).m4:
|
|
@echo "**********************"
|
|
@echo "create $@ from template"
|
|
@mkdir -p ${OUTDIR}
|
|
echo 'SET_COMPONENT_NAME(`'${CMPBASENAME}"')" > $@
|
|
echo 'COMPONENT_VERSION(`'${CMPVERSION}"')" >> $@
|
|
echo 'COMPONENT_VENDORID(`'${CMPVENDORID}"')" >> $@
|
|
echo "#define CMPID_${CMPBASENAME} ${CMPID}" >> $@
|
|
echo "IMPLEMENT_ITF("'`'"${CMPBASENAME}Itf.m4')" >> $@
|
|
@echo "**********************"
|
|
@echo ""
|
|
|
|
${OUTDIR}/$(DEP).h: ${OUTDIR}/$(DEP).m4 $(ITF).m4
|
|
@echo "**********************"
|
|
@echo "build dependency header: $@ from $<"
|
|
@mkdir -p ${OUTDIR}
|
|
$(DOS2UNIX) $<
|
|
$(M4) -I$(SDKDIR)/m4 -I. Implementation.m4 - < $< > $@
|
|
@echo "**********************"
|
|
@echo ""
|
|
|
|
${OUTDIR}/$(ITF).h: $(ITF).m4
|
|
@echo "**********************"
|
|
@echo "build interface header: $@ from $<"
|
|
@sed -n '/DEF_API/ !d; /_cext/ ! { s/^/ERROR: This functionname does not contain _cext (this is mandatory, see help for details):\n/p;q 1}' $<
|
|
@mkdir -p ${OUTDIR}
|
|
$(DOS2UNIX) $<
|
|
$(M4) -I$(SDKDIR)/m4 Exports.m4 - < $< > $@
|
|
@echo "**********************"
|
|
@echo ""
|
|
|
|
.PHONY:clean
|
|
clean:
|
|
@echo ""
|
|
@echo "**********************"
|
|
@echo "clean up"
|
|
rm -rf ${OUTDIR};
|
|
@echo "**********************"
|
|
@echo ""
|
|
|
|
endif
|