From 3765d86e467900f465c3fc0749bcef6cdf7de551 Mon Sep 17 00:00:00 2001 From: Dennis Heimbigner Date: Sun, 9 Apr 2023 13:10:41 -0600 Subject: [PATCH] "Simplify" XGetopt usage When "getopt()" is not available, various of the netcdf-c utilities use XGetopt instead. This occurs primarily when building under Window, so the build changes are restricted to CMake. This PR tries to isolate XGetopt.c to the libdispatch directory and then builds the various utilities using this cliche: ```` IF(USE_X_GETOPT) SET(XGETOPTSRC "${CMAKE_CURRENT_SOURCE_DIR}/../libdispatch/XGetopt.c") ENDIF() ```` This avoids the need to copy XGetopt.c to all the directories that use it. --- CMakeLists.txt | 12 ------- libdispatch/Makefile.am | 2 +- {libsrc => libdispatch}/XGetopt.c | 0 libsrc/Makefile.am | 2 +- ncdump/CMakeLists.txt | 54 ++++++++++++++----------------- ncgen/CMakeLists.txt | 10 +++--- ncgen3/CMakeLists.txt | 7 ++-- nczarr_test/CMakeLists.txt | 18 ++++------- 8 files changed, 42 insertions(+), 63 deletions(-) rename {libsrc => libdispatch}/XGetopt.c (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 31eaf99bb7..d2f8ac04f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1249,18 +1249,6 @@ IF(MSVC) OPTION(ENABLE_XGETOPT "Enable bundled XGetOpt instead of external getopt()." ON) IF(ENABLE_XGETOPT) SET(USE_X_GETOPT ON CACHE BOOL "") - # Copy XGetopt.c to everywhere it is needed. Avoids - # inconsistent code - FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c - DESTINATION ${netCDF_BINARY_DIR}/ncgen3/) - FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c - DESTINATION ${netCDF_BINARY_DIR}/ncgen/) - FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c - DESTINATION ${netCDF_BINARY_DIR}/ncdump/) - FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c - DESTINATION ${netCDF_BINARY_DIR}/nczarr_test/) - FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c - DESTINATION ${netCDF_BINARY_DIR}/ncdap_test/) ENDIF() ENDIF() diff --git a/libdispatch/Makefile.am b/libdispatch/Makefile.am index 00e00f364d..2db1916c15 100644 --- a/libdispatch/Makefile.am +++ b/libdispatch/Makefile.am @@ -56,7 +56,7 @@ if REGEDIT libdispatch_la_SOURCES += dreg.c endif -EXTRA_DIST=CMakeLists.txt ncsettings.hdr utf8proc_data.c +EXTRA_DIST = CMakeLists.txt ncsettings.hdr utf8proc_data.c XGetopt.c # Build ncsettings.c as follows: # 1. copy ncsettings.hdr to ncsettings.c diff --git a/libsrc/XGetopt.c b/libdispatch/XGetopt.c similarity index 100% rename from libsrc/XGetopt.c rename to libdispatch/XGetopt.c diff --git a/libsrc/Makefile.am b/libsrc/Makefile.am index e660fe9e25..08f074131d 100644 --- a/libsrc/Makefile.am +++ b/libsrc/Makefile.am @@ -45,7 +45,7 @@ noinst_LTLIBRARIES = libnetcdf3.la # with m4), but they are included in the distribution so that the user # does not have to have m4. MAINTAINERCLEANFILES = $(man_MANS) attr.c ncx.c putget.c -EXTRA_DIST = attr.m4 ncx.m4 putget.m4 $(man_MANS) CMakeLists.txt XGetopt.c +EXTRA_DIST = attr.m4 ncx.m4 putget.m4 $(man_MANS) CMakeLists.txt # This tells make how to turn .m4 files into .c files. .m4.c: diff --git a/ncdump/CMakeLists.txt b/ncdump/CMakeLists.txt index 00447e9bf6..c0869b0362 100644 --- a/ncdump/CMakeLists.txt +++ b/ncdump/CMakeLists.txt @@ -11,25 +11,19 @@ SET(RCMERGE OFF) -SET(ncdump_FILES ncdump.c vardata.c dumplib.c indent.c nctime0.c utils.c nciter.c) -SET(nccopy_FILES nccopy.c nciter.c chunkspec.c utils.c dimmap.c list.c) -SET(ocprint_FILES ocprint.c) -SET(ncvalidator_FILES ncvalidator.c) -SET(printfqn_FILES printfqn.c) -SET(ncpathcvt_FILES ncpathcvt.c) -SET(ncfilteravail_FILES ncfilteravail.c) -SET(nchdf5version_FILES nchdf5version.c) - IF(USE_X_GETOPT) - SET(ncdump_FILES ${ncdump_FILES} XGetopt.c) - SET(nccopy_FILES ${nccopy_FILES} XGetopt.c) - SET(ocprint_FILES ${ocprint_FILES} XGetopt.c) - SET(ncvalidator_FILES ${ncvalidator_FILES} XGetopt.c) - SET(printfqn_FILES ${printfqn_FILES} XGetopt.c) - SET(ncpathcvt_FILES ${ncpathcvt_FILES} XGetopt.c) - SET(ncfilteravail_FILES ${ncfilteravail_FILES} XGetopt.c) -ENDIF(USE_X_GETOPT) +SET(XGETOPTSRC "${CMAKE_CURRENT_SOURCE_DIR}/../libdispatch/XGetopt.c") +ENDIF() +SET(ncdump_FILES ncdump.c vardata.c dumplib.c indent.c nctime0.c utils.c nciter.c ${XGETOPTSRC}) +SET(nccopy_FILES nccopy.c nciter.c chunkspec.c utils.c dimmap.c list.c ${XGETOPTSRC}) +SET(ocprint_FILES ocprint.c ${XGETOPTSRC}) +SET(ncvalidator_FILES ncvalidator.c ${XGETOPTSRC}) +SET(printfqn_FILES printfqn.c ${XGETOPTSRC}) +SET(ncpathcvt_FILES ncpathcvt.c ${XGETOPTSRC}) +SET(ncfilteravail_FILES ncfilteravail.c ${XGETOPTSRC}) +SET(nchdf5version_FILES nchdf5version.c) + ADD_EXECUTABLE(ncdump ${ncdump_FILES}) ADD_EXECUTABLE(nccopy ${nccopy_FILES}) ADD_EXECUTABLE(ncvalidator ${ncvalidator_FILES}) @@ -181,21 +175,21 @@ endif() build_bin_test_no_prefix(tst_h_rdc0) build_bin_test_no_prefix(tst_unicode) build_bin_test_no_prefix(tst_vlen_data) - add_bin_test_no_prefix(tst_create_files) - add_bin_test_no_prefix(tst_opaque_data) - add_bin_test_no_prefix(tst_string_data) - add_bin_test_no_prefix(tst_comp2) - add_bin_test_no_prefix(tst_nans) - add_bin_test_no_prefix(tst_h_scalar) - add_bin_test_no_prefix(tst_compress) - add_bin_test_no_prefix(tst_chunking) - add_bin_test_no_prefix(tst_group_data) - add_bin_test_no_prefix(tst_enum_data) - add_bin_test_no_prefix(tst_enum_undef) - add_bin_test_no_prefix(tst_comp) + build_bin_test_no_prefix(tst_create_files) + build_bin_test_no_prefix(tst_opaque_data) + build_bin_test_no_prefix(tst_string_data) + build_bin_test_no_prefix(tst_comp2) + build_bin_test_no_prefix(tst_nans) + build_bin_test_no_prefix(tst_h_scalar) + build_bin_test_no_prefix(tst_compress) + build_bin_test_no_prefix(tst_chunking) + build_bin_test_no_prefix(tst_group_data) + build_bin_test_no_prefix(tst_enum_data) + build_bin_test_no_prefix(tst_enum_undef) + build_bin_test_no_prefix(tst_comp) # Add this test by hand, as it is also called from a script. # Editing the script would break autotools compatibility. - add_bin_test_no_prefix(tst_special_atts) + build_bin_test_no_prefix(tst_special_atts) ENDIF(USE_HDF5) # Base tests diff --git a/ncgen/CMakeLists.txt b/ncgen/CMakeLists.txt index 4155405132..4edc88b145 100644 --- a/ncgen/CMakeLists.txt +++ b/ncgen/CMakeLists.txt @@ -9,6 +9,10 @@ IF(BUILD_SHARED_LIBS AND WIN32) remove_definitions(-DDLL_NETCDF) ENDIF() +IF(USE_X_GETOPT) + SET(XGETOPTSRC "${CMAKE_CURRENT_SOURCE_DIR}/../libdispatch/XGetopt.c") +ENDIF() + SET(ncgen_FILES bindata.c bytebuffer.c cdata.c cvt.c data.c debug.c dump.c escapes.c f77data.c genbin.c genc.c genchar.c generate.c generr.c genf77.c @@ -16,15 +20,11 @@ genj.c genlib.c getfill.c jdata.c list.c main.c ncgeny.c semantics.c util.c bytebuffer.h data.h debug.h dump.h generate.h generr.h genlib.h includes.h list.h -ncgen.h ncgeny.h util.h) +ncgen.h ncgeny.h util.h ${XGETOPTSRC}) # Obsolete SET(OBSOLETE odom.c odom.h jdatastd.c jdatajni.c genjni.c cdfdata.c cmldata.c) -IF(USE_X_GETOPT) - SET(ncgen_FILES ${ncgen_FILES} XGetopt.c) -ENDIF() - # don't add the automatically determined parts of the RPATH # which point to directories outside the build tree to the install RPATH SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) diff --git a/ncgen3/CMakeLists.txt b/ncgen3/CMakeLists.txt index 355d289bb9..5f26419f07 100644 --- a/ncgen3/CMakeLists.txt +++ b/ncgen3/CMakeLists.txt @@ -3,13 +3,14 @@ # 2015, 2016, 2017, 2018 # University Corporation for Atmospheric Research/Unidata. -# See netcdf-c/COPYRIGHT file for more info. -SET(ncgen3_FILES main.c load.c escapes.c getfill.c init.c genlib.c ncgeny.c) IF(USE_X_GETOPT) - SET(ncgen3_FILES ${ncgen3_FILES} XGetopt.c) + SET(XGETOPTSRC "${CMAKE_CURRENT_SOURCE_DIR}/../libdispatch/XGetopt.c") ENDIF() +# See netcdf-c/COPYRIGHT file for more info. +SET(ncgen3_FILES main.c load.c escapes.c getfill.c init.c genlib.c ncgeny.c ${XGETOPTSRC}) + FILE(GLOB COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.nc ${CMAKE_CURRENT_SOURCE_DIR}/*.sh ${CMAKE_CURRENT_SOURCE_DIR}/*.cdl) FILE(COPY ${COPY_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/ FILE_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE) diff --git a/nczarr_test/CMakeLists.txt b/nczarr_test/CMakeLists.txt index afa27ac3e5..d639a1dd12 100644 --- a/nczarr_test/CMakeLists.txt +++ b/nczarr_test/CMakeLists.txt @@ -40,17 +40,15 @@ ${CMAKE_CURRENT_SOURCE_DIR}/ref*.zmap) FILE(COPY ${COPY_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/ FILE_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE) +IF(USE_X_GETOPT) +SET(XGETOPTSRC "${CMAKE_CURRENT_SOURCE_DIR}/../libdispatch/XGetopt.c") +ENDIF() + IF(ENABLE_TESTS) - SET(COMMONSRC ut_util.c ut_test.c) - IF(USE_X_GETOPT) - SET(COMMONSRC ${COMMONSRC} XGetopt.c) - ENDIF() + SET(COMMONSRC ut_util.c ut_test.c ${XGETOPTSRC}) - SET(TSTCOMMONSRC tst_utils.c) - IF(USE_X_GETOPT) - SET(TSTCOMMONSRC ${TSTCOMMONSRC} XGetopt.c) - ENDIF() + SET(TSTCOMMONSRC tst_utils.c ${XGETOPTSRC}) # Base tests # The tests are set up as a combination of shell scripts and executables that @@ -91,9 +89,7 @@ IF(ENABLE_TESTS) endif() SET(ncdumpchunks_SOURCE ncdumpchunks.c) - IF(USE_X_GETOPT) - SET(ncdumpchunks_SOURCE ${ncdumpchunks_SOURCE} XGetopt.c) - ENDIF() + SET(ncdumpchunks_SOURCE ${ncdumpchunks_SOURCE} ${XGETOPTSRC}) BUILD_BIN_TEST(ncdumpchunks ${ncdumpchunks_SOURCE}) TARGET_INCLUDE_DIRECTORIES(ncdumpchunks PUBLIC ../libnczarr)