Xillin Vitis `*.c: Invalid argument`, `fatal error: xparameters.h` 문제 해결책

Vitis 에서 Custom IP를 사용할 경우 빌드시 다음과 같은 오류가 발생하는 것에 대한 해결책을 제시합니다. 개발환경은 Windows 10 LTSC, Vivado v2022.02 (64-bit), Vitis v2022.2.0 (64-bit) 입니다.

참고로 리눅스에서는 해당 이슈가 없고, 윈도우에서만 발생하는걸로 확인됩니다.

cc1.exe: fatal error: *.c: Invalid argument
compilation terminated.
make[2]: *** [Makefile:18: libs] Error 1
make[1]: *** [Makefile:46: ps7_cortexa9_0/libsrc/axi4_v1_0/src/make.libs] Error 2
make: *** [Makefile:18: all] Error 2

또는 다음과 같이 특정 파일을 찾을 수 없는 오류가 발생하는 경우가 있을 수 있습니다.

fatal error: xparameters.h: No such file or directory

필자의 경우 Vivado 에서 Custom IP를 제작한 후 이에 대한 HDL Wrapper를 생성, 이후 하드웨어를 Export 하여 Vitis에서 불러와 사용하는 과정에서 발단된 이슈입니다. 여기서 Custom IP는 AMBA 프로토콜을 사용하는 AXI4 IP 입니다.

조사해보니 Xilinx 포럼에서 Vitis v2020 부터 v2021 버전에도 해당 버그가 보고된 바 있습니다. 현재 사용중인 Vitis v2022 버전에도 아직 해당 버그가 존재하는 것으로 보이는데, 아직 버그 픽스가 이뤄지지 않은 것으로 생각됩니다.

다음은 문제가 발생하는 Makefile을 보여주고 있습니다.

COMPILER=
ARCHIVER=
CP=cp
COMPILER_FLAGS=
EXTRA_COMPILER_FLAGS=
LIB=libxil.a

RELEASEDIR=../../../lib
INCLUDEDIR=../../../include
INCLUDES=-I./. -I${INCLUDEDIR}

INCLUDEFILES=*.h
LIBSOURCES=*.c
OUTS = *.o

libs:
	echo "Compiling axi4..."
	$(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES)
	$(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS}
	make clean

include:
	${CP} $(INCLUDEFILES) $(INCLUDEDIR)

clean:
	rm -rf ${OUTS}

여기서 해결책은 간단합니다. 해당 IP의 Makefile을 열고, 오류를 야기하는 부분을 수정하면 됩니다. 다음과 같이 검색 기능으로 해당 키워드를 찾습니다.

앞서 오류 문구에서 확인했듯이, 잘못된 문법에 의해 문제가 발생한 것이므로, 찾은 파일에서 INCLUDEFILES=*.h 부분과 LIBSOURCES=*.c 등 문법이 맞지 않는 부분을 wildcard 등으로 수정합니다.

다음은 앞서 문제가 발생한 Makefile 을 수정한 코드를 보여주고 있습니다.

COMPILER=
ARCHIVER=
CP=cp
COMPILER_FLAGS=
EXTRA_COMPILER_FLAGS=
LIB=libxil.a

RELEASEDIR=../../../lib
INCLUDEDIR=../../../include
INCLUDES=-I./. -I${INCLUDEDIR}

INCLUDEFILES=$(wildcard *.h)
LIBSOURCES=$(wildcard *.c *.cpp)
OUTS = *.o
OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c *.cpp)))

libs:
	echo "Compiling axi4..."
	$(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES)
	$(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} ${ASSEMBLY_OBJECTS}
	make clean

include:
	${CP} $(INCLUDEFILES) $(INCLUDEDIR)
	

clean:
	rm -rf ${OBJECTS} ${ASSEMBLY_OBJECTS}

관련된 Makefile 을 수정한 후 다시 빌드를 시도하면 정상적으로 빌드가 성공적으로 끝나는 것을 확인 할 수 있습니다.

Vivado 에서 Export 한 하드웨어를 Vitis로 불러올때마다 버그 때문에 이 짓을 해야할 생각하니 벌써부터 환장할 노릇인데 이래서 제가 암드(참고로 암드가 Xilinx를 먹음)를 안쓰고 인.. 그만 알아보겠습니다

Reference:

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.