Skip to content

Commit f1ab71b

Browse files
committed
build: add support for building .cu files via nvcc
Original work by Yogender Gupta <[email protected]>
1 parent 6a37405 commit f1ab71b

File tree

5 files changed

+75
-4
lines changed

5 files changed

+75
-4
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
*.swp
2020
*.ver
2121
*.version
22+
*.ptx
23+
*.ptx.c
2224
*_g
2325
\#*
2426
.\#*

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ vpath %.asm $(SRC_PATH)
1111
vpath %.rc $(SRC_PATH)
1212
vpath %.v $(SRC_PATH)
1313
vpath %.texi $(SRC_PATH)
14+
vpath %.cu $(SRC_PATH)
15+
vpath %.ptx $(SRC_PATH)
1416
vpath %/fate_config.sh.template $(SRC_PATH)
1517

1618
AVPROGS-$(CONFIG_FFMPEG) += ffmpeg

compat/cuda/ptx2c.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
2+
#
3+
# Permission is hereby granted, free of charge, to any person obtaining a
4+
# copy of this software and associated documentation files (the "Software"),
5+
# to deal in the Software without restriction, including without limitation
6+
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
7+
# and/or sell copies of the Software, and to permit persons to whom the
8+
# Software is furnished to do so, subject to the following conditions:
9+
#
10+
# The above copyright notice and this permission notice shall be included in
11+
# all copies or substantial portions of the Software.
12+
#
13+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16+
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
19+
# DEALINGS IN THE SOFTWARE.
20+
21+
set -e
22+
23+
OUT="$1"
24+
IN="$2"
25+
NAME="$(basename "$IN")"
26+
NAME="${NAME/.ptx/}"
27+
28+
echo -n "const char ${NAME}_ptx[] = \\" > "$OUT"
29+
while read LINE
30+
do
31+
echo -ne "\n\t\"$LINE\\\n\"" >> "$OUT"
32+
done < "$IN"
33+
echo ";" >> "$OUT"
34+
35+
exit 0
36+

configure

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ Toolchain options:
338338
--cxx=CXX use C compiler CXX [$cxx_default]
339339
--objcc=OCC use ObjC compiler OCC [$cc_default]
340340
--dep-cc=DEPCC use dependency generator DEPCC [$cc_default]
341+
--nvcc=NVCC use Nvidia CUDA compiler NVCC [$nvcc_default]
341342
--ld=LD use linker LD [$ld_default]
342343
--pkg-config=PKGCONFIG use pkg-config tool PKGCONFIG [$pkg_config_default]
343344
--pkg-config-flags=FLAGS pass additional flags to pkgconf []
@@ -359,6 +360,7 @@ Toolchain options:
359360
--extra-libs=ELIBS add ELIBS [$ELIBS]
360361
--extra-version=STRING version string suffix []
361362
--optflags=OPTFLAGS override optimization-related compiler flags
363+
--nvccflags=NVCCFLAGS override nvcc flags [$nvccflags_default]
362364
--build-suffix=SUFFIX library name suffix []
363365
--enable-pic build position-independent code
364366
--enable-thumb compile for Thumb instruction set
@@ -2221,6 +2223,7 @@ CMDLINE_SET="
22212223
malloc_prefix
22222224
nm
22232225
optflags
2226+
nvccflags
22242227
pkg_config
22252228
pkg_config_flags
22262229
progs_suffix
@@ -2719,6 +2722,7 @@ vaapi_encode_deps="vaapi"
27192722

27202723
hwupload_cuda_filter_deps="cuda"
27212724
scale_npp_filter_deps="cuda_sdk libnpp"
2725+
scale_cuda_filter_deps="cuda_sdk"
27222726

27232727
nvenc_deps="cuda"
27242728
nvenc_deps_any="dlopen LoadLibrary"
@@ -3261,6 +3265,8 @@ strip_default="strip"
32613265
version_script='--version-script'
32623266
yasmexe_default="yasm"
32633267
windres_default="windres"
3268+
nvcc_default="nvcc"
3269+
nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2"
32643270

32653271
# OS
32663272
target_os_default=$(tolower $(uname -s))
@@ -3334,6 +3340,8 @@ HOSTCC_C='-c'
33343340
HOSTCC_E='-E -o $@'
33353341
HOSTCC_O='-o $@'
33363342
HOSTLD_O='-o $@'
3343+
NVCC_C='-c'
3344+
NVCC_O='-o $@'
33373345

33383346
host_extralibs='-lm'
33393347
host_cflags_filter=echo
@@ -3721,7 +3729,7 @@ windres_default="${cross_prefix}${windres_default}"
37213729
sysinclude_default="${sysroot}/usr/include"
37223730

37233731
set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \
3724-
target_exec target_os yasmexe
3732+
target_exec target_os yasmexe nvcc
37253733
enabled cross_compile || host_cc_default=$cc
37263734
set_default host_cc
37273735

@@ -6241,6 +6249,16 @@ if [ -z "$optflags" ]; then
62416249
fi
62426250
fi
62436251

6252+
if [ -z "$nvccflags" ]; then
6253+
nvccflags=$nvccflags_default
6254+
fi
6255+
6256+
if enabled x86_64 || enabled ppc64 || enabled aarch64; then
6257+
nvccflags="$nvccflags -m64"
6258+
else
6259+
nvccflags="$nvccflags -m32"
6260+
fi
6261+
62446262
check_optflags(){
62456263
check_cflags "$@"
62466264
enabled lto && check_ldflags "$@"
@@ -6704,13 +6722,15 @@ ARFLAGS=$arflags
67046722
AR_O=$ar_o
67056723
RANLIB=$ranlib
67066724
STRIP=$strip
6725+
NVCC=$nvcc
67076726
CP=cp -p
67086727
LN_S=$ln_s
67096728
CPPFLAGS=$CPPFLAGS
67106729
CFLAGS=$CFLAGS
67116730
CXXFLAGS=$CXXFLAGS
67126731
OBJCFLAGS=$OBJCFLAGS
67136732
ASFLAGS=$ASFLAGS
6733+
NVCCFLAGS=$nvccflags
67146734
AS_C=$AS_C
67156735
AS_O=$AS_O
67166736
OBJCC_C=$OBJCC_C
@@ -6721,6 +6741,8 @@ CC_E=$CC_E
67216741
CC_O=$CC_O
67226742
CXX_C=$CXX_C
67236743
CXX_O=$CXX_O
6744+
NVCC_C=$NVCC_C
6745+
NVCC_O=$NVCC_O
67246746
LD_O=$LD_O
67256747
LD_LIB=$LD_LIB
67266748
LD_PATH=$LD_PATH

ffbuild/common.mak

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ ifndef SUBDIR
1515
ifndef V
1616
Q = @
1717
ECHO = printf "$(1)\t%s\n" $(2)
18-
BRIEF = CC CXX OBJCC HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES
18+
BRIEF = CC CXX OBJCC HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES NVCC
1919
SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM
2020

2121
MSG = $@
@@ -38,6 +38,7 @@ OBJCCFLAGS = $(CPPFLAGS) $(CFLAGS) $(OBJCFLAGS)
3838
ASFLAGS := $(CPPFLAGS) $(ASFLAGS)
3939
CXXFLAGS := $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS)
4040
YASMFLAGS += $(IFLAGS:%=%/) -Pconfig.asm
41+
NVCCFLAGS += -ptx
4142

4243
HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
4344
LDFLAGS := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
@@ -52,6 +53,7 @@ COMPILE_CXX = $(call COMPILE,CXX)
5253
COMPILE_S = $(call COMPILE,AS)
5354
COMPILE_M = $(call COMPILE,OBJCC)
5455
COMPILE_HOSTC = $(call COMPILE,HOSTCC)
56+
COMPILE_NVCC = $(call COMPILE,NVCC)
5557

5658
%.o: %.c
5759
$(COMPILE_C)
@@ -89,6 +91,12 @@ COMPILE_HOSTC = $(call COMPILE,HOSTCC)
8991
%.h.c:
9092
$(Q)echo '#include "$*.h"' >$@
9193

94+
%.ptx: %.cu
95+
$(COMPILE_NVCC)
96+
97+
%.ptx.c: %.ptx
98+
$(Q)sh $(SRC_PATH)/compat/cuda/ptx2c.sh $@ $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<)
99+
92100
%.c %.h %.pc %.ver %.version: TAG = GEN
93101

94102
# Dummy rule to stop make trying to rebuild removed or renamed headers
@@ -133,9 +141,10 @@ ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)
133141
SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-)
134142
SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%)
135143
HOBJS = $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o))
144+
PTXOBJS = $(filter %.ptx.o,$(OBJS))
136145
$(HOBJS): CCFLAGS += $(CFLAGS_HEADERS)
137146
checkheaders: $(HOBJS)
138-
.SECONDARY: $(HOBJS:.o=.c)
147+
.SECONDARY: $(HOBJS:.o=.c) $(PTXOBJS:.o=.c) $(PTXOBJS:.o=)
139148

140149
alltools: $(TOOLS)
141150

@@ -154,7 +163,7 @@ $(TOOLOBJS): | tools
154163

155164
OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS))
156165

157-
CLEANSUFFIXES = *.d *.o *~ *.h.c *.gcda *.gcno *.map *.ver *.version *.ho *$(DEFAULT_YASMD).asm
166+
CLEANSUFFIXES = *.d *.o *~ *.h.c *.gcda *.gcno *.map *.ver *.version *.ho *$(DEFAULT_YASMD).asm *.ptx *.ptx.c
158167
DISTCLEANSUFFIXES = *.pc
159168
LIBSUFFIXES = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
160169

0 commit comments

Comments
 (0)