Fixed on GIT Erro: sh: ./gradlew: Permission denied

zuibaf

New Member
Joined
Sep 29, 2017
In the new version, I have the same problem.
The detail is what the implementation of copyFile, in Linux, it simply creates a new file in the destination with the default permissions as if you were creating a new file on the system if it had been using the file manager, then it makes a bit copy to bit from the source file to the destination file.
Probably what's missing in copyFile is to copy the permissions from the source file to the destination file.
I think this is it.
 

dawlane

Active Member
CX Code Contributor
Joined
Jun 21, 2017
The copy routines are pretty basic. I don't think that Mark gave much thought to copying over the permissions along with a file.
 

MikeHart

Administrator
Staff member
Joined
Jun 19, 2017
Location
Germany
Well with me it was the template. Once i chmodded its permission, i was able to pass this step. Now i am fighting a java sdk problem. I will get there eventually.
 

dawlane

Active Member
CX Code Contributor
Joined
Jun 21, 2017
Well with me it was the template. Once i chmodded its permission
I will have to have a look to see permission can be copied on the C/C++ side for *nix systems using stat/lstat/fstat without too much trouble.
 

dawlane

Active Member
CX Code Contributor
Joined
Jun 21, 2017
What's basically happening is that when a target template is getting copied over, the file attributes are not being duplicated.
This is a bug with the original MonkeyX code copy function.

This is my fix that I was working on for it:
in modules/os/native/os.cpp:
int CopyFile( String srcpath,String dstpath ){

#if _WIN32

    if( CopyFileW( OS_STR(srcpath),OS_STR(dstpath),FALSE ) ) return 1;
    return 0;

#elif __APPLE__

    // Would like to use COPY_ALL here, but it breaks trans on MacOS - produces weird 'pch out of date' error with copied projects.
    //
    // Ranlib strikes back!
    //
    // DAWLANE - Added file attributes COPYFILE_XATTR | COPYFILE_STAT (NEEDS CONFIRMING)
    if( copyfile( OS_STR(srcpath),OS_STR(dstpath),0,COPYFILE_XATTR | COPYFILE_STAT | COPYFILE_DATA )>=0 ) return 1;
    return 0;

#else

    int err=-1;
    if( FILE *srcp=_fopen( OS_STR( srcpath ),OS_STR( "rb" ) ) ){
        err=-2;
        if( FILE *dstp=_fopen( OS_STR( dstpath ),OS_STR( "wb" ) ) ){
            err=0;
            char buf[1024];
            while( int n=fread( buf,1,1024,srcp ) ){
                if( fwrite( buf,1,n,dstp )!=n ){
                    err=-3;
                    break;
                }
            }
            fclose( dstp );
     
            // DAWLANE - Copy over the file attributes.
            struct stat st;
            stat( OS_STR( srcpath ), &st );
            chmod( OS_STR( dstpath ), st.st_mode );
        }else{
//            printf( "FOPEN 'wb' for CopyFile(%s,%s) failed\n",C_STR(srcpath),C_STR(dstpath) );
            fflush( stdout );
        }
        fclose( srcp );
    }else{
//        printf( "FOPEN 'rb' for CopyFile(%s,%s) failed\n",C_STR(srcpath),C_STR(dstpath) );
        fflush( stdout );
    }
    return err==0;

#endif
}
Once the permissions are correctly set on the offending file, they should copy over.
 
Last edited:

zuibaf

New Member
Joined
Sep 29, 2017
I made the change in the "os.cpp" file, inside the "modules /os/native/" directory, reexecuted "rebuildall.sh", generated the binary. I was trying to compile for the android target, however, the error persists.
So I went to analyze the file "rebuildall.sh", in this line:

#Make transcc
echo "building transcc"
g++ -O3 -DNDEBUG -o ../bin/transcc_linux transcc/transcc.build/cpptool/main.cpp -lpthread

I was parsing the file "main.cpp", and realized that the file "os.cpp", is inside the "main.cpp", line: 2187 to 2520.
That is, the CopyFile that has been fixed, is the CopyFile of the module, so far so good, when you import module "os", "transcc" will use copyFile having nothing to do with compilation for any target.

In short, when you compile, transcc, internally, transcc makes the copy using the CopyFile of the main.cpp file, then you should also correct the command "CopyFile" of the file "main.cpp", which is the " transcc ".

I made the changes here, in the file "os.cpp" and "main.cpp", even then, the error persisted.

Analyzing the "MakeTarget: Void ()" method of the AndroidBuilder class in the file "android.cxs", between lines 173 and 180, specifically:


Cerberus X:
If HostOS = "winnt"
                gradle="gradlew"
            Else
                gradle="./gradlew"
            Endif
            If Not( Execute( gradle+" clean " + gradlecfg, False ) )
And in the file "main.cpp", in lines 8007 and 8013, which corresponds to the lines "173 to 180" of file "android.cxs", that when the platform is not windows, the command to be executed is "./gradlew ".

However, when copying the "gradlew" file that is inside the source directory: "targets/android/template /gradletemplate" with the new "CopyFile" corrected, the permissions are being copied correctly, however, as in the source directory the file "gradlew" was never permission of executing, the "gradlew" file in the target directory will also not be permission of executing in "linux" and "macos".

In short, in addition to correcting the "CopyFile" function in the "os.cpp" and "main.cpp" files, you must change the permission to execute in the "gradlew" file, which is in the directory "targets/android/template/gradletemplate".
 

zuibaf

New Member
Joined
Sep 29, 2017
I did the test here, I went there in the directory I changed the permission of the file "gradlew", from the directory: targets/android/template/gradletemplate "which was like this:
from
rw-rw-r--,
to
rwxrwxr-x
and the android target is working correctly now.
 

dawlane

Active Member
CX Code Contributor
Joined
Jun 21, 2017
@MikeHart : There is also the same c++ function in brl/native/filesystem.cpp that will need updating.

In short, in addition to correcting the "CopyFile" function in the "os.cpp" and "main.cpp" files, you must change the permission to execute in the "gradlew" file, which is in the directory "targets/android/template/gradletemplate".
You could have just. Have just made the change to os.cpp and rebuilt transcc with transcc, tested the binary and if it worked, replace the old transcc.build directory with the new build. And set the execute permission to the gradletemplate.
 

MikeHart

Administrator
Staff member
Joined
Jun 19, 2017
Location
Germany
Fix for CopyFile is on GitHub. The permission in the template is altered for the next release.
 
Top Bottom