mirror of
				https://github.com/cjcliffe/CubicSDR.git
				synced 2025-10-27 11:00:28 -04:00 
			
		
		
		
	Add OSX SoapySDR module bundling support.
This commit is contained in:
		
							parent
							
								
									5346bdd50d
								
							
						
					
					
						commit
						f39a96022a
					
				| @ -2,7 +2,7 @@ cmake_minimum_required (VERSION 2.8) | |||||||
| 
 | 
 | ||||||
| SET(CUBICSDR_VERSION_MAJOR "0") | SET(CUBICSDR_VERSION_MAJOR "0") | ||||||
| SET(CUBICSDR_VERSION_MINOR "1") | SET(CUBICSDR_VERSION_MINOR "1") | ||||||
| SET(CUBICSDR_VERSION_PATCH "15") | SET(CUBICSDR_VERSION_PATCH "16") | ||||||
| SET(CUBICSDR_VERSION_REL "alpha") | SET(CUBICSDR_VERSION_REL "alpha") | ||||||
| SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}-${CUBICSDR_VERSION_REL}") | SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}-${CUBICSDR_VERSION_REL}") | ||||||
| 
 | 
 | ||||||
| @ -427,7 +427,11 @@ IF (APPLE AND BUNDLE_APP) | |||||||
|      |      | ||||||
|     set(BUNDLE_SOAPY_MODS OFF CACHE BOOL "Bundle local SoapySDR modules") |     set(BUNDLE_SOAPY_MODS OFF CACHE BOOL "Bundle local SoapySDR modules") | ||||||
|      |      | ||||||
|      |     IF (BUNDLE_SOAPY_MODS) | ||||||
|  |     	ADD_DEFINITIONS( | ||||||
|  |     		-DBUNDLE_SOAPY_MODS=1 | ||||||
|  |     	) | ||||||
|  |     ENDIF() | ||||||
|      |      | ||||||
|     ADD_DEFINITIONS( |     ADD_DEFINITIONS( | ||||||
| 		-std=c++0x  | 		-std=c++0x  | ||||||
| @ -488,24 +492,45 @@ IF (APPLE AND BUNDLE_APP) | |||||||
|     # SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) |     # SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) | ||||||
|     # SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) |     # SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) | ||||||
|      |      | ||||||
|  |     IF (BUNDLE_SOAPY_MODS) | ||||||
|  | 
 | ||||||
|  |     message(STATUS "SOAPY_ROOT: ${SOAPY_SDR_ROOT}") | ||||||
|  |     file(GLOB SOAPY_MODS ${SOAPY_SDR_ROOT}/lib/SoapySDR/modules/*.so) | ||||||
|  |      | ||||||
|  |     FOREACH(SOAPY_MOD_FILE ${SOAPY_MODS}) | ||||||
|  |             INSTALL( FILES "${SOAPY_MOD_FILE}" | ||||||
|  |                 DESTINATION "${APPS}/Contents/MacOS/modules" | ||||||
|  |                 COMPONENT Runtime | ||||||
|  |             ) | ||||||
|  |     ENDFOREACH() | ||||||
|  |      | ||||||
|  |     ENDIF(BUNDLE_SOAPY_MODS) | ||||||
|  | 
 | ||||||
|     INSTALL(CODE " |     INSTALL(CODE " | ||||||
|        SET(BU_COPY_FULL_FRAMEWORK_CONTENTS ON) |        SET(BU_COPY_FULL_FRAMEWORK_CONTENTS ON) | ||||||
|        include(BundleUtilities) |        include(BundleUtilities) | ||||||
|        fixup_bundle(\"${APPS}\"   \"\"   \"/usr/local/lib\") |        fixup_bundle(\"${APPS}\"   \"\"   \"/usr/local/lib\") | ||||||
|        VERIFY_APP(\"${APPS}\") |  | ||||||
|        " COMPONENT Runtime) |        " COMPONENT Runtime) | ||||||
| 
 | 
 | ||||||
|        # IF (BUNDLE_SOAPY_MODS) |     IF (BUNDLE_SOAPY_MODS) | ||||||
|        #         install( DIRECTORY "${SOAPY_SDR_ROOT}/lib/modules" |        FOREACH(SOAPY_MOD_FILE ${SOAPY_MODS}) | ||||||
|        #             DESTINATION ${APPS}/modules |            GET_FILENAME_COMPONENT(SOAPY_MOD_NAME ${SOAPY_MOD_FILE} NAME) | ||||||
|        #             COMPONENT Runtime |  | ||||||
|        #             FILES_MATCHING |  | ||||||
|        #             PATTERN "*.dylib" |  | ||||||
|        #             PATTERN "*_debug.dylib" EXCLUDE |  | ||||||
|        #         ) |  | ||||||
|        # ENDIF(BUNDLE_SOAPY_MODS) |  | ||||||
|             |             | ||||||
|  |            IF(${SOAPY_MOD_NAME} STREQUAL "libsdrPlaySupport.so") # prevent inclusion of libmirsdrapi-rsp.so | ||||||
|  |                message(STATUS "Excluding libsdrPlaySupport.so") | ||||||
|  |                CONTINUE() | ||||||
|  |            ELSE() | ||||||
|  |                message(STATUS "Bundling ${SOAPY_MOD_NAME} from ${SOAPY_MOD_FILE}") | ||||||
|  |            ENDIF() | ||||||
|  |            INSTALL(CODE " | ||||||
|  |                fixup_bundle(\"${APPS}\"   \"${APPS}/Contents/MacOS/modules/${SOAPY_MOD_NAME}\"   \"/usr/local/lib\") | ||||||
|  |               " COMPONENT Runtime) | ||||||
|  |        ENDFOREACH() | ||||||
|  |    ENDIF(BUNDLE_SOAPY_MODS) | ||||||
|     |     | ||||||
|  |    INSTALL(CODE " | ||||||
|  |        VERIFY_APP(\"${APPS}\") | ||||||
|  |        " COMPONENT Runtime) | ||||||
| 
 | 
 | ||||||
|    INSTALL(TARGETS CubicSDR |    INSTALL(TARGETS CubicSDR | ||||||
|        BUNDLE DESTINATION . COMPONENT Runtime |        BUNDLE DESTINATION . COMPONENT Runtime | ||||||
|  | |||||||
| @ -270,6 +270,16 @@ bool CubicSDR::OnCmdLineParsed(wxCmdLineParser& parser) { | |||||||
|      |      | ||||||
|     config.load(); |     config.load(); | ||||||
| 
 | 
 | ||||||
|  | #ifdef BUNDLE_SOAPY_MODS | ||||||
|  |     if (parser.Found("l")) { | ||||||
|  |         useLocalMod.store(true); | ||||||
|  |     } else { | ||||||
|  |         useLocalMod.store(false); | ||||||
|  |     } | ||||||
|  | #else | ||||||
|  |     useLocalMod.store(false); | ||||||
|  | #endif | ||||||
|  |      | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -611,3 +621,6 @@ void CubicSDR::setDeviceArgs(SoapySDR::Kwargs settingArgs_in) { | |||||||
|     settingArgs = settingArgs_in; |     settingArgs = settingArgs_in; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool CubicSDR::getUseLocalMod() { | ||||||
|  |     return useLocalMod.load(); | ||||||
|  | } | ||||||
| @ -112,6 +112,7 @@ public: | |||||||
|     void setStreamArgs(SoapySDR::Kwargs streamArgs_in); |     void setStreamArgs(SoapySDR::Kwargs streamArgs_in); | ||||||
|     void setDeviceArgs(SoapySDR::Kwargs settingArgs_in); |     void setDeviceArgs(SoapySDR::Kwargs settingArgs_in); | ||||||
| 
 | 
 | ||||||
|  |     bool getUseLocalMod(); | ||||||
| private: | private: | ||||||
|     AppFrame *appframe; |     AppFrame *appframe; | ||||||
|     AppConfig config; |     AppConfig config; | ||||||
| @ -150,15 +151,26 @@ private: | |||||||
|     std::atomic_bool devicesReady; |     std::atomic_bool devicesReady; | ||||||
|     std::atomic_bool deviceSelectorOpen; |     std::atomic_bool deviceSelectorOpen; | ||||||
|     std::atomic_bool sampleRateInitialized; |     std::atomic_bool sampleRateInitialized; | ||||||
|  |     std::atomic_bool useLocalMod; | ||||||
|     std::string notifyMessage; |     std::string notifyMessage; | ||||||
|     std::mutex notify_busy; |     std::mutex notify_busy; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | #ifdef BUNDLE_SOAPY_MODS | ||||||
|  | static const wxCmdLineEntryDesc commandLineInfo [] = | ||||||
|  | { | ||||||
|  |     { wxCMD_LINE_SWITCH, "h", "help", "Command line parameter help", wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, | ||||||
|  |     { wxCMD_LINE_OPTION, "c", "config", "Specify a named configuration to use, i.e. '-c ham'" }, | ||||||
|  |     { wxCMD_LINE_SWITCH, "l", "localmod", "Check local SoapySDR modules instead of bundled first." }, | ||||||
|  |     { wxCMD_LINE_NONE } | ||||||
|  | }; | ||||||
|  | #else | ||||||
| static const wxCmdLineEntryDesc commandLineInfo [] = | static const wxCmdLineEntryDesc commandLineInfo [] = | ||||||
| { | { | ||||||
|     { wxCMD_LINE_SWITCH, "h", "help", "Command line parameter help", wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, |     { wxCMD_LINE_SWITCH, "h", "help", "Command line parameter help", wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, | ||||||
|     { wxCMD_LINE_OPTION, "c", "config", "Specify a named configuration to use, i.e. '-c ham'" }, |     { wxCMD_LINE_OPTION, "c", "config", "Specify a named configuration to use, i.e. '-c ham'" }, | ||||||
|     { wxCMD_LINE_NONE } |     { wxCMD_LINE_NONE } | ||||||
| }; | }; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| DECLARE_APP(CubicSDR) | DECLARE_APP(CubicSDR) | ||||||
|  | |||||||
| @ -37,29 +37,42 @@ std::vector<SDRDeviceInfo *> *SDREnumerator::enumerate_devices(std::string remot | |||||||
|         std::cout << "\tABI Version: v" << SoapySDR::getABIVersion() << std::endl; |         std::cout << "\tABI Version: v" << SoapySDR::getABIVersion() << std::endl; | ||||||
|         std::cout << "\tInstall root: " << SoapySDR::getRootPath() << std::endl; |         std::cout << "\tInstall root: " << SoapySDR::getRootPath() << std::endl; | ||||||
|          |          | ||||||
|         modules = SoapySDR::listModules(); |         std::cout << "\tLoading modules... " << std::endl; | ||||||
|         for (size_t i = 0; i < modules.size(); i++) { | 		#ifdef BUNDLE_SOAPY_MODS | ||||||
|             std::cout << "\tModule found: " << modules[i] << std::endl; |         bool localModPref = wxGetApp().getUseLocalMod(); | ||||||
|         } |         if (localModPref) { | ||||||
|         if (modules.empty()) { |             wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, "Loading SoapySDR modules.."); | ||||||
|             std::cout << "No modules found!" << std::endl; |             std::cout << "Checking local system SoapySDR modules.." << std::flush; | ||||||
|  |             SoapySDR::loadModules(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         std::cout << "\tLoading modules... " << std::flush; |  | ||||||
| 		#ifdef BUNDLE_SOAPY_MODS |  | ||||||
|         wxFileName exePath = wxFileName(wxStandardPaths::Get().GetExecutablePath()); |         wxFileName exePath = wxFileName(wxStandardPaths::Get().GetExecutablePath()); | ||||||
|         std::vector<std::string> localMods = SoapySDR::listModules(exePath.GetPath().ToStdString() + "/modules/"); |         std::vector<std::string> localMods = SoapySDR::listModules(exePath.GetPath().ToStdString() + "/modules/"); | ||||||
|         for (std::vector<std::string>::iterator mods_i = localMods.begin(); mods_i != localMods.end(); mods_i++) { |         for (std::vector<std::string>::iterator mods_i = localMods.begin(); mods_i != localMods.end(); mods_i++) { | ||||||
|             wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, "Initializing bundled SoapySDR module " + (*mods_i) + ".."); |             wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, "Initializing bundled SoapySDR module " + (*mods_i) + ".."); | ||||||
|  |             std::cout << "Loading bundled SoapySDR module " << (*mods_i) <<  ".." << std::endl; | ||||||
|             SoapySDR::loadModule(*mods_i); |             SoapySDR::loadModule(*mods_i); | ||||||
|         } |         } | ||||||
| 			wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, "Loading SoapySDR modules.."); |  | ||||||
|      |      | ||||||
|  |         if (!localModPref) { | ||||||
|  |             wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, "Loading SoapySDR modules.."); | ||||||
|  |             std::cout << "Checking system SoapySDR modules.." << std::flush; | ||||||
|             SoapySDR::loadModules(); |             SoapySDR::loadModules(); | ||||||
|  |         } | ||||||
| 		#else | 		#else | ||||||
|  |         wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, "Loading SoapySDR modules.."); | ||||||
| 		SoapySDR::loadModules(); | 		SoapySDR::loadModules(); | ||||||
| 		#endif | 		#endif | ||||||
|         std::cout << "done" << std::endl; |         wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, "done."); | ||||||
|  |         std::cout << "done." << std::endl; | ||||||
|  | 
 | ||||||
|  | //        modules = SoapySDR::listModules();
 | ||||||
|  | //        for (size_t i = 0; i < modules.size(); i++) {
 | ||||||
|  | //            std::cout << "\tModule found: " << modules[i] << std::endl;
 | ||||||
|  | //        }
 | ||||||
|  | //        if (modules.empty()) {
 | ||||||
|  | //            std::cout << "No modules found!" << std::endl;
 | ||||||
|  | //        }
 | ||||||
| 
 | 
 | ||||||
|         if (SDREnumerator::factories.size()) { |         if (SDREnumerator::factories.size()) { | ||||||
|             SDREnumerator::factories.erase(SDREnumerator::factories.begin(), SDREnumerator::factories.end()); |             SDREnumerator::factories.erase(SDREnumerator::factories.begin(), SDREnumerator::factories.end()); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user