Skip to content

Commit 337dc9c

Browse files
authored
Fix python extension linking (#168)
* Silence annoying FindFFTW warnings * Fix linker errors at import-time Python extensions are weakly linked, so linker errors can only be caught at runtime. This commit fixes any such broken extensions, and adds automated import testing to ctests to prevent future regressions. It also adds a helper function `isce2_add_staticlib` which creates a position-independent static library suitable for usage in multiple python extensions. This matches the SCons build scripts more closely and allows for future extensions to be declared in a more terse and hygienic fashion. * Update utilLib scripts * Update combinedLib scripts * Update offoutliers lib scripts * Add asa_im_decode cdll * Update alos lib scripts * Show ctest output upon failure * Update DataAccessor scripts * Remove TARGET_FILE_BASE_NAME * Remove incomplete stdproc modules (require stanford code) Co-authored-by: Ryan Burns <[email protected]>
1 parent f149813 commit 337dc9c

File tree

61 files changed

+291
-290
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+291
-290
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ jobs:
4747
set -ex
4848
cd /root/project/src/build
4949
. /opt/conda/bin/activate root
50-
ctest
50+
ctest --output-on-failure
5151
ISCE2DIR=$(python3 -c "import os, isce2; print(os.path.dirname(isce2.__file__))" | tail -n 1)
5252
export PATH=$ISCE2DIR/applications:$PATH
5353
topsApp.py --help --steps

.cmake/FindFFTW.cmake

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,6 @@ foreach(dtype Float Double LongDouble)
131131

132132
# Tell find_package whether this component was found
133133
set(FFTW_${component}_FIND_QUIETLY TRUE)
134-
find_package_handle_standard_args(FFTW_${component}
135-
HANDLE_COMPONENTS REQUIRED_VARS ${libvar} FFTW_INCLUDE_DIRS)
136134
# Also set the value of the legacy library-variable
137135
# (Will be set to *-NOTFOUND if not found)
138136
set(${libvar} ${FFTW_${component}})

.cmake/isce2_helpers.cmake

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,40 @@ macro(isce2_get_dir_prefix)
1010
string(REPLACE "/" "." dir_prefix ${dir_prefix})
1111
endmacro()
1212

13+
# Usage: isce2_add_staticlib(name [sources ...])
14+
# Creates a SCons-like isce2 intermediate library.
15+
# The actual target will also be available via the namespaced isce2:: alias.
16+
macro(isce2_add_staticlib name)
17+
add_library(${name} STATIC ${ARGN})
18+
set_target_properties(${name} PROPERTIES
19+
OUTPUT_NAME ${name}
20+
POSITION_INDEPENDENT_CODE ON
21+
)
22+
# add alias matching exported target
23+
add_library(isce2::${name} ALIAS ${name})
24+
endmacro()
25+
26+
# Usage: isce2_add_cdll(libname [sources ...])
27+
# These libraries are loaded using a hardcoded filename, so this
28+
# macro simplifies adding target properties to make that possible.
29+
macro(isce2_add_cdll target)
30+
add_library(${target} SHARED ${ARGN})
31+
set_target_properties(${target} PROPERTIES
32+
PREFIX ""
33+
OUTPUT_NAME ${target}
34+
SUFFIX .so)
35+
36+
# If we're the root cmake project (e.g. not add_subdirectory):
37+
if("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
38+
# override this to also test the resulting extension
39+
add_test(NAME load_cdll_${target}
40+
COMMAND ${Python_EXECUTABLE} -c
41+
"from ctypes import cdll; \
42+
cdll.LoadLibrary('$<TARGET_FILE:${target}>')"
43+
)
44+
endif()
45+
endmacro()
46+
1347
# Usage:
1448
# add_exe_test(main.cpp helpers.F [additional_source.c ...] )
1549
# or

CMakeLists.txt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
1+
cmake_minimum_required(VERSION 3.13...3.18)
22

33
project(isce2 LANGUAGES C CXX Fortran)
44

@@ -26,6 +26,18 @@ include(TargetMotif)
2626
include(TargetX11)
2727
include(UseCython)
2828

29+
# If we're the root cmake project (e.g. not add_subdirectory):
30+
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_LIST_DIR}")
31+
# override this to also test the resulting extension
32+
function(Python_add_library target)
33+
_Python_add_library(${target} ${ARGN})
34+
add_test(NAME import_${target}
35+
COMMAND ${Python_EXECUTABLE} -c
36+
"import ${target}"
37+
)
38+
endfunction()
39+
endif()
40+
2941
if(NOT DEFINED PYTHON_MODULE_DIR)
3042
set(PYTHON_MODULE_DIR packages CACHE PATH
3143
"Python module directory (relative to install prefix)")

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ and then try "scons install" again.
296296

297297
### CMake (experimental)
298298
Make sure you have the following prerequisites:
299-
* CMake ≥ 3.12
299+
* CMake ≥ 3.13
300300
* GCC ≥ 4.8 (with C++11 support)
301301
* Python ≥ 3.5
302302
* Cython

components/isceobj/LineAccessor/CMakeLists.txt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
add_library(LineAccessor_static STATIC
1+
isce2_add_staticlib(LineAccessorLib
22
src/ImageAccessor.cpp
33
src/LineAccessor.cpp
44
src/LineAccessorF.cpp
55
)
6-
target_include_directories(LineAccessor_static PUBLIC include)
7-
set_property(TARGET LineAccessor_static PROPERTY POSITION_INDEPENDENT_CODE ON)
6+
target_include_directories(LineAccessorLib PUBLIC include)
87

98
Python_add_library(LineAccessor MODULE
109
bindings/LineAccessormodule.cpp
1110
)
12-
target_link_libraries(LineAccessor PUBLIC LineAccessor_static)
11+
target_link_libraries(LineAccessor PRIVATE isce2::LineAccessorLib)
1312

1413
InstallSameDir(
1514
LineAccessor

components/isceobj/Orbit/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Python_add_library(orbitHermite MODULE
1+
isce2_add_cdll(orbitHermite
22
src/orbitHermiteC.c
33
src/orbithermite.F
44
)

components/isceobj/Sensor/CMakeLists.txt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@ add_subdirectory(db)
22
add_subdirectory(TOPS)
33
add_subdirectory(MultiMode)
44

5-
add_library(asa_im_decode src/asa_im_decode/asa_im_decode.c)
6-
set_target_properties(asa_im_decode PROPERTIES
7-
PREFIX ""
8-
OUTPUT_NAME envisat
9-
SUFFIX .so)
5+
isce2_add_cdll(asa_im_decode src/asa_im_decode/asa_im_decode.c)
106

117
set(installfiles
128
asa_im_decode
@@ -94,6 +90,6 @@ target_include_directories(alos PUBLIC
9490
include
9591
src/ALOS_pre_process
9692
)
97-
target_link_libraries(alos PUBLIC DataAccessor_static)
93+
target_link_libraries(alos PUBLIC isce2::DataAccessorLib)
9894

9995
InstallSameDir(${installfiles})

components/isceobj/Util/CMakeLists.txt

Lines changed: 5 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,22 @@
11
add_subdirectory(ImageUtil)
22
add_subdirectory(geo)
3+
add_subdirectory(offoutliers)
34

45
Python_add_library(offoutliers MODULE
56
offoutliers/bindings/offoutliersmodule.cpp
6-
offoutliers/src/offoutliers.F
7-
offoutliers/src/offoutliersAllocateDeallocate.F
8-
offoutliers/src/offoutliersGetState.F
9-
offoutliers/src/offoutliersSetState.F
10-
offoutliers/src/offoutliersState.F
11-
)
12-
target_include_directories(offoutliers PUBLIC offoutliers/include)
13-
target_link_libraries(offoutliers PUBLIC
14-
stdoel_static
157
)
8+
target_link_libraries(offoutliers PRIVATE isce2::offoutliersLib)
169

1710
add_definitions(-DHAVE_CONFIG_H -DHAVE_FFTW=1)
18-
19-
add_library(utilLib SHARED
20-
src/akima_reg.F
21-
src/args_roi.F
22-
src/besseldiffs.F
23-
src/bilinear.F
24-
src/cfft1d_jpl.F
25-
src/cfft2d.F
26-
src/cffts.F
27-
src/config.h
28-
src/convert_schdot_to_xyzdot.F
29-
src/convert_sch_to_xyz.F
30-
src/cross.F
31-
src/curvature.F
32-
src/derampc.F
33-
src/dop.F
34-
src/dot.F
35-
src/enubasis.F
36-
src/fc.F
37-
src/fc.f.org
38-
src/fftw3stub.c
39-
src/fftw3stub.cc
40-
src/fortranUtils.f90
41-
src/fourn.F
42-
src/fournnr.F
43-
src/getangs.F
44-
src/gettcn_tcvec.F
45-
src/hunt.F
46-
src/inter_motion.F
47-
src/interp.F
48-
src/intp_coef.f90
49-
src/intpcoefnorm.F
50-
src/io.c
51-
src/latlon.F
52-
src/latlon_nostruct.F
53-
#src/lfit.F
54-
src/linalg.f90
55-
src/lincomb.F
56-
src/lookvec.F
57-
src/lsq.f90
58-
src/matmat.F
59-
src/matvec.F
60-
src/norm.F
61-
src/orrmread1.F
62-
src/polint.F
63-
src/PowerOfTwo.cc
64-
src/quadfit.f90
65-
src/radar_to_xyz.F
66-
src/rdf_common.inc
67-
src/roi_exit.cc
68-
src/schbasis.F
69-
src/second.c
70-
src/sfftw_import.c
71-
src/spline.f
72-
#src/svd.F
73-
#src/svdvecfit9.F
74-
#src/svdvecfit.F
75-
src/tranmat.F
76-
src/uniform_interp.f90
77-
src/unitvec.F
78-
src/utmtoll.F
79-
src/zbrent.F
80-
)
11+
add_subdirectory(src)
8112
target_include_directories(utilLib PUBLIC
8213
include
8314
)
8415
target_link_libraries(utilLib PRIVATE
8516
FFTW::Float
8617
)
8718

88-
add_library(combinedLib SHARED
19+
isce2_add_staticlib(combinedLib
8920
Library/geometry/src/geometryModule.F
9021
Library/linalg3/src/linalg3Module.F
9122
Library/linalg3/src/linalg3.c
@@ -112,7 +43,7 @@ target_include_directories(combinedlibmodule PUBLIC
11243
Library/include
11344
)
11445
target_link_libraries(combinedlibmodule PUBLIC
115-
combinedLib
46+
isce2::combinedLib
11647
)
11748

11849
# Set up fortran module paths
@@ -127,12 +58,6 @@ target_include_directories(combinedLib INTERFACE
12758
$<$<COMPILE_LANGUAGE:Fortran>:${mdir}>
12859
)
12960

130-
install(TARGETS
131-
utilLib
132-
combinedLib
133-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
134-
)
135-
13661
InstallSameDir(
13762
combinedlibmodule
13863
offoutliers
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
add_subdirectory(src)
2+
target_include_directories(offoutliersLib PUBLIC include)
3+
target_link_libraries(offoutliersLib PRIVATE isce2::stdoelLib)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
isce2_add_staticlib(offoutliersLib STATIC
2+
offoutliers.F
3+
offoutliersAllocateDeallocate.F
4+
offoutliersGetState.F
5+
offoutliersSetState.F
6+
offoutliersState.F
7+
)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
isce2_add_staticlib(utilLib
2+
akima_reg.F
3+
args_roi.F
4+
besseldiffs.F
5+
bilinear.F
6+
cfft1d_jpl.F
7+
cfft2d.F
8+
cffts.F
9+
config.h
10+
convert_schdot_to_xyzdot.F
11+
convert_sch_to_xyz.F
12+
cross.F
13+
curvature.F
14+
derampc.F
15+
dop.F
16+
dot.F
17+
enubasis.F
18+
fc.F
19+
fc.f.org
20+
fftw3stub.c
21+
fftw3stub.cc
22+
fortranUtils.f90
23+
fourn.F
24+
fournnr.F
25+
getangs.F
26+
gettcn_tcvec.F
27+
hunt.F
28+
inter_motion.F
29+
interp.F
30+
intp_coef.f90
31+
intpcoefnorm.F
32+
io.c
33+
latlon.F
34+
latlon_nostruct.F
35+
lfit.F
36+
linalg.f90
37+
lincomb.F
38+
lookvec.F
39+
lsq.f90
40+
matmat.F
41+
matvec.F
42+
norm.F
43+
orrmread1.F
44+
polint.F
45+
PowerOfTwo.cc
46+
quadfit.f90
47+
radar_to_xyz.F
48+
rdf_common.inc
49+
roi_exit.cc
50+
schbasis.F
51+
second.c
52+
sfftw_import.c
53+
spline.f
54+
svd.F
55+
svdvecfit9.F
56+
svdvecfit.F
57+
tranmat.F
58+
uniform_interp.f90
59+
unitvec.F
60+
utmtoll.F
61+
zbrent.F
62+
)

components/iscesys/ImageApi/CMakeLists.txt

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
# TODO (subdir-staticlib)
2-
# This library is in a subdirectory but used by other libraries,
3-
# so it's compiled as a static library so we don't need to worry
4-
# about RPATH. Is there a better way to this?
5-
add_library(DataAccessor_static STATIC
1+
isce2_add_staticlib(DataAccessorLib
62
DataAccessor/src/DataAccessorCaster.cpp
73
DataAccessor/src/DataAccessor.cpp
84
DataAccessor/src/DataAccessorF.cpp
@@ -18,33 +14,31 @@ add_library(DataAccessor_static STATIC
1814
InterleavedAccessor/src/Poly1dInterpolator.cpp
1915
InterleavedAccessor/src/Poly2dInterpolator.cpp
2016
)
21-
22-
set_property(TARGET DataAccessor_static PROPERTY POSITION_INDEPENDENT_CODE ON)
23-
target_include_directories(DataAccessor_static PUBLIC
17+
target_include_directories(DataAccessorLib PUBLIC
2418
DataAccessor/include
2519
DataCaster/include
2620
Factories/include
2721
InterleavedAccessor/include
2822
)
29-
target_link_libraries(DataAccessor_static PUBLIC
30-
combinedLib
23+
target_link_libraries(DataAccessorLib PUBLIC
24+
isce2::combinedLib
3125
)
3226

3327
if(TARGET GDAL::GDAL)
34-
target_sources(DataAccessor_static PRIVATE
28+
target_sources(DataAccessorLib PRIVATE
3529
InterleavedAccessor/src/GDALAccessor.cpp
3630
)
37-
target_link_libraries(DataAccessor_static PUBLIC
31+
target_link_libraries(DataAccessorLib PUBLIC
3832
GDAL::GDAL
3933
)
4034
else()
41-
target_compile_definitions(DataAccessor_static PRIVATE -DHAVE_GDAL=0)
35+
target_compile_definitions(DataAccessorLib PRIVATE -DHAVE_GDAL=0)
4236
endif()
4337

4438
Python_add_library(DataAccessor MODULE
4539
DataAccessor/bindings/DataAccessormodule.cpp
4640
)
47-
target_link_libraries(DataAccessor PRIVATE DataAccessor_static)
41+
target_link_libraries(DataAccessor PRIVATE isce2::DataAccessorLib)
4842

4943
InstallSameDir(
5044
Factories/CasterFactory.py

components/iscesys/ImageApi/DataAccessor/CMakeLists.txt

Whitespace-only changes.

0 commit comments

Comments
 (0)