Skip to content

Commit 9a60ef8

Browse files
authored
Merge pull request #34 from jaredmales/jrmales/fix-nvcc-flag-forwards
more robust package config flag parsing
2 parents 840237a + 022fb97 commit 9a60ef8

1 file changed

Lines changed: 62 additions & 10 deletions

File tree

CMakeLists.txt

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,19 @@ macro(linklibdirs_from_list LINK_LIBDIRS LIBDIR_LIST)
7474

7575
endmacro()
7676

77+
## macro include_dirs_to_cflags
78+
# Turn list of include directories into a -I delimited string for compilation
79+
#
80+
# First: INCLUDE_CFLAGS: output string
81+
# Second: INCLUDE_DIRS_LIST: input list to process
82+
#
83+
macro(include_dirs_to_cflags INCLUDE_CFLAGS INCLUDE_DIRS_LIST)
84+
85+
string(REPLACE ";" " -I" ${INCLUDE_CFLAGS} "${${INCLUDE_DIRS_LIST}}")
86+
set(${INCLUDE_CFLAGS} "-I${${INCLUDE_CFLAGS}}")
87+
88+
endmacro()
89+
7790
## Extract the library name from a path
7891
# e.g. /path/to/libname.so produces name
7992
#
@@ -108,6 +121,34 @@ macro(liblist_strip_namespace LIBRARY_LIST prefix)
108121

109122
endmacro()
110123

124+
## macro liblist_strip_paths
125+
# Strip path and library filename decorations from a list.
126+
# E.g. /path/to/libname.so becomes name
127+
#
128+
# LIBRARY_LIST: input/output list of libraries
129+
#
130+
macro(liblist_strip_paths LIBRARY_LIST)
131+
132+
set(LIBLIST_STRIP_PATHS_OUT "")
133+
134+
foreach(lib ${${LIBRARY_LIST}})
135+
136+
cmake_path(HAS_PARENT_PATH lib LIB_IS_PATH)
137+
138+
if(LIB_IS_PATH)
139+
get_filename_component(lib ${lib} NAME)
140+
string(REGEX REPLACE "^lib" "" lib "${lib}")
141+
string(REGEX REPLACE "(\\.so(\\..*)?|\\.a)$" "" lib "${lib}")
142+
endif()
143+
144+
list(APPEND LIBLIST_STRIP_PATHS_OUT "${lib}")
145+
146+
endforeach()
147+
148+
set(${LIBRARY_LIST} "${LIBLIST_STRIP_PATHS_OUT}")
149+
150+
endmacro()
151+
111152
## Function linklibs_from_list
112153
# Turn list of library names into a -l delimited string for linking
113154
# If the library is specified with a full path we don't mess with it
@@ -117,6 +158,8 @@ endmacro()
117158
#
118159
macro(linklibs_from_list LINK_LIBRARIES LIBRARY_LIST)
119160

161+
set(LINKLIBS_FROM_LIST_OUT "")
162+
120163
foreach(lib ${${LIBRARY_LIST}})
121164

122165
cmake_path(HAS_PARENT_PATH lib LIB_IS_PATH)
@@ -127,13 +170,13 @@ macro(linklibs_from_list LINK_LIBRARIES LIBRARY_LIST)
127170
string(PREPEND lib "-l")
128171
endif()
129172

130-
set(LIBRARY_LIST_OUT "${LIBRARY_LIST_OUT} ${lib}")
173+
set(LINKLIBS_FROM_LIST_OUT "${LINKLIBS_FROM_LIST_OUT} ${lib}")
131174

132175
endforeach()
133176

134177
#message("LIBRARY_LIST_OUT: ${LIBRARY_LIST_OUT}")
135178

136-
set(${LINK_LIBRARIES} "${LIBRARY_LIST_OUT}")
179+
set(${LINK_LIBRARIES} "${LINKLIBS_FROM_LIST_OUT}")
137180

138181
#message("LINK_LIBRARIES: ${${LINK_LIBRARIES}}")
139182

@@ -433,6 +476,7 @@ linklibdirs_from_list(Boost_LIBDIRS_FLAGS Boost_LIBRARY_DIRS)
433476
set(MXLIB_PC_LDFLAGS "${MXLIB_PC_LDFLAGS} ${Boost_LIBDIRS_FLAGS}")
434477

435478
liblist_strip_namespace(Boost_LIBRARIES "boost_")
479+
liblist_strip_paths(Boost_LIBRARIES)
436480
linklibs_from_list(Boost_LIBRARIES_FLAGS Boost_LIBRARIES)
437481
set(MXLIB_PC_LDFLAGS "${MXLIB_PC_LDFLAGS} ${Boost_LIBRARIES_FLAGS}")
438482

@@ -451,7 +495,8 @@ add_compile_definitions(EIGEN_DONT_PARALLELIZE)
451495

452496
set(MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS} -I${EIGEN3_INCLUDE_DIRS} ${EIGEN3_CFLAGS} ${EIGEN3_CFLAGS_OTHER}")
453497

454-
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} -I${EIGEN3_INCLUDE_DIRS} ${EIGEN3_CFLAGS} ${EIGEN3_CFLAGS_OTHER} -DEIGEN_DONT_PARALLELIZE")
498+
include_dirs_to_cflags(EIGEN3_INCLUDE_CFLAGS EIGEN3_INCLUDE_DIRS)
499+
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} ${EIGEN3_INCLUDE_CFLAGS} ${EIGEN3_CFLAGS} ${EIGEN3_CFLAGS_OTHER} -DEIGEN_DONT_PARALLELIZE")
455500
set(MXLIB_PC_LDFLAGS "${MXLIB_PC_LDFLAGS} ${EIGEN3_LDFLAGS}")
456501

457502
############################################
@@ -467,7 +512,8 @@ if(${MXLIB_USE_FFT_FROM} STREQUAL "fftw")
467512
target_link_libraries(mxlib-static PUBLIC PkgConfig::FFTW3)
468513

469514
set(MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS} ${FFTW3_CFLAGS} ${FFTW3_CFLAGS_OTHER}")
470-
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} -I${FFTW3_INCLUDE_DIRS}")
515+
include_dirs_to_cflags(FFTW3_INCLUDE_CFLAGS FFTW3_INCLUDE_DIRS)
516+
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} ${FFTW3_INCLUDE_CFLAGS}")
471517

472518
linklibdirs_from_list(FFTW3_LIBDIRS_FLAGS FFTW3_LIBRARY_DIRS)
473519
set(MXLIB_PC_LDFLAGS "${MXLIB_PC_LDFLAGS} ${FFTW3_LIBDIRS_FLAGS}")
@@ -483,7 +529,8 @@ if(${MXLIB_USE_FFT_FROM} STREQUAL "fftw")
483529
target_link_libraries(mxlib-static PUBLIC PkgConfig::FFTW3F)
484530

485531
set(MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS} ${FFTW3F_CFLAGS} ${FFTW3F_CFLAGS_OTHER}")
486-
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} -I${FFTW3F_INCLUDE_DIRS}")
532+
include_dirs_to_cflags(FFTW3F_INCLUDE_CFLAGS FFTW3F_INCLUDE_DIRS)
533+
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} ${FFTW3F_INCLUDE_CFLAGS}")
487534

488535
linklibdirs_from_list(FFTW3F_LIBDIRS_FLAGS FFTW3F_LIBRARY_DIRS)
489536
set(MXLIB_PC_LDFLAGS "${MXLIB_PC_LDFLAGS} ${FFTW3F_LIBDIRS_FLAGS}")
@@ -499,7 +546,8 @@ if(${MXLIB_USE_FFT_FROM} STREQUAL "fftw")
499546
target_link_libraries(mxlib-static PUBLIC PkgConfig::FFTW3L)
500547

501548
set(MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS} ${FFTW3L_CFLAGS} ${FFTW3L_CFLAGS_OTHER}")
502-
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} -I${FFTW3L_INCLUDE_DIRS}")
549+
include_dirs_to_cflags(FFTW3L_INCLUDE_CFLAGS FFTW3L_INCLUDE_DIRS)
550+
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} ${FFTW3L_INCLUDE_CFLAGS}")
503551

504552
linklibdirs_from_list(FFTW3L_LIBDIRS_FLAGS FFTW3L_LIBRARY_DIRS)
505553
set(MXLIB_PC_LDFLAGS "${MXLIB_PC_LDFLAGS} ${FFTWL_LIBDIRS_FLAGS}")
@@ -518,7 +566,8 @@ if(${MXLIB_USE_FFT_FROM} STREQUAL "fftw")
518566
target_link_libraries(mxlib-static PUBLIC PkgConfig::FFTW3Q)
519567

520568
set(MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS} ${FFTW3Q_CFLAGS} ${FFTW3Q_CFLAGS_OTHER}")
521-
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} -DHAS_QUAD -I${FFTW3Q_INCLUDE_DIRS}")
569+
include_dirs_to_cflags(FFTW3Q_INCLUDE_CFLAGS FFTW3Q_INCLUDE_DIRS)
570+
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} -DHAS_QUAD ${FFTW3Q_INCLUDE_CFLAGS}")
522571

523572
linklibdirs_from_list(FFTW3Q_LIBDIRS_FLAGS FFTW3Q_LIBRARY_DIRS)
524573
set(MXLIB_PC_LDFLAGS "${MXLIB_PC_LDFLAGS} ${FFTW3Q_LIBDIRS_FLAGS}")
@@ -562,7 +611,8 @@ if(${MXLIB_USE_BLAS_FROM} STREQUAL "mkl")
562611

563612
set(MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS} ${MXLIB_MKL_CFLAGS}")
564613

565-
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} -I${MXLIB_MKL_INCLUDE_DIRECTORY} ${MXLIB_MKL_DEFINITIONS} ${MXLIB_MKL_CFLAGS}" )
614+
include_dirs_to_cflags(MXLIB_MKL_INCLUDE_CFLAGS MXLIB_MKL_INCLUDE_DIRECTORY)
615+
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} ${MXLIB_MKL_INCLUDE_CFLAGS} ${MXLIB_MKL_DEFINITIONS} ${MXLIB_MKL_CFLAGS}" )
566616

567617
linklibdirs_from_list(MXLIB_MKL_LIBDIRS_FLAGS MXLIB_MKL_LIBDIRS)
568618
linklibs_from_list(MXLIB_MKL_LIBS_FLAGS MXLIB_MKL_LIBS)
@@ -726,7 +776,7 @@ if(MXLIB_USE_CUDA)
726776

727777
libname_from_path(CUDA_cusolver_LIBNAME CUDA_cusolver_LIBRARY)
728778

729-
set(MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS} ${MXLIB_CXXVERSION} ${MXLIB_CXXFLAGS} ${MXLIB_OPTIMIZE} ${MXLIB_DEFINES}")
779+
set(MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS} ${MXLIB_CXXFLAGS} ${MXLIB_OPTIMIZE} -D${MXLIB_DEFINES}")
730780

731781
set(MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS} -DEIGEN_NO_CUDA -DMXLIB_CUDA -I${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}")
732782

@@ -737,6 +787,7 @@ if(MXLIB_USE_CUDA)
737787
#Strip the includes, extra spaces, and prepend -Xcompiler
738788
string(REGEX REPLACE "-I[^ ]*" "" MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS}")
739789
string(REGEX REPLACE "[ ]+" " " MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS}")
790+
string(STRIP "${MXLIB_NVCCXX_FLAGS}" MXLIB_NVCCXX_FLAGS)
740791
string(REPLACE " " " -Xcompiler=" MXLIB_NVCCXX_FLAGS "${MXLIB_NVCCXX_FLAGS}")
741792

742793
#and add to the CUDA flags
@@ -747,7 +798,8 @@ if(MXLIB_USE_CUDA)
747798
set(CMAKE_CUDA_STANDARD 20)
748799
#set(CMAKE_CXX_STANDARD_REQUIRED ON)
749800

750-
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} -DEIGEN_NO_CUDA -DMXLIB_CUDA -I${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}")
801+
include_dirs_to_cflags(CUDA_INCLUDE_CFLAGS CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES)
802+
set(MXLIB_PC_CFLAGS "${MXLIB_PC_CFLAGS} -DEIGEN_NO_CUDA -DMXLIB_CUDA ${CUDA_INCLUDE_CFLAGS}")
751803

752804
set(MXLIB_PC_LDFLAGS "${MXLIB_PC_LDFLAGS} -L${CUDAToolkit_LIBRARY_DIR}")
753805
set(MXLIB_PC_LDFLAGS "${MXLIB_PC_LDFLAGS} -l${CUDA_cudart_LIBNAME}")

0 commit comments

Comments
 (0)