
# apps/testing/ltp/ltp/Makefile
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#     http://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

include $(APPDIR)/Make.defs

LTP_UNPACK   = ltp
LTP_URL      = https://github.com/linux-test-project/ltp.git

TESTDIR      = $(LTP_UNPACK)/testcases/open_posix_testsuite

ifneq ($(wildcard $(TESTDIR)),)
ifeq ($(CONFIG_FS_AIO),)
BLACKWORDS  += "aio.h"
BLACKWORDS  += "SIGPOLL"
endif
BLACKWORDS  += "SA_RESTART"
BLACKWORDS  += "pthread_atfork"
BLACKWORDS  += "pthread_condattr_setpshared"
BLACKWORDS  += "pthread_condattr_getpshared"
BLACKWORDS  += "pthread_mutex_getprioceiling"
BLACKWORDS  += "pthread_mutexattr_setprioceiling"
BLACKWORDS  += "pthread_mutexattr_getprioceiling"
BLACKWORDS  += "pthread_getattr_np"
BLACKWORDS  += "pthread_getcpuclockid"
BLACKWORDS  += "pthread_rwlockattr_init"
BLACKWORDS  += "pthread_rwlockattr_destroy"
BLACKWORDS  += "pthread_mutex_getprioceiling"
BLACKWORDS  += "clock_getcpuclockid"
BLACKWORDS  += "shm_unlink"
BLACKWORDS  += "shm_open"
BLACKWORDS  += "mlock"
BLACKWORDS  += "munlock"
BLACKWORDS  += "mlockall"
BLACKWORDS  += "msync"
BLACKWORDS  += "getpgrp"
BLACKWORDS  += "lfind"
BLACKWORDS += "killpg"
BLACKWORDS  += "setpwent"
ifeq ($(CONFIG_PTHREAD_SPINLOCKS),)
BLACKWORDS += "pthread_spin_init"
BLACKWORDS += "pthread_spin_destroy"
BLACKWORDS += "pthread_spin_trylock"
endif

BLACKWORDS  += "affinity.h"
BLACKWORDS  += "langinfo.h"
BLACKWORDS  += "ucontext.h"
BLACKWORDS  += "noatime.h"
BLACKWORDS  += "CLOCK_PROCESS_CPUTIME_ID"
BLACKWORDS  += "CLOCK_THREAD_CPUTIME_ID"
BLACKWORDS  += "fork()"
BLACKWORDS  += "pthread_attr_setscope"
BLACKWORDS  += "RLIMIT_MEMLOCK"
BLACKWORDS  += "PTHREAD_SCOPE_PROCESS"
BLACKWORDS  += "SIGABRT"
BLACKWORDS  += "SIGBUS"
BLACKWORDS  += "SIGFPE"
BLACKWORDS  += "SIGHUP"
BLACKWORDS  += "SIGILL"
BLACKWORDS  += "SIGPROF"
BLACKWORDS  += "SIGSEGV"
BLACKWORDS  += "SIGSYS"
BLACKWORDS  += "SIGTRAP"
BLACKWORDS  += "SIGTSTP"
BLACKWORDS  += "SIGTTIN"
BLACKWORDS  += "SIGTTOU"
BLACKWORDS  += "SIGURG"
BLACKWORDS  += "SIGVTALRM"
BLACKWORDS  += "SIGXCPU"
BLACKWORDS  += "SIGXFSZ"
BLACKWORDS  += "SIGSTKSZ"
BLACKWORDS  += "stack_t"
BLACKWORDS  += "siginterrupt"
BLACKWORDS  += "threads_scenarii.c"
BLACKWORDS  += "PTHREAD_PRIO_PROTECT"
BLACKWORDS  += "pthread_mutex_lock"

BLACKWORDS  += "ILL_[A-Z]"
BLACKWORDS  += "FPE_[A-Z]"
BLACKWORDS  += "BUS_[A-Z]"
BLACKWORDS  += "TRAP_[A-Z]"
BLACKWORDS  += "SEGV_[A-Z]"
BLACKWORDS  += "POLL_[A-Z]"
BLACKWORDS  += "SA_ONSTACK"
BLACKWORDS  += "MINSIGSTKSZ"
BLACKWORDS  += "FPE_FLTINV"

BLACKSRCS += testfrmw.c
BLACKSRCS += 7-3-buildonly.c
BLACKSRCS += 7-4-buildonly.c
BLACKSRCS += 7-5-buildonly.c
BLACKSRCS += 11-1-buildonly.c
BLACKSRCS += 17-1-buildonly.c
BLACKSRCS += 19-1-buildonly.c
BLACKSRCS += 21-1-buildonly.c
BLACKSRCS += 22-31-buildonly.c
BLACKSRCS += 22-32-buildonly.c
BLACKSRCS += 25-1-buildonly.c
BLACKSRCS += 27-1-buildonly.c
BLACKSRCS += 34-1-buildonly.c
BLACKSRCS += 35-1-buildonly.c
BLACKSRCS += 35-2-buildonly.c
BLACKSRCS += 27-2.c
ifeq ($(CONFIG_PTHREAD_SPINLOCKS),)
BLACKSRCS += 3-12-buildonly.c
endif
BLACKSRCS += 35-3-buildonly.c

MAINWORDS    += "main("

LTP_ORIGS_1  := $(shell find $(TESTDIR) -name *.c | head -n 500)
LTP_ORIGS_2  := $(shell find $(TESTDIR) -name *.c | head -n 1000|tail -n +501)
LTP_ORIGS_3  := $(shell find $(TESTDIR) -name *.c | head -n 1500|tail -n +1001)
LTP_ORIGS_4  := $(shell find $(TESTDIR) -name *.c | head -n 2000|tail -n +1501)

$(foreach word, $(BLACKWORDS), $(eval BLACKLIST+=$(shell grep -lr $(word) $(LTP_ORIGS_1))))
$(foreach src, $(BLACKSRCS), $(eval BLACKLIST+=$(filter %$(src),$(LTP_ORIGS_1))))

$(foreach word, $(BLACKWORDS), $(eval BLACKLIST+=$(shell grep -lr $(word) $(LTP_ORIGS_2))))
$(foreach src, $(BLACKSRCS), $(eval BLACKLIST+=$(filter %$(src),$(LTP_ORIGS_2))))

$(foreach word, $(BLACKWORDS), $(eval BLACKLIST+=$(shell grep -lr $(word) $(LTP_ORIGS_3))))
$(foreach src, $(BLACKSRCS), $(eval BLACKLIST+=$(filter %$(src),$(LTP_ORIGS_3))))

$(foreach word, $(BLACKWORDS), $(eval BLACKLIST+=$(shell grep -lr $(word) $(LTP_ORIGS_4))))
$(foreach src, $(BLACKSRCS), $(eval BLACKLIST+=$(filter %$(src),$(LTP_ORIGS_4))))

LTP_ORIGS_1  := $(filter-out $(BLACKLIST), $(LTP_ORIGS_1))
LTP_ORIGS_2  := $(filter-out $(BLACKLIST), $(LTP_ORIGS_2))
LTP_ORIGS_3  := $(filter-out $(BLACKLIST), $(LTP_ORIGS_3))
LTP_ORIGS_4  := $(filter-out $(BLACKLIST), $(LTP_ORIGS_4))

$(foreach word, $(MAINWORDS), $(eval LTP_MAINCSRCS_1+=$(shell grep -lr $(word) $(LTP_ORIGS_1))))
$(foreach word, $(MAINWORDS), $(eval LTP_MAINCSRCS_2+=$(shell grep -lr $(word) $(LTP_ORIGS_2))))
$(foreach word, $(MAINWORDS), $(eval LTP_MAINCSRCS_3+=$(shell grep -lr $(word) $(LTP_ORIGS_3))))
$(foreach word, $(MAINWORDS), $(eval LTP_MAINCSRCS_4+=$(shell grep -lr $(word) $(LTP_ORIGS_4))))

LTP_CSRCS_1  := $(filter-out $(LTP_MAINCSRCS_1), $(LTP_ORIGS_1))
LTP_CSRCS_2  := $(filter-out $(LTP_MAINCSRCS_2), $(LTP_ORIGS_2))
LTP_CSRCS_3  := $(filter-out $(LTP_MAINCSRCS_3), $(LTP_ORIGS_3))
LTP_CSRCS_4  := $(filter-out $(LTP_MAINCSRCS_4), $(LTP_ORIGS_4))


PROGNAME     := $(basename $(shell echo $(LTP_MAINCSRCS_1) | xargs -n 1 | awk -F "[/]" '{print "ltp_"$$(NF-2)"_"$$(NF-1)"_"$$(NF)}' | sed s/-/_/g))
PROGNAME     += $(basename $(shell echo $(LTP_MAINCSRCS_2) | xargs -n 1 | awk -F "[/]" '{print "ltp_"$$(NF-2)"_"$$(NF-1)"_"$$(NF)}' | sed s/-/_/g))
PROGNAME     += $(basename $(shell echo $(LTP_MAINCSRCS_3) | xargs -n 1 | awk -F "[/]" '{print "ltp_"$$(NF-2)"_"$$(NF-1)"_"$$(NF)}' | sed s/-/_/g))
PROGNAME     += $(basename $(shell echo $(LTP_MAINCSRCS_4) | xargs -n 1 | awk -F "[/]" '{print "ltp_"$$(NF-2)"_"$$(NF-1)"_"$$(NF)}' | sed s/-/_/g))
MAINSRC       = $(LTP_MAINCSRCS_1) $(LTP_MAINCSRCS_2) $(LTP_MAINCSRCS_3) $(LTP_MAINCSRCS_4)
PRIORITY      = SCHED_PRIORITY_DEFAULT
STACKSIZE     = $(CONFIG_DEFAULT_TASK_STACKSIZE)
MODULE        = $(CONFIG_TESTING_LTP)

CSRCS        := $(LTP_CSRCS_1) $(LTP_CSRCS_2) $(LTP_CSRCS_3) $(LTP_CSRCS_4)
CFLAGS       += -I$(CURDIR)
CFLAGS       += -I$(TESTDIR)/include
endif

# Relax warning checks to avoid expected compile errors:
CFLAGS += -Wno-strict-prototypes -Wno-return-type -Wno-format -Wno-uninitialized
CFLAGS += -Wno-unused-variable -Wno-unused-function -Wno-unused-but-set-variable -Wno-unused-value

# Should be removed if possible in the future
CFLAGS += -Wno-incompatible-pointer-types -Wno-overflow -Wno-int-to-pointer-cast

$(LTP_UNPACK):
	$(Q) echo "git clone $(LTP_URL)"
	$(Q) git clone $(LTP_URL)
	$(Q) git -C $(LTP_UNPACK) am < 0001-Fix-static-struct-warning.patch
	$(Q) git -C $(LTP_UNPACK) am < 0002-Use-ifdef-instead-of-if-for-__linux__.patch

# Download and unpack tarball if no git repo found
ifeq ($(wildcard $(LTP_UNPACK)/.git),)
context:: $(LTP_UNPACK)

distclean::
	$(Q) rm -rf $(LTP_UNPACK)
endif

include $(APPDIR)/Application.mk
