@@ -42,85 +42,93 @@ fn copy_includes<P: AsRef<Path>, Q: AsRef<Path> + std::fmt::Debug>(include_dir:
4242fn cargo_main ( ) {
4343 println ! ( "cargo:rerun-if-changed=third_party" ) ;
4444
45- let mut cfg = cc:: Build :: new ( ) ;
45+ let target = env:: var ( "TARGET" ) . expect ( "cargo TARGET not set" ) ;
46+ let is_x86_64 = target. starts_with ( "x86_64" ) ;
4647
47- if cfg ! ( feature = "printf" ) {
48- cfg. include ( "third_party/printf" )
49- . file ( "third_party/printf/printf.c" ) ;
50- }
48+ // Skip C/musl compilation on aarch64 since no musl support yet
49+ if is_x86_64 {
50+ let mut cfg = cc:: Build :: new ( ) ;
51+
52+ if cfg ! ( feature = "printf" ) {
53+ cfg. include ( "third_party/printf" )
54+ . file ( "third_party/printf/printf.c" ) ;
55+ }
5156
52- if cfg ! ( feature = "libc" ) {
53- let entries = glob:: glob ( "third_party/musl/**/*.[cs]" ) // .c and .s files
54- . expect ( "glob pattern should be valid" )
55- . filter_map ( Result :: ok) ;
56- cfg. files ( entries) ;
57+ if cfg ! ( feature = "libc" ) {
58+ let entries = glob:: glob ( "third_party/musl/**/*.[cs]" ) // .c and .s files
59+ . expect ( "glob pattern should be valid" )
60+ . filter_map ( Result :: ok) ;
61+ cfg. files ( entries) ;
5762
58- cfg. include ( "third_party/musl/src/include" )
59- . include ( "third_party/musl/include" )
60- . include ( "third_party/musl/src/internal" )
61- . include ( "third_party/musl/arch/generic" )
62- . include ( "third_party/musl/arch/x86_64" ) ;
63- }
63+ cfg. include ( "third_party/musl/src/include" )
64+ . include ( "third_party/musl/include" )
65+ . include ( "third_party/musl/src/internal" )
66+ . include ( "third_party/musl/arch/generic" )
67+ . include ( "third_party/musl/arch/x86_64" ) ;
68+ }
6469
65- if cfg ! ( any( feature = "printf" , feature = "libc" ) ) {
66- cfg. define ( "HYPERLIGHT" , None ) ; // used in certain musl files for conditional compilation
70+ if cfg ! ( any( feature = "printf" , feature = "libc" ) ) {
71+ cfg. define ( "HYPERLIGHT" , None ) ; // used in certain musl files for conditional compilation
6772
68- // silence compiler warnings
69- cfg. flag ( "-Wno-unused-command-line-argument" ) // including .s files makes clang believe arguments are unused
70- . flag ( "-Wno-sign-compare" )
71- . flag ( "-Wno-bitwise-op-parentheses" )
72- . flag ( "-Wno-unknown-pragmas" )
73- . flag ( "-Wno-shift-op-parentheses" )
74- . flag ( "-Wno-logical-op-parentheses" )
75- . flag ( "-Wno-unused-but-set-variable" )
76- . flag ( "-Wno-unused-parameter" )
77- . flag ( "-Wno-string-plus-int" ) ;
73+ // silence compiler warnings
74+ cfg. flag ( "-Wno-unused-command-line-argument" ) // including .s files makes clang believe arguments are unused
75+ . flag ( "-Wno-sign-compare" )
76+ . flag ( "-Wno-bitwise-op-parentheses" )
77+ . flag ( "-Wno-unknown-pragmas" )
78+ . flag ( "-Wno-shift-op-parentheses" )
79+ . flag ( "-Wno-logical-op-parentheses" )
80+ . flag ( "-Wno-unused-but-set-variable" )
81+ . flag ( "-Wno-unused-parameter" )
82+ . flag ( "-Wno-string-plus-int" ) ;
7883
79- cfg. flag ( "-fPIC" ) ;
80- // This is a terrible hack, because
81- // - we need stack clash protection, because we have put the
82- // stack right smack in the middle of everything in the guest
83- // - clang refuses to do stack clash protection unless it is
84- // required by a target ABI (Windows, MacOS) or the target is
85- // is Linux or FreeBSD (see Clang.cpp RenderSCPOptions
86- // https://github.com/llvm/llvm-project/blob/1bb52e9/clang/lib/Driver/ToolChains/Clang.cpp#L3724).
87- // Hopefully a flag to force stack clash protection on generic
88- // targets will eventually show up.
89- cfg. flag ( "--target=x86_64-unknown-linux-none" ) ;
84+ cfg. flag ( "-fPIC" ) ;
85+ // This is a terrible hack, because
86+ // - we need stack clash protection, because we have put the
87+ // stack right smack in the middle of everything in the guest
88+ // - clang refuses to do stack clash protection unless it is
89+ // required by a target ABI (Windows, MacOS) or the target is
90+ // is Linux or FreeBSD (see Clang.cpp RenderSCPOptions
91+ // https://github.com/llvm/llvm-project/blob/1bb52e9/clang/lib/Driver/ToolChains/Clang.cpp#L3724).
92+ // Hopefully a flag to force stack clash protection on generic
93+ // targets will eventually show up.
94+ cfg. flag ( "--target=x86_64-unknown-linux-none" ) ;
9095
91- // We don't use a different stack for all interrupts, so there
92- // can be no red zone
93- cfg. flag ( "-mno-red-zone" ) ;
96+ // We don't use a different stack for all interrupts, so there
97+ // can be no red zone
98+ cfg. flag ( "-mno-red-zone" ) ;
9499
95- // We don't support stack protectors at the moment, but Arch Linux clang
96- // auto-enables them for -linux platforms, so explicitly disable them.
97- cfg. flag ( "-fno-stack-protector" ) ;
98- cfg. flag ( "-fstack-clash-protection" ) ;
99- cfg. flag ( "-mstack-probe-size=4096" ) ;
100- cfg. compiler (
101- env:: var ( "HYPERLIGHT_GUEST_clang" )
102- . as_deref ( )
103- . unwrap_or ( "clang" ) ,
104- ) ;
100+ // We don't support stack protectors at the moment, but Arch Linux clang
101+ // auto-enables them for -linux platforms, so explicitly disable them.
102+ cfg. flag ( "-fno-stack-protector" ) ;
103+ cfg. flag ( "-fstack-clash-protection" ) ;
104+ cfg. flag ( "-mstack-probe-size=4096" ) ;
105+ cfg. compiler (
106+ env:: var ( "HYPERLIGHT_GUEST_clang" )
107+ . as_deref ( )
108+ . unwrap_or ( "clang" ) ,
109+ ) ;
105110
106- if cfg ! ( windows) {
107- unsafe { env:: set_var ( "AR_x86_64_unknown_none" , "llvm-ar" ) } ;
111+ if cfg ! ( windows) {
112+ unsafe { env:: set_var ( "AR_x86_64_unknown_none" , "llvm-ar" ) } ;
113+ }
114+ cfg. compile ( "hyperlight_guest_bin" ) ;
108115 }
109- cfg. compile ( "hyperlight_guest_bin" ) ;
110116 }
111117
112118 let out_dir = env:: var ( "OUT_DIR" ) . expect ( "cargo OUT_DIR not set" ) ;
113119 let include_dir = PathBuf :: from ( & out_dir) . join ( "include" ) ;
114120 fs:: create_dir_all ( & include_dir)
115121 . unwrap_or_else ( |e| panic ! ( "Could not create include dir {:?}: {}" , & include_dir, e) ) ;
116- if cfg ! ( feature = "printf" ) {
117- copy_includes ( & include_dir, "third_party/printf/" ) ;
118- }
119- if cfg ! ( feature = "libc" ) {
120- copy_includes ( & include_dir, "third_party/musl/include" ) ;
121- copy_includes ( & include_dir, "third_party/musl/arch/generic" ) ;
122- copy_includes ( & include_dir, "third_party/musl/arch/x86_64" ) ;
123- copy_includes ( & include_dir, "third_party/musl/src/internal" ) ;
122+ if is_x86_64 {
123+ if cfg ! ( feature = "printf" ) {
124+ copy_includes ( & include_dir, "third_party/printf/" ) ;
125+ }
126+ if cfg ! ( feature = "libc" ) {
127+ copy_includes ( & include_dir, "third_party/musl/include" ) ;
128+ copy_includes ( & include_dir, "third_party/musl/arch/generic" ) ;
129+ copy_includes ( & include_dir, "third_party/musl/arch/x86_64" ) ;
130+ copy_includes ( & include_dir, "third_party/musl/src/internal" ) ;
131+ }
124132 }
125133 /* do not canonicalize: clang has trouble with UNC paths */
126134 let include_str = include_dir
0 commit comments