Browse Source

`odin package android`

gingerBill 5 tháng trước cách đây
mục cha
commit
6689c722ad
3 tập tin đã thay đổi với 72 bổ sung58 xóa
  1. 2 2
      src/build_settings.cpp
  2. 21 13
      src/main.cpp
  3. 49 43
      src/package_command.cpp

+ 2 - 2
src/build_settings.cpp

@@ -1547,13 +1547,13 @@ gb_internal void init_android_values(bool with_sdk) {
 		bc->ODIN_ANDROID_NDK_TOOLCHAIN = normalize_path(permanent_allocator(), bc->ODIN_ANDROID_NDK_TOOLCHAIN, NIX_SEPARATOR_STRING);
 	}
 
-	if (bc->ODIN_ANDROID_NDK.len == 0)  {
+	if (bc->ODIN_ANDROID_NDK.len == 0 && !with_sdk)  {
 		gb_printf_err("Error: ODIN_ANDROID_NDK not set");
 		gb_exit(1);
 
 	}
 
-	if (bc->ODIN_ANDROID_NDK_TOOLCHAIN.len == 0)  {
+	if (bc->ODIN_ANDROID_NDK_TOOLCHAIN.len == 0 && !with_sdk)  {
 		gb_printf_err("Error: ODIN_ANDROID_NDK not set");
 		gb_exit(1);
 	}

+ 21 - 13
src/main.cpp

@@ -74,7 +74,7 @@ gb_global Timings global_timings = {0};
 #include "cached.cpp"
 
 #include "linker.cpp"
-#include "package_android.cpp"
+#include "package_command.cpp"
 
 #if defined(GB_SYSTEM_WINDOWS) && defined(ODIN_TILDE_BACKEND)
 #define ALLOW_TILDE 1
@@ -629,9 +629,9 @@ gb_internal bool parse_build_flags(Array<String> args) {
 	add_flag(&build_flags, BuildFlag_Subsystem,               str_lit("subsystem"),                 BuildFlagParam_String,  Command__does_build);
 #endif
 
-	add_flag(&build_flags, BuildFlag_AndroidKeystore,         str_lit("android-keystore"),          BuildFlagParam_String,  Command__does_build | Command_package_android);
-	add_flag(&build_flags, BuildFlag_AndroidKeystoreAlias,    str_lit("android-keystore-alias"),    BuildFlagParam_String,  Command__does_build | Command_package_android);
-	add_flag(&build_flags, BuildFlag_AndroidManifest,         str_lit("android-manifest"),          BuildFlagParam_String,  Command__does_build | Command_package_android);
+	add_flag(&build_flags, BuildFlag_AndroidKeystore,         str_lit("android-keystore"),          BuildFlagParam_String,  Command_package_android);
+	add_flag(&build_flags, BuildFlag_AndroidKeystoreAlias,    str_lit("android-keystore-alias"),    BuildFlagParam_String,  Command_package_android);
+	add_flag(&build_flags, BuildFlag_AndroidManifest,         str_lit("android-manifest"),          BuildFlagParam_String,  Command_package_android);
 
 
 	GB_ASSERT(args.count >= 3);
@@ -2260,8 +2260,10 @@ gb_internal void print_show_help(String const arg0, String command, String optio
 	} else if (command == "strip-semicolon") {
 		print_usage_line(1, "strip-semicolon");
 		print_usage_line(2, "Parses and type checks .odin file(s) and then removes unneeded semicolons from the entire project.");
-	} else if (command == "package-android")  {
-		print_usage_line(1, "package-android   Packages directory in a specific layout as an APK");
+	} else if (command == "package")  {
+		print_usage_line(1, "package <platform>   Packages directory in a specific layout for that platform");
+		print_usage_line(2, "Supported platforms:");
+		print_usage_line(3, "android");
 	}
 
 	bool doc             = command == "doc";
@@ -3325,13 +3327,19 @@ int main(int arg_count, char const **arg_ptr) {
 			print_show_help(args[0], args[1], args[2]);
 			return 0;
 		}
-	} else if (command == "package-android") {
-		if (args.count < 3) {
+	} else if (command == "package") {
+		if (args.count < 4) {
 			usage(args[0]);
 			return 1;
 		}
-		build_context.command_kind = Command_package_android;
-		init_filename = args[2];
+		if (args[2] == "android") {
+			build_context.command_kind = Command_package_android;
+		} else {
+			gb_printf_err("Unknown package command: '%.*s'\n", LIT(args[2]));
+			usage(args[0]);
+			return 1;
+		}
+		init_filename = args[3];
 	} else if (command == "root") {
 		gb_printf("%.*s", LIT(odin_root_dir()));
 		return 0;
@@ -3366,7 +3374,7 @@ int main(int arg_count, char const **arg_ptr) {
 			}
 
 			if (!single_file_package) {
-				gb_printf_err("ERROR: `%.*s %.*s` takes a package as its first argument.\n", LIT(args[0]), LIT(command));
+				gb_printf_err("ERROR: `%.*s %.*s` takes a package/directory as its first argument.\n", LIT(args[0]), LIT(command));
 				if (init_filename == "-file") {
 					gb_printf_err("Did you mean `%.*s %.*s <filename.odin> -file`?\n", LIT(args[0]), LIT(command));
 				} else {
@@ -3407,8 +3415,8 @@ int main(int arg_count, char const **arg_ptr) {
 		return 0;
 	}
 
-	if (command == "package-android") {
-		return package_android(args);
+	if (command == "package") {
+		return package(init_filename);
 	}
 
 	// NOTE(bill): add 'shared' directory if it is not already set

+ 49 - 43
src/package_android.cpp → src/package_command.cpp

@@ -1,17 +1,22 @@
-i32 package_android(Array<String> args) {
+i32 package_android(String init_directory);
+
+i32 package(String init_directory) {
+	switch (build_context.command_kind) {
+	case Command_package_android:
+		return package_android(init_directory);
+	}
+	gb_printf_err("Unknown odin package <platform>\n");
+	return 1;
+}
+
+
+i32 package_android(String init_directory) {
 	i32 result = 0;
 
 	init_android_values(/*with_sdk*/true);
 
 	int const ODIN_ANDROID_API_LEVEL = build_context.ODIN_ANDROID_API_LEVEL;
 
-	String ODIN_ANDROID_NDK                     = build_context.ODIN_ANDROID_NDK;
-	String ODIN_ANDROID_NDK_TOOLCHAIN           = build_context.ODIN_ANDROID_NDK_TOOLCHAIN;
-	String ODIN_ANDROID_NDK_TOOLCHAIN_LIB       = build_context.ODIN_ANDROID_NDK_TOOLCHAIN_LIB;
-	String ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL = build_context.ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL;
-	String ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT   = build_context.ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT;
-
-
 	String android_sdk_build_tools = concatenate3_strings(temporary_allocator(),
 		build_context.ODIN_ANDROID_SDK, str_lit("build-tools"), NIX_SEPARATOR_STRING);
 
@@ -105,58 +110,59 @@ i32 package_android(Array<String> args) {
 		make_string_c(gb_bprintf("platforms/android-%d/", dir_numbers[closest_number_idx]))
 	);
 
-
-
 	android_sdk_build_tools = normalize_path(temporary_allocator(), android_sdk_build_tools, NIX_SEPARATOR_STRING);
 	android_sdk_platforms   = normalize_path(temporary_allocator(), android_sdk_platforms,   NIX_SEPARATOR_STRING);
 
 	gbString cmd = gb_string_make(heap_allocator(), "");
 	defer (gb_string_free(cmd));
 
-	TIME_SECTION("Android aapt");
-
 	String output_filename = str_lit("test");
-
 	String output_apk = path_remove_extension(output_filename);
 
-	cmd = gb_string_append_length(cmd, android_sdk_build_tools.text, android_sdk_build_tools.len);
-	cmd = gb_string_appendc(cmd, "aapt");
-	cmd = gb_string_appendc(cmd, " package -f");
-	cmd = gb_string_append_fmt(cmd, " -M \"%.*s\"", LIT(build_context.android_manifest));
-	cmd = gb_string_append_fmt(cmd, " -I \"%.*sandroid.jar\"", LIT(android_sdk_platforms));
-	cmd = gb_string_append_fmt(cmd, " -F \"%.*s.apk-build\"", LIT(output_apk));
-
-	result = system_exec_command_line_app("android-aapt", cmd);
-	if (result) {
-		return result;
+	TIME_SECTION("Android aapt");
+	{
+		cmd = gb_string_append_length(cmd, android_sdk_build_tools.text, android_sdk_build_tools.len);
+		cmd = gb_string_appendc(cmd, "aapt");
+		cmd = gb_string_appendc(cmd, " package -f");
+		cmd = gb_string_append_fmt(cmd, " -M \"%.*s\"", LIT(build_context.android_manifest));
+		cmd = gb_string_append_fmt(cmd, " -I \"%.*sandroid.jar\"", LIT(android_sdk_platforms));
+		cmd = gb_string_append_fmt(cmd, " -F \"%.*s.apk-build\"", LIT(output_apk));
+
+		result = system_exec_command_line_app("android-aapt", cmd);
+		if (result) {
+			return result;
+		}
 	}
 
 	TIME_SECTION("Android jarsigner");
-	gb_string_clear(cmd);
-
-	cmd = gb_string_append_length(cmd, build_context.ODIN_ANDROID_JAR_SIGNER.text, build_context.ODIN_ANDROID_JAR_SIGNER.len);
-	cmd = gb_string_append_fmt(cmd, " -storepass android -keystore \"%.*s\" \"%.*s.apk-build\" \"%.*s\"",
-		LIT(build_context.android_keystore),
-		LIT(output_apk),
-		LIT(build_context.android_keystore_alias)
-	);
-	result = system_exec_command_line_app("android-jarsigner", cmd);
-	if (result) {
-		return result;
+	{
+		gb_string_clear(cmd);
+
+		cmd = gb_string_append_length(cmd, build_context.ODIN_ANDROID_JAR_SIGNER.text, build_context.ODIN_ANDROID_JAR_SIGNER.len);
+		cmd = gb_string_append_fmt(cmd, " -storepass android -keystore \"%.*s\" \"%.*s.apk-build\" \"%.*s\"",
+			LIT(build_context.android_keystore),
+			LIT(output_apk),
+			LIT(build_context.android_keystore_alias)
+		);
+		result = system_exec_command_line_app("android-jarsigner", cmd);
+		if (result) {
+			return result;
+		}
 	}
 
 	TIME_SECTION("Android zipalign");
-	gb_string_clear(cmd);
+	{
+		gb_string_clear(cmd);
 
-	cmd = gb_string_append_length(cmd, android_sdk_build_tools.text, android_sdk_build_tools.len);
-	cmd = gb_string_appendc(cmd, "zipalign");
-	cmd = gb_string_appendc(cmd, " -f 4");
-	cmd = gb_string_append_fmt(cmd, " \"%.*s.apk-build\" \"%.*s.apk\"", LIT(output_apk), LIT(output_apk));
+		cmd = gb_string_append_length(cmd, android_sdk_build_tools.text, android_sdk_build_tools.len);
+		cmd = gb_string_appendc(cmd, "zipalign");
+		cmd = gb_string_appendc(cmd, " -f 4");
+		cmd = gb_string_append_fmt(cmd, " \"%.*s.apk-build\" \"%.*s.apk\"", LIT(output_apk), LIT(output_apk));
 
-
-	result = system_exec_command_line_app("android-zipalign", cmd);
-	if (result) {
-		return result;
+		result = system_exec_command_line_app("android-zipalign", cmd);
+		if (result) {
+			return result;
+		}
 	}
 
 	return 0;