Copy Paraver configs into the trace directory
Keeps the trace self-contained.
This commit is contained in:
		
							parent
							
								
									a2702ad92a
								
							
						
					
					
						commit
						b1b4f37032
					
				| @ -28,6 +28,10 @@ if(NOT CMAKE_BUILD_TYPE) | |||||||
|     "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel Asan UBsan." FORCE) |     "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel Asan UBsan." FORCE) | ||||||
| endif(NOT CMAKE_BUILD_TYPE) | endif(NOT CMAKE_BUILD_TYPE) | ||||||
| 
 | 
 | ||||||
|  | include(GNUInstallDirs) | ||||||
|  | set(OVNI_CONFIG_RELDIR "${CMAKE_INSTALL_DATADIR}/ovni") | ||||||
|  | set(OVNI_CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/${OVNI_CONFIG_RELDIR}") | ||||||
|  | 
 | ||||||
| include(CheckIPOSupported) | include(CheckIPOSupported) | ||||||
| check_ipo_supported(RESULT ipo_available OUTPUT error LANGUAGES C) | check_ipo_supported(RESULT ipo_available OUTPUT error LANGUAGES C) | ||||||
| 
 | 
 | ||||||
| @ -70,4 +74,4 @@ if(BUILD_TESTING) | |||||||
|   add_subdirectory(test) |   add_subdirectory(test) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| install(DIRECTORY cfg/ DESTINATION share/ovni) | install(DIRECTORY cfg/ DESTINATION "${OVNI_CONFIG_RELDIR}") | ||||||
|  | |||||||
| @ -39,5 +39,5 @@ To start a trace follow these steps: | |||||||
|   directory containing the runtime trace. |   directory containing the runtime trace. | ||||||
| - Finally run the `ovniemu ovni` command to generate the Paraver traces. | - Finally run the `ovniemu ovni` command to generate the Paraver traces. | ||||||
| - Use the command `wxparaver ovni/cpu.prv` to load the CPU trace. | - Use the command `wxparaver ovni/cpu.prv` to load the CPU trace. | ||||||
| - Load the configurations from the `cfg/` directory that you are | - Load the configurations from the `ovni/cfg/` directory that you are | ||||||
|   interested in, to open a timeline view. |   interested in, to open a timeline view. | ||||||
|  | |||||||
| @ -8,6 +8,9 @@ add_library(ovni SHARED | |||||||
| 
 | 
 | ||||||
| target_include_directories(ovni PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) | target_include_directories(ovni PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) | ||||||
| 
 | 
 | ||||||
|  | configure_file("config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h" ) | ||||||
|  | include_directories(${CMAKE_CURRENT_BINARY_DIR}) | ||||||
|  | 
 | ||||||
| add_executable(ovniemu | add_executable(ovniemu | ||||||
|   chan.c |   chan.c | ||||||
|   emu.c |   emu.c | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								src/config.h.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/config.h.in
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | /* Copyright (c) 2022 Barcelona Supercomputing Center (BSC)
 | ||||||
|  |  * SPDX-License-Identifier: GPL-3.0-or-later */ | ||||||
|  | 
 | ||||||
|  | #ifndef OVNI_CONFIG_H | ||||||
|  | #define OVNI_CONFIG_H | ||||||
|  | 
 | ||||||
|  | #cmakedefine OVNI_CONFIG_DIR "@OVNI_CONFIG_DIR@" | ||||||
|  | 
 | ||||||
|  | #endif /* OVNI_CONFIG_H */ | ||||||
							
								
								
									
										147
									
								
								src/emu.c
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								src/emu.c
									
									
									
									
									
								
							| @ -13,9 +13,11 @@ | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||||
|  | #include <sys/wait.h> | ||||||
| #include <time.h> | #include <time.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| 
 | 
 | ||||||
|  | #include "config.h" | ||||||
| #include "chan.h" | #include "chan.h" | ||||||
| #include "emu.h" | #include "emu.h" | ||||||
| #include "ovni.h" | #include "ovni.h" | ||||||
| @ -1039,6 +1041,149 @@ emu_init(struct ovni_emu *emu, int argc, char *argv[]) | |||||||
| 			emu->total_nthreads); | 			emu->total_nthreads); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int | ||||||
|  | copy_file(const char *src, const char *dst) | ||||||
|  | { | ||||||
|  | 	char buffer[1024]; | ||||||
|  | 
 | ||||||
|  | 	FILE *infile = fopen(src, "r"); | ||||||
|  | 
 | ||||||
|  | 	if (infile == NULL) { | ||||||
|  | 		err("fopen(%s) failed: %s\n", src, strerror(errno)); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	FILE *outfile = fopen(dst, "w"); | ||||||
|  | 
 | ||||||
|  | 	if (outfile == NULL) { | ||||||
|  | 		err("fopen(%s) failed: %s\n", src, strerror(errno)); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	size_t bytes; | ||||||
|  | 	while ((bytes = fread(buffer, 1, sizeof(buffer), infile)) > 0) | ||||||
|  | 		fwrite(buffer, 1, bytes, outfile); | ||||||
|  | 
 | ||||||
|  | 	fclose(outfile); | ||||||
|  | 	fclose(infile); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int | ||||||
|  | copy_recursive(const char *src, const char *dst) | ||||||
|  | { | ||||||
|  | 	DIR *dir; | ||||||
|  | 	int failed = 0; | ||||||
|  | 
 | ||||||
|  | 	if ((dir = opendir(src)) == NULL) { | ||||||
|  | 		err("opendir \"%s\" failed: %s\n", src, strerror(errno)); | ||||||
|  | 		failed = 1; | ||||||
|  | 		goto bay; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (mkdir(dst, 0755) != 0) { | ||||||
|  | 		err("mkdir \"%s\" failed: %s\n", src, strerror(errno)); | ||||||
|  | 		failed = 1; | ||||||
|  | 		goto bay; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Use the heap, as the recursion may exhaust the stack */ | ||||||
|  | 	char *newsrc = calloc(1, PATH_MAX); | ||||||
|  | 	if (newsrc == NULL) | ||||||
|  | 		die("calloc failed\n"); | ||||||
|  | 
 | ||||||
|  | 	char *newdst = calloc(1, PATH_MAX); | ||||||
|  | 	if (newdst == NULL) | ||||||
|  | 		die("calloc failed\n"); | ||||||
|  | 
 | ||||||
|  | 	struct dirent *dirent; | ||||||
|  | 	while ((dirent = readdir(dir)) != NULL) { | ||||||
|  | 		struct stat st; | ||||||
|  | 		sprintf(newsrc, "%s/%s", src, dirent->d_name); | ||||||
|  | 
 | ||||||
|  | 		if (strcmp(dirent->d_name, ".") == 0) | ||||||
|  | 			continue; | ||||||
|  | 
 | ||||||
|  | 		if (strcmp(dirent->d_name, "..") == 0) | ||||||
|  | 			continue; | ||||||
|  | 
 | ||||||
|  | 		int n = snprintf(newsrc, PATH_MAX, "%s/%s", | ||||||
|  | 				src, dirent->d_name); | ||||||
|  | 
 | ||||||
|  | 		if (n >= PATH_MAX) { | ||||||
|  | 			err("path too long \"%s/%s\"\n", src, dirent->d_name); | ||||||
|  | 			failed = 1; | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		int m = snprintf(newdst, PATH_MAX, "%s/%s", | ||||||
|  | 				dst, dirent->d_name); | ||||||
|  | 
 | ||||||
|  | 		if (m >= PATH_MAX) { | ||||||
|  | 			err("path too long \"%s/%s\"\n", dst, dirent->d_name); | ||||||
|  | 			failed = 1; | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (stat(newsrc, &st) != 0) { | ||||||
|  | 			err("stat \"%s\" failed: %s\n", newsrc, | ||||||
|  | 					strerror(errno)); | ||||||
|  | 			failed = 1; | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (S_ISDIR(st.st_mode)) { | ||||||
|  | 			if (copy_recursive(newsrc, newdst) != 0) { | ||||||
|  | 				failed = 1; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			if (copy_file(newsrc, newdst) != 0) { | ||||||
|  | 				failed = 1; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	closedir(dir); | ||||||
|  | 
 | ||||||
|  | 	free(newsrc); | ||||||
|  | 	free(newdst); | ||||||
|  | 
 | ||||||
|  | bay: | ||||||
|  | 	return -failed; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | copy_configs(struct ovni_emu *emu) | ||||||
|  | { | ||||||
|  | 	/* Allow override so we can run the tests without install */ | ||||||
|  | 	char *src = getenv("OVNI_CONFIG_DIR"); | ||||||
|  | 
 | ||||||
|  | 	if (src == NULL) | ||||||
|  | 		src = OVNI_CONFIG_DIR; | ||||||
|  | 
 | ||||||
|  | 	char dst[PATH_MAX]; | ||||||
|  | 	if (snprintf(dst, PATH_MAX, "%s/cfg", emu->tracedir) >= PATH_MAX) { | ||||||
|  | 		err("cannot copy config files: path too long \"%s/cfg\"\n", | ||||||
|  | 				emu->tracedir); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	struct stat st; | ||||||
|  | 	if (stat(dst, &st) == 0) { | ||||||
|  | 		err("existing cfg directory \"%s\", skipping config copy\n", dst); | ||||||
|  | 		if (emu->enable_linter) | ||||||
|  | 			die("cannot continue in linter mode\n"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (copy_recursive(src, dst) != 0) { | ||||||
|  | 		err("warning: cannot copy config files: recursive copy failed\n"); | ||||||
|  | 		if (emu->enable_linter) | ||||||
|  | 			die("cannot continue in linter mode\n"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void | static void | ||||||
| emu_post(struct ovni_emu *emu) | emu_post(struct ovni_emu *emu) | ||||||
| { | { | ||||||
| @ -1048,6 +1193,8 @@ emu_post(struct ovni_emu *emu) | |||||||
| 
 | 
 | ||||||
| 	write_row_cpu(emu); | 	write_row_cpu(emu); | ||||||
| 	write_row_thread(emu); | 	write_row_thread(emu); | ||||||
|  | 
 | ||||||
|  | 	copy_configs(emu); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
|  | |||||||
| @ -46,6 +46,9 @@ function(ovni_test source) | |||||||
|   list(APPEND OVNI_TEST_ENV |   list(APPEND OVNI_TEST_ENV | ||||||
|     "OVNI_CURRENT_DIR=${CMAKE_CURRENT_BINARY_DIR}") |     "OVNI_CURRENT_DIR=${CMAKE_CURRENT_BINARY_DIR}") | ||||||
| 
 | 
 | ||||||
|  |   list(APPEND OVNI_TEST_ENV | ||||||
|  |     "OVNI_CONFIG_DIR=${CMAKE_SOURCE_DIR}/cfg") | ||||||
|  | 
 | ||||||
|   if(OVNI_TEST_SORT) |   if(OVNI_TEST_SORT) | ||||||
|     list(APPEND OVNI_TEST_ENV "OVNI_DO_SORT=1") |     list(APPEND OVNI_TEST_ENV "OVNI_DO_SORT=1") | ||||||
|   endif() |   endif() | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user