• Dear Cerberus X User!

    As we prepare to transition the forum ownership from Mike to Phil (TripleHead GmbH), we need your explicit consent to transfer your user data in accordance with our amended Terms and Rules in order to be compliant with data protection laws.

    Important: If you accept the amended Terms and Rules, you agree to the transfer of your user data to the future forum owner!

    Please read the new Terms and Rules below, check the box to agree, and click "Accept" to continue enjoying your Cerberus X Forum experience. The deadline for consent is April 5, 2024.

    Do not accept the amended Terms and Rules if you do not wish your personal data to be transferred to the future forum owner!

    Accepting ensures:

    - Continued access to your account with a short break for the actual transfer.

    - Retention of your data under the same terms.

    Without consent:

    - You don't have further access to your forum user account.

    - Your account and personal data will be deleted after April 5, 2024.

    - Public posts remain, but usernames indicating real identity will be anonymized. If you disagree with a fictitious name you have the option to contact us so we can find a name that is acceptable to you.

    We hope to keep you in our community and see you on the forum soon!

    All the best

    Your Cerberus X Team

Fixed Erro: sh: ./gradlew: Permission denied

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.
 
The copy routines are pretty basic. I don't think that Mark gave much thought to copying over the permissions along with a file.
 
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.
 
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.
 
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:
Code:
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:
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:
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".
 
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.
 
@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.
 
Fix for CopyFile is on GitHub. The permission in the template is altered for the next release.
 
Back
Top Bottom