public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] SUCCESS: Building U-Boot for MIPS64 on Windows7
@ 2018-08-01 22:48 George Robinson
  2018-08-02 13:23 ` Bin Meng
  0 siblings, 1 reply; 2+ messages in thread
From: George Robinson @ 2018-08-01 22:48 UTC (permalink / raw)
  To: u-boot

I was able to successfully Build U-Boot v2018.07 under Windows 7 SP1 
(64bit)
- under MinGW64_NT-6.1 ( a.k.a. MSYS2 or MSYS64 )
- using the native host toolchain (with GCC v7.3.0 for x86_64 code 
generation on x86_64 CPU)
- using the target toolchain (with GCC v5.3.0 for MIPS code generation 
on x86_64 CPU (Sourcery CodeBench Lite 2016.05-8) )

by modifying the function parse_dep_file() defnied in 
u-boot-master/scripts/basic/fixdep.c, as illustrated below:

The change was necessary because the command "gcc cc -Wp,-MD, 
dependencyfile.o.d..." generates a dependency file containg Windows 
style paths like:
C:\src\bin
...instead of the Linux like path, like:
/c/src/bin


static void parse_dep_file(void *map, size_t len)
{
	char *m = map;
	char *end = m + len;
	char *p;
	char s[PATH_MAX];
	int is_target;
	int saw_any_target = 0;
	int is_first_dep = 0;

	while (m < end) {
		/* Skip any "white space" */
		while (m < end && (*m == ' ' || *m == '\t' || *m == '\\' || *m == '\r' 
|| *m == '\n'))
			m++;
		/* Skip any "non-white space" */
		p = m;
		while (p < end && *p != ' ' && *p != '\t' && *p != '\\' && *p != '\r' 
&& *p != '\n')
			p++;

		/* Convert any Windows paths into Cygwin paths, just like "cygpath -u 
<windowspath>" would do. */
		if( ( (p-m) >=2) && (*(m+1) == ':') && ((*(m+2) == '/') || (*(m+2) == 
'\\')) && (((*m>='A') && (*m<='Z')) || ((*m>='a') && (*m<='z'))) )
		{
			*(m+1)= (*m) | 0x20;  //Convert the drive letter to lowercase and 
move it where the colon was
			*m = '/';  //Prepend a forward slash
			//*(m+2) = '/';  //Make sure a forward slash follows the drive letter

                         // Substitute remaining backslashes in the 
Windows path, with forward slashes
			while (p < end && *p != ' ' && *p != '\t'  && *p != '\r' && *p != 
'\n')
			{
				if(*p == '\\')
					*p = '/';
				p++;
			}
#ifdef FIXDEP_DBG
			fprintf(stderr,"FIXDEP: Windows path@%ld= %s\n", m-(char*)map, m);
#endif
		}

		/* Is the token we found a target name? */
		is_target = (*(p-1) == ':');
		/* Don't write any target names into the dependency file */
		if (is_target) {
			/* The /next/ file is the first dependency */
			is_first_dep = 1;
		} else if( (p-m) > 0 )
		{	/* Save this token/filename */
			memcpy(s, m, p-m);
			s[p - m] = 0;


			/* Ignore certain dependencies */
			if (strrcmp(s, "include/generated/autoconf.h") &&
			    strrcmp(s, "arch/um/include/uml-config.h") &&
			    strrcmp(s, "include/linux/kconfig.h") &&
			    strrcmp(s, ".ver")) {
				/*
				 * Do not list the source file as dependency,
				 * so that kbuild is not confused if a .c file
				 * is rewritten into .S or vice versa. Storing
				 * it in source_* is needed for modpost to
				 * compute srcversions.
				 */
				if (is_first_dep) {
					/*
					 * If processing the concatenation of
					 * multiple dependency files, only
					 * process the first target name, which
					 * will be the original source name,
					 * and ignore any other target names,
					 * which will be intermediate temporary
					 * files.
					 */
					if (!saw_any_target) {
						saw_any_target = 1;
						printf("source_%s := %s\n\n",
							target, s);
						printf("deps_%s := \\\n",
							target);
					}
					is_first_dep = 0;
				} else
					printf("  %s \\\n", s);
				do_config_file(s);
			}
		}
		/*
		 * Start searching for next token immediately after the first
		 * "whitespace" character that follows this token.
		 */
		m = p + 1;
	}

	if (!saw_any_target) {
		fprintf(stderr, "fixdep: parse error; no targets found\n");
		exit(1);
	}

	printf("\n%s: $(deps_%s)\n\n", target, target);
	printf("$(deps_%s):\n", target);
}

Also the command "gcc -print-file-name=include" generates such Windows 
style paths.
They can be adjusted by patching the NOSTDINC_FLAGS assignment in the 
main Makefile as such:

PossiblyWinPath  = $(shell $(CC) -print-file-name=include)
NOSTDINC_FLAGS += -nostdinc -isystem $(shell cygpath -u $(subst 
\\,\/,$(PossiblyWinPath)))
CHECKFLAGS     += $(NOSTDINC_FLAGS)


Besides the above, in order to get it to compile I had to define the 
following data types because they were Linux-specific and were not 
defined in the sys/types.h belonging to MinGW64.

#ifdef __CHECKER__
#define __bitwise__ __attribute__((bitwise))
#else
#define __bitwise__
#endif
#ifdef __CHECK_ENDIAN__
#define __bitwise __bitwise__
#else
#define __bitwise
#endif

typedef		unsigned short 	        __u16;
typedef		unsigned int 	        __u32;
typedef		unsigned long long int 	__u64;


typedef __u16 __bitwise __le16;
typedef __u16 __bitwise __be16;
typedef __u32 __bitwise __le32;
typedef __u32 __bitwise __be32;
#if defined(__GNUC__)
typedef __u64 __bitwise __le64;
typedef __u64 __bitwise __be64;
#endif
typedef __u16 __bitwise __sum16;
typedef __u32 __bitwise __wsum;


Also, I had to add:
#include <linux/byteorder/swab.h>

...to the file tools/zynqmpbif.c, because__swab32 was not defined 
anywhere in the default headers.


Is, this of any interest to anyone ?

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [U-Boot] SUCCESS: Building U-Boot for MIPS64 on Windows7
  2018-08-01 22:48 [U-Boot] SUCCESS: Building U-Boot for MIPS64 on Windows7 George Robinson
@ 2018-08-02 13:23 ` Bin Meng
  0 siblings, 0 replies; 2+ messages in thread
From: Bin Meng @ 2018-08-02 13:23 UTC (permalink / raw)
  To: u-boot

Hi,

On Thu, Aug 2, 2018 at 6:48 AM, George Robinson
<george.robinson@prototech.us> wrote:
> I was able to successfully Build U-Boot v2018.07 under Windows 7 SP1 (64bit)
> - under MinGW64_NT-6.1 ( a.k.a. MSYS2 or MSYS64 )
> - using the native host toolchain (with GCC v7.3.0 for x86_64 code
> generation on x86_64 CPU)
> - using the target toolchain (with GCC v5.3.0 for MIPS code generation on
> x86_64 CPU (Sourcery CodeBench Lite 2016.05-8) )
>
> by modifying the function parse_dep_file() defnied in
> u-boot-master/scripts/basic/fixdep.c, as illustrated below:
>
> The change was necessary because the command "gcc cc -Wp,-MD,
> dependencyfile.o.d..." generates a dependency file containg Windows style
> paths like:
> C:\src\bin
> ...instead of the Linux like path, like:
> /c/src/bin
>
>
> static void parse_dep_file(void *map, size_t len)
> {
>         char *m = map;
>         char *end = m + len;
>         char *p;
>         char s[PATH_MAX];
>         int is_target;
>         int saw_any_target = 0;
>         int is_first_dep = 0;
>
>         while (m < end) {
>                 /* Skip any "white space" */
>                 while (m < end && (*m == ' ' || *m == '\t' || *m == '\\' ||
> *m == '\r' || *m == '\n'))
>                         m++;
>                 /* Skip any "non-white space" */
>                 p = m;
>                 while (p < end && *p != ' ' && *p != '\t' && *p != '\\' &&
> *p != '\r' && *p != '\n')
>                         p++;
>
>                 /* Convert any Windows paths into Cygwin paths, just like
> "cygpath -u <windowspath>" would do. */
>                 if( ( (p-m) >=2) && (*(m+1) == ':') && ((*(m+2) == '/') ||
> (*(m+2) == '\\')) && (((*m>='A') && (*m<='Z')) || ((*m>='a') && (*m<='z')))
> )
>                 {
>                         *(m+1)= (*m) | 0x20;  //Convert the drive letter to
> lowercase and move it where the colon was
>                         *m = '/';  //Prepend a forward slash
>                         //*(m+2) = '/';  //Make sure a forward slash follows
> the drive letter
>
>                         // Substitute remaining backslashes in the Windows
> path, with forward slashes
>                         while (p < end && *p != ' ' && *p != '\t'  && *p !=
> '\r' && *p != '\n')
>                         {
>                                 if(*p == '\\')
>                                         *p = '/';
>                                 p++;
>                         }
> #ifdef FIXDEP_DBG
>                         fprintf(stderr,"FIXDEP: Windows path at %ld= %s\n",
> m-(char*)map, m);
> #endif
>                 }
>
>                 /* Is the token we found a target name? */
>                 is_target = (*(p-1) == ':');
>                 /* Don't write any target names into the dependency file */
>                 if (is_target) {
>                         /* The /next/ file is the first dependency */
>                         is_first_dep = 1;
>                 } else if( (p-m) > 0 )
>                 {       /* Save this token/filename */
>                         memcpy(s, m, p-m);
>                         s[p - m] = 0;
>
>
>                         /* Ignore certain dependencies */
>                         if (strrcmp(s, "include/generated/autoconf.h") &&
>                             strrcmp(s, "arch/um/include/uml-config.h") &&
>                             strrcmp(s, "include/linux/kconfig.h") &&
>                             strrcmp(s, ".ver")) {
>                                 /*
>                                  * Do not list the source file as
> dependency,
>                                  * so that kbuild is not confused if a .c
> file
>                                  * is rewritten into .S or vice versa.
> Storing
>                                  * it in source_* is needed for modpost to
>                                  * compute srcversions.
>                                  */
>                                 if (is_first_dep) {
>                                         /*
>                                          * If processing the concatenation
> of
>                                          * multiple dependency files, only
>                                          * process the first target name,
> which
>                                          * will be the original source name,
>                                          * and ignore any other target
> names,
>                                          * which will be intermediate
> temporary
>                                          * files.
>                                          */
>                                         if (!saw_any_target) {
>                                                 saw_any_target = 1;
>                                                 printf("source_%s :=
> %s\n\n",
>                                                         target, s);
>                                                 printf("deps_%s := \\\n",
>                                                         target);
>                                         }
>                                         is_first_dep = 0;
>                                 } else
>                                         printf("  %s \\\n", s);
>                                 do_config_file(s);
>                         }
>                 }
>                 /*
>                  * Start searching for next token immediately after the
> first
>                  * "whitespace" character that follows this token.
>                  */
>                 m = p + 1;
>         }
>
>         if (!saw_any_target) {
>                 fprintf(stderr, "fixdep: parse error; no targets found\n");
>                 exit(1);
>         }
>
>         printf("\n%s: $(deps_%s)\n\n", target, target);
>         printf("$(deps_%s):\n", target);
> }
>
> Also the command "gcc -print-file-name=include" generates such Windows style
> paths.
> They can be adjusted by patching the NOSTDINC_FLAGS assignment in the main
> Makefile as such:
>
> PossiblyWinPath  = $(shell $(CC) -print-file-name=include)
> NOSTDINC_FLAGS += -nostdinc -isystem $(shell cygpath -u $(subst
> \\,\/,$(PossiblyWinPath)))
> CHECKFLAGS     += $(NOSTDINC_FLAGS)
>
>
> Besides the above, in order to get it to compile I had to define the
> following data types because they were Linux-specific and were not defined
> in the sys/types.h belonging to MinGW64.
>
> #ifdef __CHECKER__
> #define __bitwise__ __attribute__((bitwise))
> #else
> #define __bitwise__
> #endif
> #ifdef __CHECK_ENDIAN__
> #define __bitwise __bitwise__
> #else
> #define __bitwise
> #endif
>
> typedef         unsigned short          __u16;
> typedef         unsigned int            __u32;
> typedef         unsigned long long int  __u64;
>
>
> typedef __u16 __bitwise __le16;
> typedef __u16 __bitwise __be16;
> typedef __u32 __bitwise __le32;
> typedef __u32 __bitwise __be32;
> #if defined(__GNUC__)
> typedef __u64 __bitwise __le64;
> typedef __u64 __bitwise __be64;
> #endif
> typedef __u16 __bitwise __sum16;
> typedef __u32 __bitwise __wsum;
>
>
> Also, I had to add:
> #include <linux/byteorder/swab.h>
>
> ...to the file tools/zynqmpbif.c, because__swab32 was not defined anywhere
> in the default headers.
>
>
> Is, this of any interest to anyone ?
>

Yes, please get the patch properly formatted and submit to the ML for
review and testing. Thanks!

Regards,
Bin

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-08-02 13:23 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-08-01 22:48 [U-Boot] SUCCESS: Building U-Boot for MIPS64 on Windows7 George Robinson
2018-08-02 13:23 ` Bin Meng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox